ОК, я разобрался, как это сделать (хитро, но он выполняет свою работу).
Легко убрать заголовки Ethernet, IP и TCP, оставив вас с «необработанным» сообщением данных. Заглянув внутрь сообщения, легко определить, является ли это началом пакета HTTP, по запросу «HTTP / 1.1 ...» в начале пакета. Это указывает на то, что пакет является началом потока HTTP / большего пакета / чего угодно. Вы также можете выполнить простой анализ, чтобы прочитать поле «Content-Length», которое является общей длиной всего пакета HTTP.
Вы также можете использовать IP-адреса источника / назначения и номера портов, чтобы сформировать уникальный идентификатор для ссылки. Поэтому после получения пакета заголовка обратите внимание на эти 4 вещи (SRCIP, SRCPORT, DESTIP, DESTPORT). В следующий раз, когда вы получите пакет, соответствующий этой комбинации порта / ip, вы можете проверить, является ли это следующей частью HTTP-пакета. Вы можете использовать порядковые номера для некоторой проверки и, возможно, других вещей, но обычно пакеты в порядке, так что все в порядке. Я думаю, что новый порт открывается для каждого потока HTTP, поэтому вы не должны получать случайные пакеты, которые не являются частью потока, но это может быть область, подверженная ошибкам.
В любом случае, как только вы получили этот пакет, еще раз уберите заголовки и получите необработанное сообщение. Добавьте его в уже известную часть сообщения. Если общая длина полученного сообщения равна длине, считанной из поля «Content-Length», пакет завершен!
Этот метод, очевидно, подвержен огромному количеству ошибок, но мне не нужен чрезвычайно надежный способ сделать это. Я думал, что отвечу на свой вопрос, если кто-то еще столкнется с этой проблемой в будущем! Удачи тебе с нюханием: D