path mtu discovery


path mtu discovery — механизм, благодаря которому роутеры могут вычисляют оптимальный размер пакета для сегмента сети.



path mtu discovery в IP сетях


Маршрутизация в IP сетях осуществляется с учетом MTU — максимального размера пакета, который может приниматься определенным хостом. Значение задается для каждого интерфейса.



Пакеты разбиваются и передаются по сети. Получатель собирает их.

Для Ethernet стандартное значение MTU — 1500 байт.

При этом MTU может изменяться на сетевом оборудовании его администратором.



path mtu discovery — механизм, благодаря которому роутеры могут вычисляют оптимальный размер пакета для сегмента сети.

Заранее MTU для интерфейсов всех маршрутизаторов, которые задействуются при доставке пакета с хоста A до хоста B, неизвестен.



Он установлен в 1500 байт, отправка осуществляется пакетами такого размера. Если на одном из роутеров используется меньшее значение он возвращает соответствующее ICMP сообщение. Пакет он не перенаправляет. ICMP ответ получает начальный отправитель, он уменьшает размер пакета и отправляет данные повторно. Так процесс повторяется пока не будет найден наибольший размер пакета, который может быть передан всеми роутерами на пути.



ICMP ответ имеет вид: ICMP 172.16.5.3 unreachable — need to frag (mtu 1400). Он отправляется если узел не может фрагментировать пакет (установлен флаг DF — don't fragment)



Увидеть процесс обмена пакетами можно записав трафик при помощи какого-либо анализатора пакетов — например, tcpdump



Если на одном из роутеров запретить ICMP трафик (что часто делают провайдеры) — система перестанет работать. Возникнет Path MTU Discovery Black Hole.  Отправитель перестанет получать обратную связь и будет продолжать слать пакеты стандартного размера, которые один из узлов обработать не в состоянии.

Ссылка на RFC



Задание значения в iptables


Чтобы исправить ситуацию без участия провайдера можно задать на роутере опцию, благодаря которой будет автоматически подбираться размер MSS

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \-j TCPMSS --clamp-mss-to-pmtu



Также его можно задавать вручную вычисляя нужное значение подбором

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS –set-mss 1360



Вместо MTU здесь используется MSS.

Сказать спасибо