查看nginx: ignore some requests without proper Host header让我想到,如果没有操作系统通过向另一端发送close(2)
(和/或RST
)正确地终止基础TCP连接,则实际上不可能通过TCP连接 FIN
。
一种解决方法是使用类似 tcpdrop(8)
的方法,但是,从 usr.sbin/tcpdrop/tcpdrop.c
on OpenBSD和FreeBSD可以看出,它是通过基于sysctl的界面实现的,并且可能在BSD之外具有可移植性问题。 (实际上,看起来甚至基于sysctl的实现在OpenBSD和FreeBSD之间可能也足够不同,因此需要一个移植层-OpenBSD uses和 tcp_ident_mapping
结构(其后包含两个sockaddr_storage
元素以及一些其他信息),而FreeBSD ,DragonFly和NetBSD直接使用两个sockaddr_storage
元素组成的数组。)事实证明,OpenBSD的tcpdrop
确实按照 R
发送了tcpdump(8)
数据包,可以通过查看 /sys/netinet/tcp_subr.c :: tcp_drop()
进行确认,该方法最后调用tcp_close()
(和tcp_close()
) is confirmed to send RST
elsewhere on SO),因此似乎也无法使用。
如果我自己通过C建立连接,是否有一种方法可以随后在不确认对方的情况下将其丢弃,例如不启动RST
?
最佳答案
不会。即使存在,如果对等方随后发送了任何内容,它也会由RST响应。
注意:正常的TCP终止使用FIN,而不是RST。
关于c - 在不发送RST的情况下断开打开的TCP连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46147009/