Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcp 正确终止来自客户端的HTTP连接';s侧_Tcp_Connection - Fatal编程技术网

Tcp 正确终止来自客户端的HTTP连接';s侧

Tcp 正确终止来自客户端的HTTP连接';s侧,tcp,connection,Tcp,Connection,(原标题:“奇怪的TCP连接关闭行为”) 我正在使用Wireshark对TCP连接过程进行故障排除。客户端打开到服务器的连接(我尝试了两个不同的服务器),并开始接收长数据流。在某个时间点,客户端希望停止并发送服务器[FIN,PSH,ACK]数据包,但服务器并没有停止发送数据,它会继续发送到自己的全流结束,然后发送自己的完成数据包[FIN,PSH,ACK]。我发现,在客户端发送FIN数据包后,继续从客户端的套接字读取数据是可行的。另外,在客户端发送这个FIN数据包之后,它的状态是FIN_WAIT,

(原标题:“奇怪的TCP连接关闭行为”)

我正在使用Wireshark对TCP连接过程进行故障排除。客户端打开到服务器的连接(我尝试了两个不同的服务器),并开始接收长数据流。在某个时间点,客户端希望停止并发送服务器[FIN,PSH,ACK]数据包,但服务器并没有停止发送数据,它会继续发送到自己的全流结束,然后发送自己的完成数据包[FIN,PSH,ACK]。我发现,在客户端发送FIN数据包后,继续从客户端的套接字读取数据是可行的。另外,在客户端发送这个FIN数据包之后,它的状态是FIN_WAIT,因此等待来自服务器的FIN响应

为什么服务器不停止发送数据,并用FIN set确认FIN数据包

我预计,在客户端发送FIN数据包之后,服务器仍然会发送几个在收到FIN之前正在运行的数据包,但不会发送整个长数据流包

编辑:阅读我认为web服务器被困在“CLOSE-WAIT:服务器在其端等待应用程序进程发出关闭准备就绪的信号”(第三行),当它将所有内容刷新到其端的套接字时,其数据发送过程“已完成”,此过程无法终止。奇怪

Edit1:看来我的问题有点不同。我需要在客户端完全终止连接,这样服务器停止发送数据,它(服务器)就不会疯狂地从客户端强制终止连接,并在准备下一次连接时中止其数据发送线程。

Edit2:环境是HTTP服务器

为什么服务器不停止发送数据,并用FIN set确认FIN数据包

他们为什么要这样做?客户已经表示不会发送另一个请求,但这并不意味着它对已经发送的任何请求的响应不感兴趣


大多数协议(如HTTP)都指定服务器应完成对当前请求的响应,然后才关闭连接。这不是异常中止,只是承诺不发送任何其他内容。

客户端只关闭了输出连接,而没有关闭它。因此服务器完全有权继续发送


如果客户端关闭了连接,它将发出RST来响应接收到的任何进一步的数据,这将阻止服务器发送更多的模缓冲。

好吧,如果客户端不想接收任何数据,它应该怎么做?我看不到标准描述它。而且,似乎只是用close(RST)终止连接在远程端不是一个具有可预测结果的有效操作?服务器将继续推动其数据通过,即使客户端完全消失了…好的,客户端的承诺是明确的。然后我需要重新表述一下问题-如何从客户端完全中止连接,这样客户端就不会收到它不需要的信息,但同时服务器将正确停止发送不需要的数据,并且不会挂起/发疯?@Anonymous,这需要服务器和客户端之间达成协议,以某种特定的方式处理某些特定情况。如果协议没有提供这样做的方法,那么就没有这样做的方法。TCP没有指定客户端或服务器应该如何响应特定的TCP事件。David,谢谢。在我的例子中,我使用的是HTTP服务器——Apache和Nginx。你能建议什么“特别的方式”吗?我认为最初我的应用程序只是关闭套接字,但在重新连接到同一服务器时,它导致了一些奇怪的问题。现在我断开连接,但这涉及到我想要避免的整个数据接收(带宽+时间)。@Anonymous您应该问一个新问题。尽可能详细地解释您看到的“奇怪问题”。EJP,以这种方式关闭连接对客户端来说是有效的行为吗?您知道它可能会对进一步的服务器操作产生哪些后果(例如,端口重用将导致问题)?如果您能详细介绍“模”的用法,我将非常高兴。在这种情况下,许多人不是以英语为母语的人,因此在理解其含义时可能会遇到问题:)完全正确;事实上,这是客户唯一能做的事情。其结果是服务器将遇到“由对等方重置连接”,并且应关闭套接字,因为不会对端口造成不利影响。”“模”是“撇开”的缩写。谢谢。我想增加我的经验。若我只是通过关闭套接字(=向服务器发送RST数据包)来终止连接,那个么作为一个客户端,我在从同一个源端口连接到同一个主机的一段时间内会遇到问题(我并没有测量到,但可能会达到两位数秒)。请稍候。关闭插槽发送一个FIN。当更多数据到达时发送RST。您应该能够立即重新连接,除非您的服务器的编写方式有些奇怪。我使用韩国WIZnet公司的W5100设备中的硬件实现堆栈。在它的实现中,有DISCON命令发送FIN(它的文档中有一个关于何时发生的定义的问题)。Close命令只是释放所有内部堆栈资源(并在需要时使用RST发送/响应-不确定确切时间)。