2012-03-30 1254 views
8

我想知道TCP如何实现按顺序传递。TCP如何实现/保证有序数据传输?

可以说,这是事件

  1. packet1发送,收到ACK的名单。
  2. packet2已发送,ack未收到。
  3. packet3发送。
  4. packet4已发送。
  5. ack4收到。
  6. ack3收到。
  7. ack2收到。

你能向我描述究竟发生了什么?

回答

7

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

假设发生了以下情况:收到数据包1,没有收到数据包2,收到数据包3和4。此时接收TCP堆栈知道将缓冲区中的数据包3和4的内容拷贝到哪里,并且知道它还没有接收到先前的数据,所以它将使得数据包1的数据可用于读取,但是它不会使分组3或4的数据可用,直到接收到分组2。

发送TCP堆栈通常不会在发送下一个包之前等待任何单个数据包的确认,但是如果它没有收到给定数据包的确认(并且ACK可以并且在一个数据包中捆绑在一起以提高效率),它会重传它直到收到一个ACK。

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

4

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 2,然后两者都将被用于递送向上发送。