为什么有了MTU,还需要MSS?
MTU
Maximum Transmit Unit,最大传输单元。由数据链路层提供给网络最大的一次传输数据的大小,一般MTU=1500Byte.
"车同轨",保证底层数据包能在物理网络中顺利传输!!!
例如:IP层有<=1500Bytes数据需要发送,发送一个IP包就可以完成了;IP层有>1500Bytes数据需要发送,则需要分片才能完成发送,发送后的IP Header ID相同
MSS
Maximum Segment Size,TCP提交给IP层最大分段大小,只包含TCP payload,MSS是TCP用来限制应用层最大的发送字节数。
优化上层传输效率,避免不必要的IP分片
例如:MTU=1500Bytes,那么MSS=1500-20(IP Header)-20(TCP Header)=1460Byte。如果应用层有2000Bytes数据要发送,那么需要切片才能完成,第一个TCP切片=1460,第二个TCP切片=540
TCP宁愿自己进行数据分片
TCP三次握手期间就会协商MSS值:是根据路径MTU的值计算而出的MSS。
TCP会在数据传输前将这些数据分割成多个不超过MSS大小的段(segment)。这样做的好处是,每个TCP段都是独立可确认的,如果某个段在网络中丢失,TCP可以通过其自身的重传机制只重新发送丢失的那段数据,而不是整个原始的大数据包。
相比之下,如果数据在TCP层未经适当分段就直接交给IP层,而这个大数据包又超过了路径中的MTU,那么IP层将不得不进行分片。IP分片的问题在于,所有分片都必须全部到达目的地才能重组原始数据包,如果其中任何一个分片丢失,则整个数据包都需要重传(发送方重传!如果是因为单个IP分片丢失导致TCP数据段不完整,TCP无法知道这一点,它只会注意到预期的ACK没有返回,从而触发重传),即使其他分片已经成功到达。这不仅增加了网络复杂性,还可能导致不必要的带宽浪费和延迟。
需要注意的是:在网络传输中可能会因为MTU或者MSS的值,导致包被丢弃或者分片,速度变慢!
总结
所以,两者作用的逻辑层次不一样。
好比现在有巨多的货物要从北京运到上海,你无法用一辆车完成运输。如果你说"可以创造一辆巨大的可以承载所有货物的车",但是道路的宽度和硬度不支持(MTU),所以你只能用许多辆车去承载。
然后车的大小在一个范围内基本确定,能装载的货物的大小也就限制在一定范围内,可是并不是每一个货物都是刚刚好。与其等到上货物的那一刻去裁剪货物的尺寸,何不在工厂内生产的时候就规范好货物的尺寸(MSS)呢?
所以MTU是规定了网络物理线路承载的范围,而MSS是TCP针对应用层数据进行的分片,防止IP层分段导致的数据传输效率下降!