在启动终止后,通过FIN数据包从TCP连接接收数据包的情况有多普遍?

在启动终止后,通过FIN数据包从TCP连接接收数据包的情况有多普遍?,tcp,Tcp,我最近在good ol'Wikipedia[1]上读到关于TCP连接终止的文章,文章提到了半开放状态的可能性[2]。基本上,启动关闭TCP连接的机器“应该”继续读取数据,直到另一端也终止。这是通过设置FIN标志的TCP段/数据包在每一侧完成的 我担心“应该”这个词。我有两个心智检查问题: 首先,这到底有多普遍?在我看来,一般来说,客户机或资源请求者将是启动TCP连接终止的人,他们将在收到所需的一切后执行此操作。在正常情况下,当TCP连接终止时,不应该有任何数据包通过网络传输,对吗 另一方面,连接

我最近在good ol'Wikipedia[1]上读到关于TCP连接终止的文章,文章提到了半开放状态的可能性[2]。基本上,启动关闭TCP连接的机器“应该”继续读取数据,直到另一端也终止。这是通过设置FIN标志的TCP段/数据包在每一侧完成的

我担心“应该”这个词。我有两个心智检查问题:

首先,这到底有多普遍?在我看来,一般来说,客户机或资源请求者将是启动TCP连接终止的人,他们将在收到所需的一切后执行此操作。在正常情况下,当TCP连接终止时,不应该有任何数据包通过网络传输,对吗

另一方面,连接终止符“应该”继续接受数据这句话是一个强烈的要求还是更多的指导原则?如上所述,从我的角度来看,如果出现问题,连接只会过早关闭,在这种情况下,继续读取数据可能是不可行的。在我看来,继续处理数据实际上是一个安全漏洞。我可以通过打开一组与恶意客户端的TCP连接来执行第4层DDOS攻击,并在不发送FIN数据包的情况下发送连续的垃圾邮件数据

[1] [2]

我的假设是,发送FIN数据包等同于通信我希望尽快终止连接

事实并非如此。发送FIN仅仅意味着这一方完成了发送数据,而不是接收数据。例如,客户机可以使用这种方法来发出请求结束的信号,但仍在等待服务器的响应,然后服务器也会使用FIN终止,从而导致完全关闭的连接。尽管如此,虽然这种协议设计在理论上是可行的,但在实践中并不常见

但在使用HTTP持久连接时,您可能会在服务器FIN之后遇到客户机数据:服务器可能会在发送请求响应后随时关闭空闲连接。但是客户端可能会在仍然打开的连接上发送新请求。由于在服务器上发送FIN与在客户机上接收和处理FIN之间存在一定的延迟,因此关闭服务器上的空闲连接与在客户机上发送新请求可能会重叠。在这种情况下,即使服务器套接字因发送而关闭,也会在服务器套接字上获得新数据

我的假设是,发送FIN数据包等同于通信我希望尽快终止连接

事实并非如此。发送FIN仅仅意味着这一方完成了发送数据,而不是接收数据。例如,客户机可以使用这种方法来发出请求结束的信号,但仍在等待服务器的响应,然后服务器也会使用FIN终止,从而导致完全关闭的连接。尽管如此,虽然这种协议设计在理论上是可行的,但在实践中并不常见


但在使用HTTP持久连接时,您可能会在服务器FIN之后遇到客户机数据:服务器可能会在发送请求响应后随时关闭空闲连接。但是客户端可能会在仍然打开的连接上发送新请求。由于在服务器上发送FIN与在客户机上接收和处理FIN之间存在一定的延迟,因此关闭服务器上的空闲连接与在客户机上发送新请求可能会重叠。在这种情况下,即使服务器套接字因发送而关闭,也会在服务器套接字上获得新数据。

FIN表示您已完成发送。对等方可能尚未完成向您发送数据,如果您调用了
shutdown()
,而不是
close()
,您仍然可以收到该数据。但是,如果您调用了
close()
,对等方将重置连接。我想我没有领会您的意思。我理解同行可能还没有完成发送给我,我仍然可以阅读。我的问题是(1)我为什么会在意?如果我已经决定停止发送,为什么要读取数据?(2) 这到底什么时候会发生?什么时候会有人想在我告诉他们停止后继续向我发送数据?我的假设是,发送FIN数据包等同于通信我希望尽快终止连接。FIN表示您已完成发送。对等方可能尚未完成向您发送数据,如果您调用了
shutdown()
,而不是
close()
,您仍然可以收到该数据。但是,如果您调用了
close()
,对等方将重置连接。我想我没有领会您的意思。我理解同行可能还没有完成发送给我,我仍然可以阅读。我的问题是(1)我为什么会在意?如果我已经决定停止发送,为什么要读取数据?(2) 这到底什么时候会发生?什么时候会有人想在我告诉他们停止后继续向我发送数据?我的假设是,发送FIN数据包等同于通信我希望尽快终止连接。