当接收到的数据包中有多个间隙时,SACK 中会发生什么?

网络工程 通讯协议 包分析 数据包丢失
2021-08-02 22:40:13

假设客户端收到了 0 到 500、900 到 1100 和 1300 到 2000,ACK 和 SACK 会是什么样子?它看起来像这样 ACK: 500 SACK:900-1100 然后它在新请求中要求数据包 1100 到 1300。

1个回答

Selective ACK Option 可以指定多个接收流量的“块”。这是选项在线路上的样子(取自RFC 2018,第 3 节):

                     +--------+--------+
                     | Kind=5 | Length |
   +--------+--------+--------+--------+
   |      Left Edge of 1st Block       |
   +--------+--------+--------+--------+
   |      Right Edge of 1st Block      |
   +--------+--------+--------+--------+
   |                                   |
   /            . . .                  /
   |                                   |
   +--------+--------+--------+--------+
   |      Left Edge of nth Block       |
   +--------+--------+--------+--------+
   |      Right Edge of nth Block      |
   +--------+--------+--------+--------+

根据你的例子:

假设客户端收到了 0 到 500、900 到 1100 和 1300 到 2000,ACK 和 SACK 会是什么样子?

您的建议几乎是正确的,除了考虑到接收字节的额外左右边缘。

TCP ACK - 501 (in TCP header, not in SACK Option)
TCP SACK - 1st block Left Edge  - 900
TCP SACK - 1st block Right Edge - 1100
TCP SACK - 2nd block Left Edge  - 1300
TCP SACK - 2nd block Right Edge - 2000
(all in the same Segment)

RFC 2018 第 7 节中还有其他示例和用例它们值得通读以充分理解它。