TCP如何实现/保证有序数据传输?

12

我在想TCP如何实现有序传递。

假设这是事件列表:

  1. 发送packet1,接收到ack。
  2. 发送packet2,未接收到ack。
  3. 发送packet3。
  4. 发送packet4。
  5. 接收到ack4。
  6. 接收到ack3。
  7. 接收到ack2。

你能描述一下这些事件的顺序吗?

2个回答

10

简短的回答是每个数据包都包含偏移信息(伪装成序列号),指定其有效载荷在流中的位置。

假设发生以下情况:接收到数据包1,未接收到数据包2,接收到数据包3和4。此时接收TCP栈知道在缓冲区上复制数据包3和4的内容的位置,并且它知道尚未接收先前的数据,因此它将使数据包1的数据可供读取,但在接收到数据包2之前,不会使数据包3或4的数据可用。

发送TCP栈通常不等待任何单个数据包的确认就发送下一个数据包,但如果它没有收到给定数据包的确认(并且为了效率,ACK可以和已接收的数据包一起打包成一个数据包),则会重新传输数据包直到收到ACK。

事件的确切序列取决于网络条件、TCP栈实现、选择的TCP策略、套接字选项和其他因素。


6
TCP数据包具有序列号(自启动以来的字节偏移量,从内存中)和ACK消息确认已接收到特定偏移量:

enter image description here

因此,您可能会遇到这样的情况:

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)

换句话说,发送方可以继续发送,而不需要等待确认,直到其缓冲区已满(它必须保留未确认的数据包,以防需要重新传输它们)。
这种“发送”和“确认”之间的“断开”可以大大加快数据流量。
在接收端,数据包可以无序到达,并保留它们,直到可以按顺序将它们传递到更高层次。
例如,如果data 3data 2之前到达,则接收端会保留data 3,直到data 2到达,然后将它们一起发送以进行传递。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接