Skip to content

NACK, SACK, ACK之间的区别

NACK, SACK, ACK之间的区别

ACK, NACK, 和 SACK 都是与计算机网络通信中的确认机制相关的术语。它们通常在TCP(传输控制协议)或其他可靠的通信协议中使用。让我们详细地看一下每一个:

  1. ACK (Acknowledgment)

    • ACK 是“确认”的缩写,它是TCP通信中的一个基本概念。
    • 当数据包成功地从发送方传输到接收方时,接收方会回送一个 ACK 消息给发送方,通知其数据已成功接收。
    • 在TCP通信中,每个传输的数据段都有一个序列号。ACK消息通常包括一个序列号,表示到目前为止已成功接收的数据量。
  2. NACK (Negative Acknowledgment)

    • NACK 是“否定确认”的缩写,它表示接收方没有成功地接收某个数据段或数据包。
    • 使用 NACK 的协议可能会在接收到错误的、不完整的或乱序的数据包时发送 NACK
    • 当发送方接收到 NACK 时,它知道需要重新发送特定的数据包。
  3. SACK (Selective Acknowledgment)

    • SACK 是TCP的一个选项,允许接收方只确认在一个连续序列中已成功接收的部分数据段。
    • 传统的 ACK 机制只能确认连续接收的数据。但在有丢包的网络中,可能只是中间某几个包丢失,而其他的数据包已经成功接收。在这种情况下,使用 SACK 可以更精确地告诉发送方哪些数据包需要重新发送,从而提高传输的效率。
    • 例如,如果数据包 1, 2, 3, 5 和 6 已经接收,但数据包 4 丢失了,那么通过 SACK,接收方可以确认数据包 5 和 6 已经接收,而不必等到数据包 4 被重新发送和接收后才确认所有数据包。

简而言之,这三个术语都与网络通信的数据确认机制有关,ACKNACK 是正面和负面的确认反馈,而 SACK 提供了一种选择性的确认机制,允许在数据包失序的情况下更高效地进行通信。


SACK如何打开,什么情况下会降级至ACK

SACK(Selective Acknowledgment)是TCP的一个选项,它是为了改进在有丢包情况下的性能而设计的。当网络中存在丢包时,SACK可以让接收方指定哪些数据段已成功接收,从而允许发送方只重新发送未被确认的段。

如何打开SACK:

在许多操作系统中,TCP的SACK选项默认是启用的。例如,在Linux系统上,你可以使用sysctl命令查看和修改SACK的设置:

查看SACK设置:

sysctl net.ipv4.tcp_sack

启用SACK:

sysctl -w net.ipv4.tcp_sack=1

关闭SACK:

sysctl -w net.ipv4.tcp_sack=0

请注意,如果你不是系统管理员,你可能需要使用sudo命令来执行上述命令。

SACK降级到ACK的情况:

  1. 对方不支持SACK:如果TCP握手期间的SYN或SYN-ACK数据包中没有SACK选项,那么连接将不会使用SACK。这通常意味着对方的TCP实现不支持或未启用SACK。

  2. 网络设备的介入:有些网络设备(如老旧的NAT设备或某些防火墙)可能会剥离掉TCP头部的某些选项,这可能导致SACK被禁用。

  3. 某些攻击场景:在某些情况下,为了减少对网络资源的消耗或防止滥用,网络管理员可能会决定关闭SACK。例如,2019年,Linux内核中的一个TCP SACK处理的漏洞被公之于众,这导致某些系统管理员选择关闭SACK以防止攻击。

总的来说,虽然SACK是一个有益的特性,它在某些情况下可能会被关闭或不被使用。如果你想知道一个特定的TCP连接是否使用了SACK,你可以使用工具(如tcpdumpWireshark)来捕获和分析TCP握手的数据包。


Related Posts

  1. 常见拥塞控制算法
  2. jsep
  3. webrtc 安全机制
  4. sigslots