阅读目标
- 理解TCP/IP对报文的拆分逻辑
对IP协议还比较陌生的同学异步到IP协议报文详解
在TCP协议和IP协议中都有字段来对报文进行拆包和组装,为什么在网络层和传输层都有做拆分?在做分析之前,首先科普两个概念.
- 最大传输单元MTU(Maximum Transmission Unit): 为IP网络层的最大载荷上限
- 最大报文段长度MSS(Maximum Segment Size): 为TCP传输层的最大载荷上限
- 关系: MTU = MSS + TCP首部长度 + IP首部长度(不包含以太网头部)
IP分片(网络层)
1. 原因
当IP的报文长度大于MTU时会对该IP报文进行分片
2. 缺陷
因为IP协议没有超时重传机制,所以当IP的某个分片在传输过程中丢失后,会让整个IP报文重新发送。举个栗子:A为长度为2000字节的报文,但由于MTU最大为1500,所以被分成两片A1(1500)和A2(500),由于网络波动A2在传输过程中丢失,A1传输成功,那么根据IP协议没有超时重传的设定,会让A1和A2都重新发送,这样明显是浪费流量。
3. 改进方式
由于IP协议不可重传机制会造成流量的浪费,但我们可以考虑在可以重传的地方将包进行拆分,即TCP分段
TCP分段(传输层)
优势
为了避免IP协议不可重传机制造成的流量浪费,我们可以在TCP协议下先将大报文给分段。另外因为MTU = MSS + TCP首部长度 + IP首部长度,所以TCP分段后的每段肯定都小于MTU,这样就可以避免在网络层对报文分片,从而解决了IP分片带来的问题。
备注
- 因为报文经过路由MTU的值会有差异,所以报文在传输传输过中可能碰到某个路由的MTU小于发送端和接收端的两者的设定,因此在报文在路由转发过程中也可能会进行分片。此问题可以通过
路径MTU发现
解决,在此就不多说了 - 传输层的UDP协议是不可靠传输,所以UDP协议不可分段,只能在IP协议下分片了。