проблема с пересборкой tcp

Я получаю сегменты пакетов в двух частях. Я могу видеть это в wireshark, поскольку tcp повторно собран. После поиска в Google я узнал о том, что бит фрагмента не установлен для фрагментированных данных. но он не установлен даже для фрагментированных данных. я использую Библиотека java jnetpcap для получения пакетов, но я не могу понять, в каких полях и флагах я должен ждать повторной сборки tcp-пакета. Иногда пакет приходит сразу, если я запускаю на виртуальной машине, но иногда он фрагментирован. Мне нужно способ разобраться с повторной сборкой пакета.


person saifjunaid    schedule 09.11.2014    source источник
comment
Конечно, он «не установлен даже для фрагментированных данных». В противном случае данные не могли быть фрагментированы.   -  person user207421    schedule 10.11.2014


Ответы (1)


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

Бит «Не фрагментировать» — это бит IP. Сегментация пакетов, которую вы видите, происходит на уровне TCP; эта сегментация полностью отделена от фрагментации, которая происходит на уровне IP.

Повторную сборку IP довольно легко выполнить в программе анализа пакетов; все данные, необходимые для повторной сборки фрагментов, доступны в заголовках IP-протокола фрагментов.

Повторная сборка TCP НЕ так проста. Абстракция, которую TCP предоставляет протоколам, работающим поверх TCP, представляет собой упорядоченный поток октетов (байтов); границ пакетов нет. Пакет или другая многобайтовая структура, отправленная по протоколу TCP, может быть произвольно разбита на сегменты TCP в любой точке пакета.

Это означает, что повторная сборка TCP в программе анализа пакетов требует взаимодействия кода, понимающего сегменты TCP, и кода, понимающего протокол, работающий поверх TCP. См., например, подпрограмму tcp_dissect_pdus() в файле packet-tcp.c Wireshark и код в ее файле req_resp_hdrs.c.

person Community    schedule 09.11.2014
comment
если неполные пакеты прибывают в пункт назначения, может быть способ определить, что его следующий пакет должен прийти позже. как мы можем его идентифицировать? я видел этот ответ stackoverflow.com/questions/4481914/reassembling-tcp-segments .Но когда я вижу это в wireshark, он не получает seq no, как указано в ответе. - person saifjunaid; 10.11.2014
comment
Ответ на вопрос Использует ли Wireshark Ack, чтобы узнать, какие сегменты принадлежат друг другу? НЕТ. Как я уже сказал, TCP сам по себе предоставляет информацию NO, чтобы указать, какие байты в потоке байтов TCP являются частью пакетов более высокого уровня; не только пакет более высокого уровня может быть разделен между двумя отдельными сегментами TCP, но и сегмент TCP может содержать часть или все несколько пакетов. Пока вы не поймете, почему невозможно выполнять повторную сборку только на основе данных в заголовке TCP, вы не сможете написать код для повторной сборки пакетов для протоколов, работающих поверх TCP. - person ; 10.11.2014