- 1
- 0
- 约小于1千字
- 约 1页
- 2024-04-06 发布于四川
- 举报
TCP数据包分⽚机制详解
IP分⽚在以太⽹上,由于电⽓限制,⼀帧不能超过1518字节,除去以太⽹帧头14字节(mac地址等)和帧尾4字节校验,还剩1500字节,这
个⼤⼩称为MTU(最⼤传输单元)。
如果你的IP包⼤于1500字节,IP层就会分⽚了。⽽1492的MTU值的来源,是因为PPPoE协议。PPP协议是宽带运营商⽤于对⽤户认证计费
的(TCP/IP以太⽹⽆此功能)。PPPoE头尾⼀共8字节,所以有效载荷MTU变⼩了,原来有1500字节,现在只剩1492了。
这1492还包含20字节IP头,8字节UDP头或者20字节TCP头。所以真正的不分⽚数据,
UDP为1492-28=1464,
TCP为1492-40=1452字节。
TCP的确是流的,所以TCP⼀个包可以包含的数据⼤⼩为65536(包头长度定义为2字节).a向b连续发送数据,b在每次接受到数据⼤⼩⼤
于其低⽔位后,你的recv就会返回(假设是阻塞模式),并得到数据长度。当然你要持续接受和处理数据。
如果实际数据⼤于1452字节,IP会分⽚,但IP也会重组分⽚,所以还是⼀次recv就可以收到(不⼀定全,但跟分⽚⽆关)。如果⼀个分⽚丢
失,则整个TCP包都会重发,因为IP层不会将没收完的分⽚交给传输层。ACK确认的时机,是收到了就会确认上⼀次的完整包的TCP序列
号,如果不完整当然要等收完整,也不会交互到应⽤层,也不会发送ACK确认(可以通过3次确认上⼀个完整的序列号以让发送⽅快传)。
握⼿协商和ACKTCP在发起3次握⼿时,会协商MSS(最⼤分节⼤⼩),这个值⼀般是路径最⼩MTU-IP头-TCP头,如果MTU是1500,则
1500-20-20=1460字节。这样,每个包就不⽤IP层再分⽚了。所以你发2000字节,你调⽤⼀次send,如果发送缓冲区移动窗⼝够⼤,应该会
全部成功。否则,会返回实际发送的字节。假设2000字节全部成功,tcp实际会将其分为1460和540两个包发送,接受端接受到1460这个包
就会回⼀次ACK,接到540⼤⼩这个再ACK⼀次。每个分节都带有IP头和TCP头的。IP分⽚只有第⼀个带有传输层头,其余的分⽚只有IP
头。
原创力文档

文档评论(0)