UDP-пакет больше 1500 байт отброшен - PullRequest
3 голосов
/ 02 января 2011

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

Я проверил его на двух машинах linux (одна имеет гигабитную карту Ethernet, а другая - быструю 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 должен его фрагментировать.

Ответы [ 3 ]

8 голосов
/ 02 января 2011

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

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

2 голосов
/ 02 января 2011

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

1 голос
/ 04 января 2011

не правильно для запуска хостов с разными MTU интерфейса в одной подсети 1 .

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

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


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

...