Я разрабатываю клиент и сервер 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 должен его фрагментировать.
Будет ли слой IP по-прежнему фрагментировать пакеты, если обнаружение MTU включено? – Konerak
Разве бит DF не предотвращает эту фрагментацию? – CodesInChaos
Offcourse. Итак, отправляющий хост ожидает, что он обнаружит MTU? Или библиотека подкладывает для него это? – Konerak