目录

为什么要有MSS:

什么是MSS:

TCP建立的3次握手过程

MSS的协商

1)客户端和服务端网络直通的,中间不经过路由器(则无IP转发)

2)客户端和服务端之前通过路由路连接(通常的网络结构)

例外:


为什么要有MSS:

我们都知道,如果TCP/UDP往IP层发送数据时,因为物理网络层一般要限制每次发送数据帧的最大长度。所以IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果太长了一次发送不下(超过MTU)则需要则进行分片。因为路由器工作在IP层,负责IP报文的转发,所以分片可以发生在原始发送端主机上,也可以发生在中间路由器上。

UDP无法避免分片(除非应用层知道路径MTU并控制UDP报文大小),TCP则通过MSS协商来避免分片发生。

什么是MSS:

最大报文段长度(MSS: Maximum Segment Size)表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。

通常TCP通信的双方协商这个值,以避免TCP分片。一般说来,如果没有分段发生, MSS还是越大越好。报文段越大允许每个报文段传送的数据就越多,相对IP和TCP首部/有效载荷payload的比率就越低,就有更高的网络利用率。避免分片还能减少IP报文数量(每个TCP 分片都会对应一个IP报文),则减少了路由查询,IP/TCP头开销等等网络资源。MSS值通常设置为外出接口上的MTU长度减去固定的IP首部和TCP首部长度。对于一个以太网, MSS值可达1460字节(1500-20-20)。

这里我们主要要讲的是在TCP通信过程中,本次通信的参与方如何协商出MSS。

这里先要复习一下

TCP建立的3次握手过程

第一步:客户端给服务端发送一个SYN请求给服务端

第二步:服务端收到SYN请求后,回复一个SYN-ack给客户端,确认第一步的SYN请求的同时,向客户端发起一个SYN请求

第三步:客户端收到SYN-ack后,回复一个ack给服务端,确认第二步里的SYN请求部分

这样就完成了TCP的建立。

MSS的协商

MSS的协商就是在TCP建立的这三步中完成的,SYN和SYN-ACK中分别带上本端(即发送端)最大能接收的MSS的大小,

下面分成二种网络类型来说:

1)客户端和服务端网络直通的,中间不经过路由器(则无IP转发)

第一步:客户端在发送出去的SYN中带上本端(客户端)最大能接收的MSS的长度为1200字节

第二步:服务端收到这个ACK后,在发回的SYN-ACK中带上本端(服务端)最大能接收到MSS的长度为1400,

              然后服务端会取“客户端的最大能接收的MSS(SYN中收到的)”和“服务端自己的最大能接收的MSS(SYN-ACK中发送的)”这二者中的较小的值(1200)作为服务端发送MSS

第三步:客户端收到这个SYNC-ACK后,取“客户端自己的最大能接收的MSS(SYN中发送的)”和“服务端最大能接收的MSS(SYN-ACK中接收到的)”中的较小的值(1200)作为客户端发送MSS

2)客户端和服务端之前通过路由路连接(通常的网络结构)

这个比较复杂,在中间路由器全部支持MSS同步功能的前提下,因为中间经过路由器的原因(来回可以经过不同的路由器,

或者相同路由的不同接口,导致路由器接口的MSS可能不一样),协调流程和结果如下:

第一步:客户端在发送出去的SYN中带上本端(客户端)最大能接收的MSS的长度为1460字节

第二步:路由器在转发这个SYN时,带上路由器发送端口的最大能接收的MSS的长度为1200字节(将1460改成1200)

第二步:服务端收到这个ACK后,在发回的SYN-ACK中带上本端(服务端)最大能接收到MSS的长度为1460,

              然后服务端取路由器发送端口最大能接收的MSS(SYN中收到的)和服务端端口自己最大能接收的MSS(SYN-ACK中发送的)中的小的值(1200)为服务端发送MSS

第三步:路由器在转发这个SYN-ACK时,带上上路由器发送端口的最大能接收的MSS的长度为1400字节(将1460改成1400),这里要注意,“路由器向客户端发送数据的端口”与“路由器向服务端发送数据的端口”是路由器上不同的端口。

第四步:客户端收到这个SYNC-ACK后,取“客户端自己的发送端口最在能接收的的MSS(SYN中发送的)”和“路由器发送端口最大能接收的MSS(SYN-ACK中接收到的)”中的较小的值(1400)为客户端发送MSS

例外:

如果在带路由器的网络结构里中间经过的路由器有不支持MSS协商的话,就会导致TCP在路由器网络中间产生分片或者要用PMTU(路径MTU发现算法)来解决这个问题。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐