这个HTTP标头错了吗?

时间:2012-07-13 19:29:27

标签: http http-headers bittorrent

我正在尝试编写一个torrent下载程序,需要找出如何联系跟踪器。我使用Fiddler2程序拦截从Vuze发送到它的跟踪器的跟踪器请求。

在发送的消息中(如下所示),Connection标头被声明两次,具有不同的值。

这是否正确使用了Connection标头? Connection:keep-alive做什么?

GET /announce?info_hash=0Z%22...&azver=3&azas=12576 HTTP/1.1
User-Agent: Azureus 4.7.0.2;Windows 7;Java 1.6.0_31
Connection: close
Accept-Encoding: gzip
Host: tracker.update.vuze.com:6969
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

4 个答案:

答案 0 :(得分:3)

来自RFC2616第4.2节:

  

可能存在具有相同字段名称的多个消息头字段   在消息中,当且仅当该标头的整个字段值   字段被定义为以逗号分隔的列表[即,#(值)]。它必须   可以将多个标题字段合并为一个   “field-name:field-value”对,不改变语义   消息,通过将每个后续字段值附加到第一个,每个   用逗号分隔。头字段具有相同的顺序   因此,接收字段名称对于解释是重要的   组合字段值,因此代理不得改变   转发邮件时这些字段值的顺序。

编辑:

根据第14.10节,Connection是一个字段名称,因此具有多个Connection标头在技术上是正确的

从14.10开始,Connection标头的语法生成为Connection = "Connection" ":" 1#(connection-token),因此一个或多个逗号分隔的标记 有效。

但实际上,可能会忽略第二个Connection标头,因此Web服务器将在发送响应后关闭底层TCP连接。

对于HTTP 1.1,默认模式是服务器保持底层TCP连接为后续请求打开,尽管许多服务器将限制在关闭连接之前发出的请求总数。

答案 1 :(得分:2)

HTTP 1.1允许多个Connection标头。多个这样的头文件的语义被定义为与单个头文件相同,所有值都用逗号连接在一起,例如。

Connection: close
Connection: keep-alive

与:

相同
Connection: close,keep-alive

从技术上讲,这些标题很好。但是,我将在没有做过一些实验的情况下进行预测,那里会有很多服务器(特别是没有经过良好测试的服务器,如torrent跟踪器)会忽略其中任何一个标头。

现在,更深层次的问题是“keep-alive”是一些http 1.0扩展,并且有点与“close”相矛盾,所以我猜这个组合只是torrent客户端中的一个bug。我想大多数跟踪器无论如何都不会允许持久连接,所以我认为下注的方法是让我只有一个“Connection:close”标题。

答案 2 :(得分:0)

有两个连接标题字段很奇怪。我认为你只能期望一种非确定性的行为,因为这种情况的处理完全取决于Web服务器的实现。 它最终可能会包含存储字段的2个中的任何一个(比方说)。

基本上,keep alive意味着允许浏览器维护与服务器的连接并继续检索图像,脚本。通常情况并非如此。通常,在请求响应后,将关闭与Web服务器的连接。

答案 3 :(得分:0)

Connection: Close

表示在请求完成后关闭连接。

Connection: keep-alive

表示保持连接打开以供将来请求使用。

您应该只有一个Connection参数。

因此HTTP标头不正确。