Tag Archives: mtu

В выводе netstat -rn значение MSS равно 0. Что это означает?

Вывод команды netstat -nr выглядит обычно так:

Значение максимального размера сегмента (Maximum Segment Size, MSS) равное нулю в выводе команды netstat является неверным для любого типа сети. Это значение игнорируется ядром при активации сетевого подключения.

Когда MSS маршрута равен нулю, он определяется ядром исходя из размера MTU интерфейса, с которого отправляется пакет.

Чтобы посмотреть настройки интерфейса, используйте команду ifconfig:

Значение MSS вычисляется по формуле MSS = MTU – 40 байт. То есть, если MTU интерфейса равен 1500 байтам, то вычисленный ядром размер MSS будет равен 1460 байтам. Это предлагаемое значение MSS (advertised MSS) для TCP-соединения, оно используется, чтобы сообщить другой стороне о предпочитаемом размере MSS. Когда устанавливается TCP-соединение, значение MSS отправляется в SYN-пакете.

MSS маршрута (который выводится командой netstat -rn) может использоваться для переопределения предлагаемого значения MSS, которое вычисляется ядром. Например, если мы хотим принудительно задать MSS равное 1200 байтам для всех соединений с сетью 192.168.1.0/24, можно использовать команду ip:

Можно также задать значение MSS для конкретного хоста:

Отметим, что это влияет лишь на пакеты, которые мы получаем, но не отправляем: значение MSS — это предлагаемое значение, которое используется для информирования удалённой системы о том, что мы можем обработать.

MSS пакетов, которые отправляем мы сами, может определяться аналогичным путём, хотя и не всегда, поскольку параметр предлагаемого MSS является необязательным. Red Hat Enterprise Linux указывает значение MSS в пакетах SYN и SYN-ACK, тогда как другие реализации стека TCP/IP могут его не указывать.

В общем, если предлагаемое значение MSS получено не было, то используется минимальное значение MSS, равное 536 (MTU 576 – 40 байт = 536).

Также обратите внимание, что, кроме значений MTU и MSS маршрутов, в Red Hat Enterprise Linux реализована технология определения MTU для маршрута (path MTU discovery) — это простой протокол, который пытается автоматически определить оптимальный размер MTU для TCP-соединения.

Если автоопределение MTU маршрута работает корректно, то необходимость изменять MTU интерфейса или значение MSS маршрута возникает крайне редко.