Как собрать сегмент 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 для этого.