我将根据以下场景提出问题。假设我必须使用 TCP 使用 5 的窗口大小发送 10 个数据包。我发送 1、2 并为它们接收 ACK,发送 3 并且 ACK 丢失,我发送 4、5 并接收它们的 ACK。我的问题是:协商 SACK 后,TCP 是否继续在窗口外传输?即它在接收 3 之前开始传输 6?在窗口不移动的情况下
TCP SACK 的行为
网络工程
通讯协议
2021-07-24 21:12:35
2个回答
Seq+len must be < ACK+WIN
No you can't empty data in sack, (TCP is Sequential)
And it doesn't fill the window either
1
2
Ack 3 w=10
3 lost
4
Ack 3, Sack 4-4 w=10
5
Ack 3, sack 4-5 w=10
不,SACK 不会移动发件人窗口的开头(也称为 SND.UNA)
让我们考虑接收方有大小为 5 的接收方缓冲区。如果接收方收到了数据包 4 和 5 但没有收到 3,他的接收方缓冲区将如下所示:[3 的空间,数据包 4,数据包 5,6 和 7 的空间]。他无法将 4 和 5 传递给应用程序,也无法移动其窗口。因此,发送方没有必要移动其窗口并发送超过 6 和 7 的任何内容(参见下面的注释 1)。
不过请注意:
当您收到一个 ACK 时,窗口将移动,因此可以发送 6 个;这同样适用于 2 和 7 的 ACK。
如果您发送数据包 3,它会被传递但 ACK 丢失,那么当您发送数据包 4 时,TCP 将 ACK 4(正常累积 ACK)表示所有数据包最多 4 已传递。为此,您不需要 SACK。
具有恒定窗口的 TCP 是一种非常简单的情况,从未发生过。TCP 将采用拥塞控制,这将改变窗口的大小。特别是 TCP Reno 和 NewReno 将利用可以将窗口大小更改为 5 以上的快速恢复。它可以使用 SACK 字段来确定如何更改窗口大小。(当然前提是不超过接收器窗口)