中低端路由器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报文无效。
三次握手:(建新连接)
1. (B) --> [SYN] --> (A)
2. (B) <-- [SYN/ACK] <--(A)
3. (B) --> [ACK] --> (A)
1. SYN=1,ACK=0
2. SYN=1,ACK=1
3. SYN=0,ACK=1
四次握手:(关闭连接)
1. (B) --> ACK/FIN --> (A)
2. (B) <-- ACK <-- (A)
3. (B) <-- ACK/FIN <-- (A)
4. (B) --> ACK --> (A)
*SYN:同步标志
*ACK:确认标志
*RST:复位标志
*URG:紧急标志
*PSH:推标志
*FIN:结束标志