OpenBSD:优先处理空 ACK

OpenBSD:优先处理空 ACK

有一个广泛使用的例子,涉及 PF 和优先处理空 ACK 数据包,以便如果上游堵塞,异步连接的下游不会损失性能。

该示例可以在多种地方找到,例如:

http://www.benzedrine.cx/ackpri.html

pass out on $ext_if proto tcp from $ext_if to any flags S/SA \
        keep state queue (q_def, q_pri)

pass in  on $ext_if proto tcp from any to $ext_if flags S/SA \
        keep state queue (q_def, q_pri)

我不明白为什么这条规则会如此起作用:

第二个队列参数将空的 ACK 放入优先级队列。我明白了。但只有当它是连接中的第一个数据包时,标志匹配才会匹配。摘自 pf.conf 手册页:

Because flags S/SA is applied by default (unless no state is
specified), only the initial SYN packet of a TCP handshake will
create a state for a TCP connection.

那么,它如何影响空 ACK?并不是说每个人都做错了,我只是想了解其中的原理。

答案1

在 PF 上,当您设置保持状态时,您将创建一个用于状态跟踪的状态,因此您之后不需要允许与此连接相关的其他数据包。

另外,当您设置队列时,它将应用于与此连接相关的所有数据包,当您设置第二个队列参数时,它将使所有具有 ToS 低延迟设置的数据包或没有有效负载的 ACK 数据包与第二个队列相关联,而不是第一个队列。

相关内容