Как найти самый большой пакет UDP, который я могу отправить без фрагментации? - PullRequest
52 голосов
/ 23 мая 2009

Мне нужно знать, какой самый большой UDP-пакет я могу отправить на другой компьютер без фрагментации.

Этот размер обычно известен как MTU (максимальная единица передачи). Предположительно, между 2 компьютерами будет много маршрутизаторов и модемов, которые могут иметь разные MTU.

Я прочитал, что реализация TCP в Windows автоматически находит максимальный MTU в пути.

Я тоже экспериментировал и обнаружил, что максимальный MTU от моего компьютера до сервера составлял 57712 байт + заголовок. Все, что выше этого, было отброшено. Мой компьютер подключен к локальной сети. Разве MTU не должен составлять около 1500 байт?

Ответы [ 5 ]

23 голосов
/ 23 мая 2009

Следующее не отвечает на ваш вопрос напрямую, но вы можете найти его интересным; это говорит о том, что IP-пакеты могут быть разобраны / повторно собраны, и, следовательно, больше, чем предел на базовом носителе (например, 1500-байтовый Ethernet): Устранить проблемы фрагментации IP, MTU, MSS и PMTUD с GRE и IPSEC


Еще по этой теме:

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

Нет, похоже, реализовано : см., Например, Часто задаваемые вопросы программиста Winsock Примеры: Ping: метод Raw Sockets .

Итак, чтобы обнаружить MTU, сгенерируйте ping-пакеты с флагом «не фрагментировать».

Может быть, есть более простой API, чем этот, я не знаю; но я надеюсь, что дал вам понять базовый протокол [ы].

12 голосов
/ 24 мая 2009

В дополнение ко всем предыдущим ответам цитируем classic :

IPv4 и IPv6 определяют минимальный размер буфера повторной сборки , минимальный размер дейтаграммы, который, как мы гарантируем, должна поддерживать любая реализация. Для IPv4 это 576 байтов. IPv6 увеличивает это до 1280 байтов.


Это в значительной степени означает, что вы хотите ограничить размер дейтаграммы до 576, если вы работаете через общедоступный Интернет и контролируете только одну сторону обмена - это то, что делает большинство стандартных протоколов на основе UDP.

Также обратите внимание, что PMTU является динамическим свойством пути. Это одна из вещей, с которой TCP работает для вас. Если вы не готовы повторно реализовать логику последовательности, синхронизации и повторной передачи, используйте TCP для любой критически важной сети. Тест, тест, профиль, т. Е. докажите , что TCP является вашим узким местом, только тогда рассмотрите UDP.

3 голосов
/ 14 января 2014

Это интересная тема для меня. Возможно, некоторые практические результаты могут быть интересны при доставке объемных данных UDP через реальный Интернет через UDP, и при скорости передачи 1 пакет в секунду данные продолжают увеличиваться с минимальной потерей пакетов до примерно 2К. Из-за этого вы начинаете сталкиваться с проблемами, но мы регулярно доставляем 1600+ байтовых пакетов без проблем - это по мобильным сетям GPRS и WAN по всему миру. При ~ 1К при условии, что сигнал стабилен (его нет!), Вы получаете низкие потери пакетов.

Интересно, что это не странный пакет, а часто шквал пакетов в течение нескольких секунд - вероятно, именно поэтому VoIP-звонки просто иногда прерываются.

2 голосов
/ 23 мая 2009

Ваш собственный MTU доступен в реестре , но на практике MTU идет к наименьшему MTU на пути между вашей машиной и пунктом назначения. Его переменная и может быть определена только опытным путем. Существует ряд RFC , показывающих, как его определить.

Внутренние сети могут иметь очень большие значения MTU, поскольку сетевое оборудование обычно однородно или, по крайней мере, централизованно администрируется.

0 голосов
/ 31 октября 2018

Для приложений UDP вы должны обрабатывать сквозной MTU самостоятельно, если хотите избежать фрагментации IP-адресов или потери пакетов. Рекомендуемый подход для любого приложения - сделать все возможное, чтобы использовать PMTU для выбора максимальной датаграммы или отправлять датаграммы <минимальный PMTU </p>.

https://tools.ietf.org/html/rfc5405#section-3.2

Руководство по использованию одноадресного UDP для разработчиков приложений "НЕ СЛЕДУЕТ отправлять дейтаграммы, которые превышают PMTU, ДОЛЖНЫ обнаруживать PMTU или отправлять дейтаграммы <минимум PMTU </p>

Появится окно настроек и доступа к информации PMTU через интерфейс основных опций сокета:

Вы можете убедиться, что обнаружение PMTU включено через IP_MTU_DISCOVER, и вы можете прочитать MTU через IP_MTU.

https://docs.microsoft.com/en-us/windows/desktop/winsock/ipproto-ip-socket-options

...