阅读nginx: 忽略一些没有正确Host头的请求,让我想到实际上不可能通过close(2)
关闭TCP连接而不经过操作系统发送RST
(和/或FIN
)来终止底层TCP连接。
一个解决方法是使用类似事实证明,OpenBSD的tcpdrop(8)
的东西,然而,正如在OpenBSD上的usr.sbin/tcpdrop/tcpdrop.c
和FreeBSD中所看到的那样,它是通过基于sysctl的接口实现的,并且可能在BSD之外存在可移植性问题。(事实上,看起来即使基于sysctl的实现在OpenBSD和FreeBSD之间也有足够的差异需要一个移植层——OpenBSD使用 tcp_ident_mapping
结构(随后包含两个sockaddr_storage
元素,以及其他一些信息),而FreeBSD、DragonFly和NetBSD直接使用两个sockaddr_storage
元素的数组。)tcpdrop
似乎确实会像tcpdump(8)
一样发送R
数据包,这可以通过查看/sys/netinet/tcp_subr.c :: tcp_drop()
得到确认,该函数最终调用tcp_close()
(并且tcp_close()
在SO的其他地方已经确认会发送RST
),因此,看起来它甚至都不会起作用。
RST
。 - cnst