2011-06-01 183 views
3

如何正确处理客户端Connection: close请求字段?截至目前,如果我得到这个特定的领域,我关闭套接字并等待来自客户端的以下请求,而不是再次回复并开始提供数据。如何在HTTP文件服务器上正确处理客户端“连接:关闭”请求?

我不知道为什么我的客户端/服务器通信不能像我测试过的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 

客户端/ ApacheServer交际:

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.. ..........<[email protected] (.h.$.J...1...i....A. ......c....a.9..!g.N...A. ........ ....>......|.......8....a......|..|N.............'>[email protected] .e...r.iL..#..IH...pR|. 

回答

5

是关闭套接字是正确的采取行动。如果客户端正确使用该头部,他们会在收到响应后关闭套接字。

我在这里注意到的是,您的服务器不返回Content-Length标题。即使客户端发出HEAD请求,based on the W3C proposal (sec. 9.4)

中包含的元信息的HTTP标头 响应于HEAD请求 应该是相同的,以响应于GET请求发送的信息 。 此方法可用于获取 有关实体 的元信息,该请求暗示请求没有 传输实体主体本身。 此方法通常用于测试 有效性的超文本链接, 可访问性和最近的 修改。

到HEAD请求的响应可以是在这个意义上 缓存包含在响应 的 信息可被用于更新从该资源的先前 高速缓存的实体。如果 新的字段值表明 缓存的实体从目前 实体的不同(如将在内容长度,内容,MD5, ETag的或上次修改一个 变化来表示),那么缓存 必须把缓存条目为陈旧。

这里的关键是要确保你告诉客户端的响应的大小,而不实际发送数据。

+0

啊!我没有注意到HEAD和GET。在我的HTTP服务器上,我读取了HEAD和GET请求,但我不确定为什么当我使用Apache服务器并使用Wireshark捕获数据时,我没有收到HEAD请求......也许某种方式Wireshark没有捕获它? – Jona 2011-06-01 20:40:24

+0

其实我回来了!是的,Wireshark没有读取HEAD请求... :) – Jona 2011-06-01 20:41:44

+0

我无意中忽略了长度字段。感谢你的帖子,我注意到客户端的两个请求实际上存在差异。一个HEAD和另一个GET。现在我可以阅读并正确处理客户端请求。 – Jona 2011-06-01 21:03:34

2

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

+0

是的,您是正确的我应该将其保留为http 1.1以让客户知道我支持持续连接。 – Jona 2011-06-01 21:01:35

3

连接:关闭标头只是意味着客户端在发送响应后希望您关闭连接这也免除了您必须发送Content-Length:标头。

1

如果使用HTTP 1.0,存在作为alexrs指出,相反,Connection: keep-alive正在用HTTP 1.0没有使用持久连接。在HTTP 1.1上,您不需要这样做,因为默认情况下,HTTP连接持续存在于HTTP 1.1

8.1.2总体经营

之间的HTTP/1.1和更早版本的HTTP 的显著差异是永久连接是任何HTTP连接 的默认行为。也就是说,除非另有说明,否则客户端应该假设服务器将在服务器出现错误响应后保持持久连接,即使是 。

持续连接提供了一种机制,通过该机制,客户端和服务器可以发信号通知TCP连接关闭。该信令使用Connection头字段(第14.10节)取得 的位置。一旦发送了关闭 的信号,客户端绝不能在该连接上发送更多请求。

你可以看一下HTTP 1.1 RFC;

RFC for HTTP 1.1

相关问题