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