Sta*_*der 10 sockets tcp inorder
我想知道TCP如何实现按顺序交付.
让我们说这是事件列表
你能告诉我顺序发生了什么吗?
简短的回答是每个数据包都包含偏移信息(伪装成序列号),指定其有效载荷位于流中的位置.
假设发生以下情况:收到数据包1,未收到数据包2,接收数据包3和4.此时接收TCP堆栈知道在缓冲区中复制数据包3和4的内容的位置,并且它知道它仍然没有接收到先前的数据,因此它将使数据包1数据可供读取,但它不会使数据包3或4数据可用,直到收到数据包2.
传输TCP堆栈通常不会在发送下一个数据包之前等待任何单个数据包的确认,但如果它没有收到给定数据包的确认(并且为了提高效率,ACK可以并且在一个数据包中捆绑在一起),它将会重新发送它直到收到ACK.
确切的事件序列取决于网络条件,TCP堆栈实现,选择的TCP策略,套接字选项和其他因素.
TCP数据包具有序列号(从内存开始,自内存以来的字节偏移量),并且ACK消息确认已接收到特定的偏移量:

因此,您可能会遇到以下情况:
data 1 (10 bytes) ->
<- ack (10, data1)
data 2 (15 bytes) ->
data 3 (10 bytes) ->
data 4 ( 8 bytes) ->
<- ack (25, data1/2/3)
<- ack (33, data1/2/3/4)
Run Code Online (Sandbox Code Playgroud)
换句话说,发件人可以继续发送不管确认,直到其缓冲区已满(它必须保留未确认的数据包,以防需要重新传输它们)。
发送和确认之间的这种“断开连接”可以大大加快数据流的速度。
在接收端,数据包可能会乱序到达,并一直保留到可以将某些东西按顺序传送到更高级别为止。
例如,如果在data 3到达之前到达data 2,接收端会一直坚持到data 2到达,然后将两者向上发送以进行传送。
| 归档时间: |
|
| 查看次数: |
5552 次 |
| 最近记录: |