网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

TCP中的选择性确认机制(Selective Acknowledgments, SACK)

更新时间:2026年03月27日   作者:spoto   标签(Tag):

当在客户端和服务器之间的TCP通信中检测到数据包丢失时,下一步就是恢复那些丢失的数据包。在TCP协议中,有一些用于恢复丢失数据的算法。这些算法包括:

  1. 快速恢复
  2. 选择性确认机制(Selective Acknowledgments, SACK)
  3. 比例性减载法(Proportional Rate Reduction)

快速恢复的局限性:

TCP Reno中的“快速恢复”机制存在两个主要问题。

  1. 对于同一组数据包,可以多次减少拥塞窗口的大小。这个问题可以通过TCP New Reno算法来解决。
  2. 在相同的拥塞窗口中,如果多个数据包丢失了,那么恢复这些数据的过程需要花费很长时间。这个问题可以通过选择性确认技术来解决。

选择性确认机制(Selective Acknowledgments, SACK):

SACK是一种针对TCP协议的发送方和接收方的优化技术。 发送方和接收方都必须支持SACK功能,只有这样,才能使用这一特性。 “SACK”功能在所有操作系统中都是默认启用的。 Linux、Windows和macOS。 SACK并不取代TCP头部中的原始ACK信息,而是在TCP头部的选项字段中增加了一个用于存储SACK信息的字段。 TCP头部中的“Options”字段用于发送SACK信息,而真正的ACK信息则存储在另一个字段中。 在“选项”字段中,最多可以使用32字节(总共40字节)来进行SACK传输。 在“选项”字段中,已经有8个字节被预留出来用于存储时间戳了。

SACK的工作原理:

SACK功能有助于发送方及时发现接收方缓冲区中的“空隙”。当接收方未能按序接收到数据包时,就会在缓冲区中出现一些“空缺”或“缺失的数据点”。SACK能够让发送方及时了解到这些空缺情况。一旦发送方得知有数据丢失或缺失的情况,就会重新发送这些数据。与Fast Recovery不同的是,SACK不会在发送方得知数据丢失后很长时间才进行通知。

SACK的工作原理

说明:

发送者发送数据包0、1、2、3,以及4个那个最初的时候,也是同样的时间。接收方接收到数据包0后,通过发送ACK-1来请求下一个按顺序排列的数据包。
发送方收到ACK-1响应。发送数据包5,以维持当前的CWND值为5。

由于网络拥塞,数据包1被丢弃了。

接收方收到了数据包2。发送数据包6,以维持当前的cwnd值为5。现在,接收方正在以无序的顺序发送数据包。它通过发送ACK-1来请求数据包1,同时还会为下一个需要发送的数据包创建一个SACK块。确认字段会持续显示重复的数字。接收方随后发送ACK-1和SACK 2-3。ACK-1表示接收方正在请求数据包1;而SACK 2-3则表明接收方已经收到了数据包2,并且正在请求数据包3。

数据包数量为3时,该数据包会被丢弃。

接收方收到了第4个数据包。发送数据包7,以维持当前的cwnd值为5。接收器缓冲区的内容为:[0, 2, 4]。因此,接收器的缓冲区中有两个空缺。接收器发送了ACK-1以及SACK 2-3、4-5。这意味着接收器已经收到了数据包2和4,并且正在请求数据包3和5。此外,接收器还发送了重复的ACK-1信号。

接收方收到数据包5。接收方发送ACK-1以及SACK 2-3、4-6。
发送方收到了第三个重复的ACK-1信号,因此进入快速恢复阶段,同时继续传输所有已经丢失的数据包。接收方则正在请求获取数据包1和3。
数据包1的丢失情况可以通过ACK字段来反映,而数据包3的丢失情况则可以通过SACK机制来反映。

发送者重新传输了数据包1和3。在传输过程中,这些数据包的编号分别变为6、7、1、3。

接收方成功收到了数据包6。

当接收方接收到数据包1时,缓冲区的状态如下:[0, 1, 2, 4, 5, 6]。此时,缓冲区中仍然有一个空缺的位置。
接收方发送了ACK-3和SACK 4-7。ACK-3表示接收方已经成功接收到直到数据包2为止的所有数据包。而SACK 4-7则表明接收方已经收到了数据包4、5和6,同时请求接收数据包7。

当接收器接收到数据包3时,缓冲区的内容为:[0, 1, 2, 3, 4, 5, 6]。此时,所有数据包都已经按顺序到达了。接收器发送ACK-7信号,以请求下一个数据包。

接收方成功收到了第7个数据包,然后请求下一个数据包,即第8个数据包。

TCP头部中的SACK字段:

SACK扩展使用了“两个”TCP选项。允许装箱/打包“选项”与SYN数据包一起使用。当客户端第一次与服务器通信时,它会向服务器告知自己使用的是SACK协议。第二个选项则是……SACK“选项”仅在使用接收方以乱序方式接收数据包时才会被使用。第一个选项就是让服务器知道客户端是否支持SACK协议。这样,服务器就可以了解客户端是否支持SACK协议了。

“允许装袋”选项:

Kind=4, Length=2

“SACK-选项”:

Kind=5, Length=8*number of SACK blocks.

“SACK-block”:

|Left edge of block of size 4 bytes||| Right edge of block of size 4 bytes|

每个SACK块需要8个字节。其中,4个字节用于表示块的左边缘位置,另外4个字节则用于表示块的右边缘位置。这些边缘信息实际上是由32位的数据构成的,因此总共需要4个字节来表示这些边缘信息。

限制条件:

接收方在同一段数据中最多可以报告四个SACK块。每个SACK块需要8个字节的存储空间,因此,共有8×4=32个字节可用于存储SACK块。另外,还有8个字节被预留用于TCP时间戳选项的数据传输(Kind=8,长度=10)。

8字节的TCP时间戳 + 32字节的SACK信息,总计40字节。这相当于TCP选项字段的总容量。

对SACK功能的改进/优化

  1. 前向确认(FACK)
  2. 重复选择性确认机制(DSACK)
  3. 近期获得的认可/表彰

为什么SACK对无线网络来说是个好选择呢?

SACK技术在无线网络中非常有用,因为无线网络能够更快地检测到多个数据包的丢失情况。在无线环境中,数据包的丢失和重新传输现象更为频繁。因此,接收端的应用程序不必再等待,直到接收缓冲区中的“间隙”被填满为止。

SACK能够显著减少数据包的传输完成时间。连续的丢包情况可以集中在一个SACK块中报告。由于所有数据包都会立即被重新传输,因此SACK大大提升了传输性能。发送方可以准确计算出正在传输中的数据包数量。此外,SACK还能更准确地估计“传输速率”。对于像Westwood这样的算法来说,这种技术非常有用,因为这些算法需要估算TCP连接的“数据速率”。

              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料