Я разрабатываю клиент и сервер 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 должен его фрагментировать.