2013-08-29 7 views
1

У меня есть pcap различных типов трафика по 802.11 (wifi) по udf. Udp (или, точнее, IP) фрагментирует wifi-пакеты из-за MTU. В настоящее время я использую SharpPcap для чтения и попытки доступа к Wi-Fi-трафику, и я столкнулся с проблемой вручную собрать пакеты udp.Повторная сборка фрагментированного пакета UDP

Я вижу два варианта, и я хочу проверить, возможны ли они, лучшие решения или есть что-то, что я пропускаю. В конечном счете, я получаю доступ к прямому каналу (в том же формате, через Wi-Fi UDP), который передается мне по UDP (тот, который был упомянут), но для тестирования я должен играть с pcaps.

Я могу либо вручную загрузить файл pcap, собрать его с помощью смещения фрагмента и идентификатора пакета, имея конечный автомат, отслеживающий все пакеты. Или я могу попытаться избежать повторной сборки (я полагаю, что сокет должен сделать это для меня) загрузите файл pcap, выведите его в исходный сокет на локальном хосте и послушайте сокет UDP на локальном хосте. Я избегаю первого, пока это действительно необходимо (не так ли?), А второе похоже, что оно должно работать, но не делает этого. У меня есть все, что настроено, но пакеты все равно получают и получают по одному, как массивы байтов, - и фрагментируются.

Может ли это быть из-за того, что на уровне IP по-прежнему имеется исходный захваченный IP-адрес и порт (который отличается)? Я попытался изменить их перед отправкой, хотя я не изменил контрольную сумму, и она все еще была фрагментирована.

ответ

1

Заберись на свой старый вопрос, ища решение моей собственной дефрагментации проблемы.

Способ, которым я это понимаю - поскольку вы выполняете чтение/захват пакетов, вы должны сами дефрагментировать IP-пакеты. Если вы являетесь фактическим приложением в сети, IP-стек вашей ОС сделает это за вас, и вы сможете прочитать данные как есть. Но захват пакетов происходит до этой повторной сборки. То, что вы видите, это пакеты, когда они путешествуют по проводу (или в воздухе в вашем случае).

Дефрагментация в теории относительно проста - IP-пакеты, имеющие одинаковый идентификатор, IP-адрес источника/получателя и тип протокола, принадлежат друг другу. Первый пакет будет иметь смещение фрагментации 0 и поле «Дополнительные фрагменты», установленное в 1. Следующие пакеты (если они есть) будут иметь «Больше фрагментов», установленный в 1, и ненулевое смещение. Окончательный пакет будет иметь ненулевой сдвиг и не будет установлен «Больше фрагментов».

Избавьтесь от дубликатов как-нибудь, закажите их смещением. Полезная нагрузка каждого пакета переходит в конечный буфер в пакете. ФрагментацияOffset * 8. Кроме того, тривиально рассчитать размер финального пакета, используя эту информацию.

Более подробное объяснение можно найти здесь: http://en.wikipedia.org/wiki/IPv4#Reassembly

Я знаю, что вы, вероятно, переехал на давным-давно, но, возможно, это может помочь кому-то еще на поиск той же самой информации.