要添加到上一个答案:
“累积 ACK”意味着发送方发送的所有字节(到目前为止)都已被接收方正确接收。换句话说,当发送方收到一个带有序列号的 ACK 时n
,接收方告诉发送方它已经收到了直到并包括在内的每个字节,并且n-1
正在等待n
下一个字节。
在“选择性 ACK”中,接收器为它收到的每个数据包发送 ACK,而不管它是否是接收器期望的数据包(即数据包是否乱序)。
例如,假设发送方 S 发送了 3 个数据包:pkt1
(seq # = 100)、pkt2
(seq # = 200) 和pkt3
(seq # = 300),但pkt2
在传输中丢失了。
使用 GBN:当接收方 R 得到pkt1
: 它发送 时ACK=200
,告诉发送方它已经收到了(但不包括)200 以内的所有字节,接下来是 200 字节。现在,pkt2
迷路了,但pkt3
被接收者收到了。因此,接收方将再次发送 ACK=200 并丢弃,pkt3
因为它是乱序的。S 然后必须重新传输pkt2
AND pkt3
。
一旦pkt2
被重传并成功接收,R 将发送 ACK=300(即它已经接收到但不包括字节 300 的所有内容,并且正在等待字节 300,即pkt3
)。一旦pkt3
成功传输,它也会确认。
使用选择性重复 (SR):一旦 R 接收到pkt1
,它将为其发送一个 ACK。一旦它收到pkt3
,它也会发送一个专门针对这个数据包的 ACK 并且不会丢弃这个数据包,即使它pkt3
是乱序的(它会缓冲它)。最终,pkt2
将在发送端超时,因此发送端将重新传输pkt2
。如果成功,接收方也将为其发送 ACK。
请注意,使用 SR,pkt3
即使pkt2
丢失了也不必重新传输。这是有益的,因为它可以防止发送方必须重新传输已经被接收方成功接收的数据包(这是毫无意义的,对吧?为什么pkt3
在已经交付的情况下再次发送?)。这有助于避免网络拥塞,因为您不会不断地重新传输不需要重新传输的数据包。
一般来说,TCP 的拥塞控制可以描述为 GBN 和 Selective Repeat 的组合/混合。原因如下:
TCP 与 GBN 类似,因为这两种协议对发送方可以发送到网络的未确认数据包的数量都有限制。但是,TCP 与 GBN 不同,因为 GBN 要求在数据包丢失时重新传输每个未确认的数据包,而 TCP 仅重新传输最旧的未确认数据包。
TCP 类似于选择性重复,因为当数据包由于拥塞而丢失时,协议不需要发送方重新传输发送方发送的每个未确认的数据包。发送方只是重传最旧的未确认数据包。TCP 与选择性重复不同,因为 SR 需要对接收方发送的每个数据包进行单独确认;但不是有选择地确认每个数据包,TCP 为它期望的下一个数据包发送一个确认(如 GBN)并缓冲它到目前为止收到的数据包,即使它们是乱序的(如 SR)。这就是为什么它可以被认为是混合动力车。
希望这可以帮助。