Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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
Sockets HTTP/1.1如何解决TCP重置问题?_Sockets_Http_Tcp_Network Programming_Persistent Connection - Fatal编程技术网

Sockets HTTP/1.1如何解决TCP重置问题?

Sockets HTTP/1.1如何解决TCP重置问题?,sockets,http,tcp,network-programming,persistent-connection,Sockets,Http,Tcp,Network Programming,Persistent Connection,我正试图了解以下内容中提到的TCP重置问题: 6.6。拆除 连接头字段(第6.1节)提供“关闭” 发件人希望关闭时应发送的连接选项 当前请求/响应对之后的连接 因此HTTP/1.1具有持久连接,这意味着可以在同一个连接上发送多个HTTP请求/响应对 发送“关闭”连接选项的客户端不得进一步发送 关于该连接的请求(在包含“关闭”的连接之后),以及 必须在读取最终响应消息后关闭连接 与此请求相对应 接收“关闭”连接选项的服务器必须启动 在发送最终响应后关闭连接(见下文) 对于包含“关闭”的请求。服务器

我正试图了解以下内容中提到的TCP重置问题:

6.6。拆除

连接头字段(第6.1节)提供“关闭” 发件人希望关闭时应发送的连接选项 当前请求/响应对之后的连接

因此HTTP/1.1具有持久连接,这意味着可以在同一个连接上发送多个HTTP请求/响应对

发送“关闭”连接选项的客户端不得进一步发送 关于该连接的请求(在包含“关闭”的连接之后),以及 必须在读取最终响应消息后关闭连接 与此请求相对应

接收“关闭”连接选项的服务器必须启动 在发送最终响应后关闭连接(见下文) 对于包含“关闭”的请求。服务器应该发送一个 “关闭”连接选项在其对该连接的最终响应中。 服务器不得处理在该服务器上收到的任何进一步请求 连接

因此,客户端通过在最后一个HTTP请求中添加
connection:close
头字段来发出关闭连接的信号,并且只有在接收到HTTP响应确认服务器接收到请求后才关闭连接

发送“关闭”连接选项的服务器必须启动关闭 在发送包含 “关闭”。服务器不得处理在上收到的任何其他请求 这种联系

接收到“关闭”连接选项的客户端必须停止发送 请求该连接,并在读取 包含“关闭”的响应消息;如果附加管道 请求已在连接上发送,客户端不应假定 它们将由服务器处理

因此,服务器通过在最后一个HTTP响应中添加
connection:close
头字段来发出关闭连接的信号,并关闭连接但它只有在收到确认客户端收到HTTP响应的消息后才会关闭连接?

如果服务器立即关闭TCP连接,则 客户将无法阅读最后一页的重大风险 HTTP响应。如果服务器从客户端接收到其他数据 在完全关闭的连接上,例如由 客户端在收到服务器的响应之前,服务器的TCP 堆栈将向客户端发送重置数据包;不幸的是,重置 数据包可能会在之前擦除客户端未确认的输入缓冲区 它们可以由客户端的HTTP解析器读取和解释

因此,在服务器启动关闭连接的情况下,如果服务器在向初始HTTP请求发送带有
connection:close
头字段的HTTP响应后立即完全关闭连接,然后,客户端可能不会收到该HTTP响应,因为它收到了对在初始HTTP请求之后发送的后续HTTP请求的TCP重置数据包响应但是,对后续HTTP请求的TCP重置数据包响应如何先于对初始HTTP请求的HTTP响应?

为了避免TCP重置问题,服务器通常会关闭连接 分阶段进行。首先,服务器仅通过关闭来执行半关闭 读/写连接的写端。那么服务器呢 继续从连接读取数据,直到收到 客户端关闭相应的服务器,或直到服务器合理关闭 确定其自己的TCP堆栈已收到客户端的 确认包含服务器最后一个数据包的数据包 答复。最后,服务器完全关闭连接

因此,在服务器启动关闭连接的情况下,服务器仅在向初始HTTP请求发送带有
connection:close
头字段的HTTP响应后立即关闭连接的写入端,并且,只有在通过
连接:close
头字段接收到后续相应的HTTP请求后,或者在等待足够长的时间以假设它收到了确认客户端收到HTTP响应的TCP消息后,它才会关闭连接的读取端但是为什么客户机在收到带有
连接:关闭
头字段的HTTP响应后,会发送带有
连接:关闭
头字段的后续相应HTTP请求,而第5段中指出:“接收到“关闭”的客户机”连接选项必须停止在该连接上发送请求“?

不知道重置问题是TCP独有的还是可能的 也可以在其他传输连接协议中找到

但是,为什么客户端在接收到带有Connection:close头字段的HTTP响应后,会发送带有Connection:close头字段的后续相应HTTP请求,而第5段指出:“接收“close”连接选项的客户端必须停止在该连接上发送请求”

通过HTTP管道,客户机可以发送新的请求,即使之前请求的响应(以及此响应中的
连接:close
)尚未收到。这是一个轻微的优化,只在收到前一个请求的响应后发送下一个请求,但它会带来服务器无法处理此新请求的风险

但是,对后续HTTP请求的TCP重置数据包响应如何先于对初始HTTP请求的HTTP响应

虽然TCP RST将在响应之后发送,但它将提前传播到应用程序。如果新数据到达至少已关闭读取的套接字(即
close(fd)
shutdown(fd,shuth)时,发送TCP RST