mtu – Ivan Pesin https://pesin.space/blog Articles & Translations Wed, 19 Oct 2016 02:08:18 +0000 en-US hourly 1 https://wordpress.org/?v=5.1.1 В выводе netstat -rn значение MSS равно 0. Что это означает? /blog/2009/08/%d0%b2-%d0%b2%d1%8b%d0%b2%d0%be%d0%b4%d0%b5-netstat-rn-%d0%b7%d0%bd%d0%b0%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-mss-%d1%80%d0%b0%d0%b2%d0%bd%d0%be-0-%d1%87%d1%82%d0%be-%d1%8d%d1%82%d0%be-%d0%be%d0%b7%d0%bd/?utm_source=rss&utm_medium=rss&utm_campaign=%25d0%25b2-%25d0%25b2%25d1%258b%25d0%25b2%25d0%25be%25d0%25b4%25d0%25b5-netstat-rn-%25d0%25b7%25d0%25bd%25d0%25b0%25d1%2587%25d0%25b5%25d0%25bd%25d0%25b8%25d0%25b5-mss-%25d1%2580%25d0%25b0%25d0%25b2%25d0%25bd%25d0%25be-0-%25d1%2587%25d1%2582%25d0%25be-%25d1%258d%25d1%2582%25d0%25be-%25d0%25be%25d0%25b7%25d0%25bd Fri, 14 Aug 2009 07:01:49 +0000 http://www.n-ix.com/ipesin/?p=281

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

# netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         192.168.0.254   0.0.0.0         UG        0 0          0 eth0

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

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

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

# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0D:61:93:55:3E
          inet addr:192.168.0.22  Bcast:172.168.0.255  Mask:255.255.255.0
          UP 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:

ip route add 192.168.1.0/24 dev eth0 advmss 1200

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

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 маршрута возникает крайне редко.

]]>