From:http://blog.chinaunix.net/u2/72886/showart_1802033.html
中低端路 由器 tcp mss 的实现原理 为何经常要在内网口和外网口都要配置 tcp mss 值呢 ?
PC1(192.168.0.1) ――― Router ―――― Internet ―――- www server(238.135.1.1)
建立 tcp 连接的两端在三次握手时会协商 tcp mss 大小,具体如下:
pc1 发 出 syn 报文,其中 option 选项填充的 mss 字段一般为 1460 ,同样 www server 收到 syn 报文后,会发送 syn + ack 报文应答, option 选项填充的 mss 字段也为 1460 ;协商双方会比较 syn 和 syn+ack 报文中 mss 字段大小,选择较小的 mss 作为发送 tcp 分片的大小。通过比较,协商双方的 tcp mss 都是 1460 。
对于涉及 mpls l3vpn 、 pppoe + nat 、 ipsec 、 l2tp 、 gre 等组网,通常由于报文太大需要分片,一般可以 通过设置 tcp mss 解 决。
针对上例说明 tcp mss 如何实现
1、
假设在路由器内网口配置 tcp mss 1200
a)
路由器收到 www server 的 syn + ack 报文时会修改 option 选项中的 mss 字段为 1200 ,然后再转发给 PC1 , PC1 收到报文后认为对端的 tcp mss 为 1200 ,这样 PC1 发送数据给 www server 时会以 1200 作为分片大小;但路由器修改 tcp mss 为 1200 的操作 www server 是不知道的,因此 www server 还会以 1460 作为分片大小发送报文。
2、
假设再路由器外网口配置 tcp mss 1200
a)
路由器收到 PC1 的 syn 报文时会修改 option 选项中的 mss 字段为 1200 ,然后再转发给 www server ,同样 www server 发送数据给 PC1 时会以 1200 作为分片大小;同样 PC1 不知道路由器修改 tcp mss 为 1200 ,因为 PC1 还会以 1460 作为分片大小发送报文。
3、
因此在实现双向大包传输时需要在内外网同时修改 tcp mss
综上所述: 在路由器接口上配置的 tcp mss 命令仅对出接口方向的 syn 报文和 syn + ack 报文有效,对于入接口方向的 syn 和 syn + ack 报文无效。