繁体   English   中英

如何正确处理 HTTP 文件服务器上的客户端“连接:关闭”请求?

[英]How to properly handle client “Connection: close” request on HTTP file server?

如何正确处理客户端Connection: close请求字段? 到目前为止,如果我得到这个特定字段,我会关闭套接字并等待来自客户端的以下请求,而不是再次回复并开始提供数据。

我不知道为什么我的客户端/服务器通信不像我测试的 Apache 服务器那样工作。

感谢您的任何澄清...

客户端/服务器通信:

CLIENT:
HEAD /stream.mpeg HTTP/1.0
Host: 127.0.0.1
User-Agent: SuperPlayer
Connection: Close

SERVER:
HTTP/1.0 200 OK 
Date: Wed, 1 Jun 2011 20:05:13 GMT
Server: HTTP Server
Last-Modified: Mon, 06 Aug 2009 01:02:23 GMT
Accept-Ranges: bytes
Connection: Close
Content-Type: audio/mpeg

CLIENT:
HEAD /stream.mpeg HTTP/1.0
Host: 127.0.0.1
User-Agent: SuperPlayer
Connection: Close

SERVER:
HTTP/1.0 200 OK 
Date: Wed, 1 Jun 2011 20:05:13 GMT
Server: HTTP Server
Last-Modified: Mon, 06 Aug 2009 01:02:23 GMT
Accept-Ranges: bytes
Connection: Close
Content-Type: audio/mpeg

231489172304981723409817234981234acvass123412323
21312hjdfaoi8w34yorhadl4hi8rali45mhalo3i,wmotw
345fqw354aoicu43yocq2i3hr

客户端/Apache服务器通信:

CLIENT:
GET /test.mp3 HTTP/1.0
Host: 192.168.1.120
User-Agent: SuperPlayer
Connection: Close

SERVER:
HTTP/1.1 200 OK
Date: Wed, 01 Jun 2011 19:15:11 GMT
Server: Apache/2.2.16 (Win32)
Last-Modified: Thu, 29 Apr 2010 21:06:34 GMT
ETag: "14000000047049-4f75c8-4856680636a80"
Accept-Ranges: bytes
Content-Length: 5207496
Connection: close
Content-Type: audio/mpeg

...d.....<).0.. ..........<.@.. ( .h.$.J...1...i....A. ......c....a.9..!g.N...A. ........ ....>......|.......8....a......|..|N.............'>........?...C.....@..TJt.n .e...r.iL..#..IH...pR|.

是的,关闭套接字是正确的做法。 如果客户端正确使用此 header,则一旦收到您的响应,他们就会关闭套接字。

我在这里注意到的是您的服务器没有返回Content-Length header。 即使客户端发出 HEAD 请求,基于 W3C 提议(第 9.4 节)

响应 HEAD 请求的 HTTP 标头中包含的元信息应该与响应 GET 请求时发送的信息相同。 此方法可用于获取有关请求所隐含的实体的元信息,而无需传输实体主体本身。 这种方法通常用于测试超文本链接的有效性、可访问性和最近的修改。

对 HEAD 请求的响应可能是可缓存的,因为响应中包含的信息可以用于从该资源更新先前缓存的实体。 如果新字段值表明缓存的实体与当前实体不同(如 Content-Length、Content-MD5、ETag 或 Last-Modified 的变化所表明的那样),则缓存必须将缓存条目视为陈旧的。

这里的关键是确保您在没有实际发送数据的情况下告诉客户端响应的大小

Connection: close header 仅表示客户端希望您在发送响应后关闭连接。 这也免除了您必须发送内容长度:header。

如果您使用的是HTTP 1.0 ,则没有像alexrs指出的持久连接,而是Connection: keep-aliveHTTP 1.0一起使用。 HTTP 1.1上,您不需要这样做,因为 HTTP 连接默认情况下在HTTP 1.1上是持久的。

8.1.2 整体运作

HTTP/1.1 和早期版本的 HTTP 之间的一个显着区别是持久连接是任何 HTTP 连接的默认行为。 也就是说,除非另有说明,否则客户端应该假设服务器将保持持久连接,即使在服务器的错误响应之后也是如此。

持久连接提供了一种机制,客户端和服务器可以通过该机制发出 TCP 连接关闭的信号。 该信令使用 Connection header 字段(第 14.10 节)进行。 一旦发出关闭信号,客户端就不能再在该连接上发送任何请求。

您可以查看HTTP 1.1 RFC

HTTP 1.1 的 RFC

请问您为什么在请求中使用http 1.0 在 http 1.0 中没有持久连接,所以服务器应该在响应后终止 TCP 连接,无论你发送Connection: close与否。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM