Original article: http://kbase.redhat.com/faq/docs/DOC-6302.pdf
Translated by Ivan Pesin, August 2009
Вывод команды netstat -nr
выглядит обычно так:
123456 # netstat -nrKernel IP routing tableDestination Gateway Genmask Flags MSS Window irtt Iface192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth00.0.0.0 192.168.0.254 0.0.0.0 UG 0 0 0 eth0
Значение максимального размера сегмента (Maximum Segment Size, MSS) равное нулю в выводе команды netstat
является неверным для любого типа сети. Это значение игнорируется ядром при активации сетевого подключения.
Когда MSS маршрута равен нулю, он определяется ядром исходя из размера MTU интерфейса, с которого отправляется пакет.
Чтобы посмотреть настройки интерфейса, используйте команду ifconfig
:
12345 # ifconfig eth0eth0 Link encap:Ethernet HWaddr 00:0D:61:93:55:3Einet addr:192.168.0.22 Bcast:172.168.0.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1...
Значение 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
:
1 ip route add 192.168.1.0/24 dev eth0 advmss 1200
Можно также задать значение MSS для конкретного хоста:
1 ip route add 192.168.0.212 dev eth0 advmss 1200
Отметим, что это влияет лишь на пакеты, которые мы получаем, но не отправляем: значение 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 маршрута возникает крайне редко.