1 为什么会有MSS?为什么是1460?

这篇文章有试验是tcp拆包还是ip拆包

MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。


TCP在传输层分片,UDP在IP网络层分片,UDP不会分段,就由我IP来分。TCP会分段,当然也就不用我IP来分了!


那在ip层分包不好么,为什么要力图在tcp层分?ip分包只有第一个包有tcp首部会导致什么?

避免ip分片的目的——IP分片只有第一个带有传输层(tcp)或ICMP首部,其余的分片只有IP头。至于怎么重组就是到对端以后IP层的事情了。TCP分段每个都有完整首部。

即使只丢失一片数据也要重新传整个数据报。why?因为IP层本身没有超时重传机制------由更高层(比如TCP)来负责超时和重传。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报(而不是一个分片),没有办法只重传数据报中的一个数据分片。


​javascript:void(0)​

9为什么会有 MTU,MSS_重发

关于mss分片:mtu是数据链路层的最大传输单元,一般为1500字节,而一个ip包的最大长度为65535,所以ip层在发送数据前会根据mtu分片,这样一个tcp包本来对应一个ip包,分片后将对应多个ip包,每个包都有一个ip头(无tcp头),在接收端需要等到所有的ip包到达后,才能确定这个tcp收到然后才发送ack,这种方式无疑是低效的,所以tcp层会尽量阻止ip层进行分片,他会在从用户空间拷贝的时候就会按照mtu进行拆分,将一个数据包拆分成多个数据包。


低效:

统一确认

统一重发


2 MTU为啥是1500字节?硬件决定