我正在尝试编写一个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
答案 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标头不正确。