【问题标题】:How does TCP implement/guarantee in-order data transmission?TCP如何实现/保证有序的数据传输?
【发布时间】:2012-03-30 03:07:22
【问题描述】:

我想知道 TCP 究竟是如何实现按序传递的。

让我们说这是事件列表

  1. packet1 已发送,确认已收到。
  2. packet2 已发送,确认未收到。
  3. 数据包 3 已发送。
  4. 数据包 4 已发送。
  5. 收到 ack4。
  6. 收到 ack3。
  7. ack2 已收到。

你能向我描述一下顺序发生的具体情况吗?

【问题讨论】:

    标签: sockets tcp inorder


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      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)
      

      换句话说,发送方可以继续发送,无论确认如何,直到其缓冲区已满(它必须保留未确认的数据包,以防需要重新传输它们)。

      发送和确认之间的这种“断开”可以大大加快数据流的速度。

      在接收端,数据包可能会乱序到达,它们会一直保留,直到某些东西可以按顺序传递到更高级别。

      例如,如果data 3data 2之前到达,接收端会一直保持到data 2到达,那么它们都会向上发送。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-08
        • 1970-01-01
        • 2011-06-07
        • 2011-07-06
        • 2016-11-14
        • 2011-04-18
        • 2022-11-07
        • 2014-04-07
        相关资源
        最近更新 更多