Как правильно прочитать сообщение HTTP Post, сегментированное на два TCP-сегмента? - PullRequest
0 голосов
/ 16 ноября 2018

Когда я выполняю следующий код Python для файла pcap:

if tcp.dport == 80:    
   try:
      http=dpkt.http.Request(tcp.data)
   except (dpkt.dpkt.NeedData):
      continue
   except (dpkt.dpkt.UnpackError):
      continue
if http.method == 'POST':
   print('POST Message')

Пакеты, подобные следующим, создают проблему: enter image description here

Этиодно сообщение HTTP Post, сегментированное на два TCP-сегмента, каждое из которых отправляется в отдельном пакете.Тем не менее, поскольку первый сегмент является только TCP, а второй распознается как HTTP, кажется, что когда dpkt.http.Request пытается прочитать первый сегмент как HTTP, он терпит неудачу.

Пока проблем нет.Это нормально, чтобы потерпеть неудачу, поскольку на самом деле это не полное HTTP-сообщение.Однако проблема в том, что он, похоже, вообще не читает второй сегмент (« POST Message » не печатается) !!!Второй сегмент полностью игнорируется, как будто он не существует !!!Единственное возможное объяснение этого заключается в том, что dpkt автоматически считывает второй сегмент сразу, поскольку он распознает, что они оба являются сегментами для одного и того же сообщения.

Проблема заключается в том, что оба сегмента TCP читаются одновременно (послевыше предположения), полученный tcp.data не распознается как пакет HTTP, скорее он все еще распознается как TCP только потому, что первый сегмент сообщения является пакетом только для TCP.

Итак, что мне делать считать заголовок HTTP и данные такого файла pcap?

1 Ответ

0 голосов
/ 16 ноября 2018

dpkt работает только на уровне пакета.dpkt.http.Request ожидает полный HTTP-запрос как ввод, а не только часть в текущем пакете.Это означает, что вы должны собирать входные данные со всех пакетов, принадлежащих соединению, то есть повторно собирать поток данных TCP.

Повторная сборка не просто объединяет пакеты, но также гарантирует, что нет потерянных пакетов, нет дубликатов и чтопакеты собираются в правильном порядке, который может не соответствовать порядку на проводе.По сути, вам нужно сделать все, что будет делать ядро ​​ОС, прежде чем помещать извлеченную полезную нагрузку в буфер сокетов.

Для некоторых примеров, как это можно сделать, см. Follow HTTP Stream (с распаковкой) .Обратите внимание, что пример там вслепую предполагает, что пакеты уже в порядке, полные и без дубликатов - и предположение, которое не гарантируется в реальной жизни.

...