Я теперь разрабатываю проект с помощью winpcap.. поскольку я знал, что сниффинговые пакеты являются обычно фрагментированными пакетами.
как повторно собрать этот TCP segements?.. какие-либо идеи, предложение или доступные учебные руководства?..
это, которое я принимаю, чтобы быть единственным способом, которым я могу просмотреть HTTP-заголовок...
спасибо!..
tcp - это протокол потока байтов. Последовательность байтов, отправляемая вашим http-приложением, инкапсулируется в сегменты данных tcp, и поток байтов воссоздается, прежде чем данные будут доставлены приложению на другой стороне. Поскольку вы получаете доступ к сегментам данных tcp с помощью winpcap, вам нужно перейти к части данных сегмента. заголовок tcp имеет фиксированную длину 20 байт + дополнительная часть, которую вам нужно определить с помощью winpcap api.
длина части данных в сегменте 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#Packet_structure
http://en.wikipedia.org/wiki/IPv4#Header
В зависимости от того, чей трафик вы пытаетесь пассивно собрать, вы можете столкнуться с некоторыми техниками обфускации TCP, призванными запутать людей, пытающихся сделать именно то, что пытаетесь сделать вы. Посмотрите эту статью о различных моделях поведения пересборки в операционных системах.