![OpenBSD:优先处理空 ACK](https://linux22.com/image/1415399/OpenBSD%EF%BC%9A%E4%BC%98%E5%85%88%E5%A4%84%E7%90%86%E7%A9%BA%20ACK.png)
有一个广泛使用的例子,涉及 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 数据包与第二个队列相关联,而不是第一个队列。