摘要: TCP 最大报文段长度 MSS

TCP 最大报文段长度 MSS(Maximum Segment Size)

MSS 是TCP选项中最经常出现,也是最早出现的选项。MSS选项占4byte。MSS是每一个TCP报文段中数据字段的最大长度,注意:只是数据部分的字段,不包括TCP的头部。TCP在三次握手中,每一方都会通告其期望收到的MSS(MSS只出现在SYN数据包中)如果一方不接受另一方的MSS值则定位默认值536byte。

MSS值太小或太大都是不合适。太小,例如MSS值只有1byte,那么为了传输这1byte数据,至少要消耗20字节IP头部+20字节TCP头部=40byte,这还不包括其二层头部所需要的开销,显然这种数据传输效率是很低的。MSS过大,导致数据包可以封装很大,那么在IP传输中分片的可能性就会增大,接受方在处理分片包所消耗的资源和处理时间都会增大,如果分片在传输中还发生了重传,那么其网络开销也会增大。因此合理的MSS是至关重要的。MSS的合理值应为保证数据包不分片的最大值。对于以太网MSS可以达到1460byte(MTU-IP_header-TCP_header=1500-20-20=1460).

与MSS相似的在IP层也有一个类似的概念---MTU(Maximum Transfer Unit)下图可以清晰反映MSS与MTU 的关系:

从上图我们也能看出来MTU=MSS+TCP Header+IP Header.

实例:

对于TCP来说,它是尽量避免分片的。假设我们这里要发送给TCP层的数据大小为2748个字节,这个大小是明显大于链路层的发送数据的大小的,在这个情况下我们来看,对于来自TCP层的数据,IP会不会进行分片。

从这张图看来,应用层的2748个字节在TCP层就进行了分段,分成了两个TCP段,一个1460字节,一个1288字节。那么到IP层的时候,自然就不会在进行分片了。