2011-01-02 2 views
3

Я разрабатываю клиент и сервер tftp, и я хочу динамически выбирать размер полезной нагрузки udp для повышения производительности передачи.Пакет UDP, превышающий 1500 байт

Я протестировал его с помощью двух Linux-машин (один из них имеет гигабитную сетевую карту, а другой - быстрый Ethernet-порт). Я изменил MTU гигабитной карты на 2048 байт и оставил другую до 1500.

Я использовал setsockopt(sockfd, IPPROTO_IP, IP_MTU_DISCOVER, &optval, sizeof(optval)), чтобы установить флаг MTU_DISCOVER на номер IP_PMTUDISC_DO.

Из того, что я прочитал, этот параметр должен установить бит DF на один, и поэтому должно быть возможно найти минимальный MTU сети (MTU хоста с самым низким MTU). Однако эта вещь только дает мне ошибку, когда я отправляю пакет, размер которого больше MTU машины, с которой я отправляю пакеты.

Также другая машина (сервер в этом случае) не получает большие пакеты (сервер имеет MTU 1500). Все пакеты UDP отбрасываются, единственный способ - отправить пакеты из 1472 байт.

Почему хозяева делают это? Из того, что я прочитал, если я отправляю пакет, превышающий MTU, слой ip должен его фрагментировать.

+0

Будет ли слой IP по-прежнему фрагментировать пакеты, если обнаружение MTU включено? – Konerak

+3

Разве бит DF не предотвращает эту фрагментацию? – CodesInChaos

+0

Offcourse. Итак, отправляющий хост ожидает, что он обнаружит MTU? Или библиотека подкладывает для него это? – Konerak

ответ

2

Этот параметр «DF bit», который вы устанавливаете, обозначает «Do not Fragment». Не следует ожидать, что уровень IP будет фрагментировать пакеты, когда вы им это не сказали.

+0

Да, это флаг Do not Fragment. –

8

Я не вижу проблемы. Вы устанавливаете бит «не фрагментировать», и вы отправляете пакет меньше MTU отправляющего хоста, но больше, чем MTU принимающего хоста. Конечно, здесь никто не будет фрагментировать (это нарушит бит DF). Вместо этого отправляющий узел должен вернуть ICMP-сообщение.

Edit: IP указывает, что тип ICMP сообщение об ошибке 3 (адресат недостижим) код 4 (фрагментация Обязательный но DF установлен бит) передается в исходный хост в точке, где произошло бы фрагментация. Уровень TCP обрабатывает это самостоятельно для обнаружения PMTU. В сокетах без подключения Linux сообщает об ошибке в очереди ошибок сокета, если активирована опция IP_RECVERR; см. ip(7).

+0

ICMP type 3 code 4 означает «Требуется фрагментация и установлен флаг DF». Как вы слушаете это сообщение в Linux, я не уверен. Я считаю, что полезная нагрузка ICMP содержит достаточную информацию для сопоставления с конкретным сокетом, и в этом случае вы можете получить ее как данные OOB, если вы включили это. Или будущий 'sendto()' вызов может завершиться с 'ECONNRESET'. –

+0

@ Konerak: см. Мое редактирование. –

+1

Спасибо за ответ. Поэтому я должен установить флаг IP_RECVERR, а затем выполнить поиск очереди ошибок, правильно? Я просто попытался проверить, отправляет ли sendto ошибку, и в этом случае я контролирую, если ошибка «Сообщение слишком длинная» и поэтому уменьшает размер дейтаграммы. Из того, что вы говорите, дело не срабатывает, верно? –

1

Это не правильно запускать хосты с различными интерфейсом МТУС на одной и той же подсети .

Это неправильная конфигурация хоста/сети, и в этом случае ожидается, что обнаружение MTU пути IP не будет корректно работать.

Если вы хотите протестировать обнаружение MTU пути вашего приложения, вам необходимо настроить несколько подсетей, подключенных маршрутизатором , с различными MTU. В этой ситуации маршрутизатор - это устройство, которое получит несоответствие MTU и отправит обратно ICMP «Ошибка фрагментации».


1. Ну, технически же широковещательный домен.
2. Устройства, продаваемые как «домашние маршрутизаторы», действительно являются маршрутизаторами/коммутаторами - они маршрутизируют между WAN и локальной сетью, но переключаются между Ethernet-портами в локальной сети. Этот не является, достаточным для разделения сетей с различными MTU.

+0

Спасибо за ответ. Таким образом, «Требуемая фрагментация» относится к уровню IP. Я должен использовать маршрутизатор или коммутатор уровня 3 для работы. Я не знал, что домашние маршрутизаторы это dsl routers + переключатели уровня 2, я думал, что они смогут работать как переключатели уровня 3 для lan. –

+0

@Alex Vitale: Да, это правильно. Вы можете настроить машину с двумя сетевыми картами как маршрутизатор для тестирования. – caf

Смежные вопросы