TCP的MSS的计算与详解

TCP中的MSS(最大报文段长度)用于避免IP分片,提高网络效率。在TCP三次握手期间,双方通过SYN和SYN-ACK报文协商MSS。协商过程考虑了两端及中间路由器的MTU限制,确保数据传输的有效性和高效性。若路由器不支持MSS协商,可能需要路径MTU发现算法来解决分片问题。
摘要由CSDN通过智能技术生成

目录

为什么要有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发现算法)来解决这个问题。

TCP MSS和MTU是与网络通信中数据包大小相关的概念。 TCP MSS(Maximum Segment Size,最大分段大小)是TCP头部中的一个字段,表示TCP报文段中数据部分的最大大小,即TCP协议传输数据时,每个TCP报文段中数据字段的最大大小。通过TCP MSS可以限制TCP报文段的大小,以便适应网络传输的要求和限制,避免因数据过大而导致的分片和重传。 MTU(Maximum Transmission Unit,最大传输单元)是数据链路层中的一个概念,表示在网络通信中,数据链路层所能传输的最大数据包大小。MTU包括了网络协议的头部和数据部分的大小。网络中的各个设备(如路由器、交换机等)都有不同的MTU值,而且不同的网络链路也可能有不同的MTU值。MTU决定了网络传输时每个数据包的最大大小,更大的MTu可以传输更多的数据,但会增加传输时的延迟和网络拥塞的可能性。 TCP MSS和MTU有一定的关联性。由于网络链路中的设备都有不同的MTU值,当发送的TCP报文段的大小超过某个网络设备的MTU时,就会发生分片(fragmentation)。分片会增加网络传输的开销,降低传输效率。为了避免分片,TCP可以在连接建立时通过协商的方式确定合适的MSS,使得TCP报文段的大小不超过中间设备的MTU值。 总结起来,TCP MSS和MTU都是为了适应网络传输而限制数据包大小的概念,TCP MSS限制了TCP报文段的大小,避免了分片和重传,MTU表示数据链路层所能传输的最大数据包大小,决定了网络传输时每个数据包的最大大小。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值