Как собрать сегмент tcp?

Сейчас я занимаюсь разработкой проекта с использованием winpcap. Поскольку я знаю, что прослушиваемые пакеты обычно являются фрагментированными пакетами.

как собрать эти сегменты TCP?.. какие-либо идеи, предложения или учебные пособия доступны?..

я полагаю, что это единственный способ просмотреть заголовок HTTP...

Спасибо!..

5 ответов

Решение

tcp - это протокол потока байтов. последовательность байтов, отправленных вашим приложением http, инкапсулируется в сегменты данных tcp, и поток байтов воссоздается до того, как данные будут доставлены в приложение на другой стороне. поскольку вы обращаетесь к сегментам данных tcp с помощью winpcap, вам нужно перейти к части данных сегмента. заголовок tcp имеет фиксированную длину 20 байтов + необязательную часть, которую необходимо определить с помощью API-интерфейса winpcap.

длина части данных в сегменте tcp определяется путем вычитания длины заголовка tcp (полученной из поля в сегменте tcp) и длины заголовка ip (из поля в дейтаграмме ip, которая инкапсулирует сегмент tcp) из общей длины (получено из другого поля в датаграмме ip).

так что теперь у вас есть общая длина сегмента и длина части данных внутри сегмента. Таким образом, вы знаете смещение, где начинается HTTP-запрос данных.

смещение

total length-length of data part
or
length of ip-header + length of tcp header

я не использовал winpcap. так что вам придется выяснить, как получить эти поля с помощью API.

Кроме того, IP-дейтаграммы могут быть дополнительно фрагментированы, но я ожидаю, что вам предоставляются только повторно собранные дейтаграммы с использованием этого API. Вы готовы идти!

Нет такой вещи, как фрагмент TCP. Протокол IP имеет фрагменты. TCP - это потоковый протокол. Вы можете собрать поток в его предполагаемом порядке, следуя порядковым номерам обеих сторон. Каждый TCP-пакет выходит на уровень IP и может быть фрагментирован там. Вы можете собрать каждый пакет, собрав все фрагменты и следуя за смещением фрагмента от заголовка.
Вся необходимая информация находится в заголовках. Статьи в Википедии довольно полезны для объяснения того, что представляет собой каждое поле

http://en.wikipedia.org/wiki/TCP_header
http://en.wikipedia.org/wiki/IPv4

PcapPlusPlus предлагает эту возможность "из коробки" для всех основных ОС (включая Windows). Посмотрите пример TcpReassembly, чтобы увидеть рабочий код и документацию по API, чтобы понять, как использовать функцию повторной сборки TCP.

В зависимости от того, чей трафик вы пытаетесь пассивно собрать, вы можете столкнуться с некоторыми методами обфускации TCP, разработанными для того, чтобы сбить с толку людей, пытающихся сделать именно то, что вы пытаетесь сделать. Ознакомьтесь с этой статьей о различных способах сборки операционной системы.

libtins предоставляет классы для выполнения сборки потоков TCP на очень высоком уровне, так что вам не нужно беспокоиться о внутренностях TCP для этого.

Другие вопросы по тегам