Я пишу приложение, которое работает с сетью. Для выполнения некоторых тестов мне нужно воспроизвести поток, который у меня был накануне. Но при этом нельзя останавливать текущий рабочий слушатель. Я также не могу переписать существующую программу, чтобы сохранить входящий поток. Для решения своей задачи я решил использовать tcpdump.
Я запускаю tcpdump на конечном компьютере с помощью команды:
tcpdump -w capture.cap -n "dst host host.domain.com and port 5555"
Когда я читаю capture.cap с помощью tcpick или scapy. Я вижу, что все полезные данные, длина которых превышает 1472 байта, обрезаются до длины 1472. Но в заголовке по-прежнему записана исходная длина пакета. Насколько я могу судить, пакет UDP разделяется на несколько, а затем снова объединяется. Но tcpdump, вероятно, отфильтрует все пакеты без заголовка (который должен появиться только в первом пакете)
Есть ли способ сбросить полные пакеты UDP?
Если IP-пакет больше, чем MTU сетевого канала, по которому он отправляется, IP фрагментирует его на IP-пакеты, которые могут поместиться в сети; это делается на уровне IP, а не на уровне UDP.
MTU Ethernet обычно составляет 1500 байтов (максимальный размер пакета Ethernet составляет 1518, который включает 14 байтов заголовка, 1500 байтов полезной нагрузки и 4 байта FCS). Заголовок IPv4 составляет 20 байтов, если у него нет параметров, а заголовок UDP - 8 байтов, поэтому максимальный размер полезной нагрузки UDP составляет 1500-28 = 1472.
Так IP разбивает пакет на два или более фрагмента и повторно собирает их на принимающей машине.
См. Соответствующий вопрос для обсуждения того, почему tcpdump не захватывает какие-либо фрагменты, кроме первого.
Использование -s 0 гарантирует захват всего пакета / кадра. Если он фрагментирован, вы узнаете об этом из анализа дампа.
Попробуйте wirehark для анализа графического интерфейса данных pcap. Это раскрасит вывод и т. Д.