这个HTTP头是错的吗?

这个HTTP头是错的吗?,http,http-headers,bittorrent,Http,Http Headers,Bittorrent,我正在尝试编写一个torrent downloader,需要了解如何联系追踪者。我使用Fiddler2程序截获了从Vuze发送到其跟踪器的跟踪器请求 在发送的消息(如下所示)中,使用不同的值声明连接头两次 这是否正确使用了连接头? 连接:保持活动状态做什么 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

我正在尝试编写一个torrent downloader,需要了解如何联系追踪者。我使用Fiddler2程序截获了从Vuze发送到其跟踪器的跟踪器请求

在发送的消息(如下所示)中,使用不同的值声明连接头两次

这是否正确使用了连接头? 连接:保持活动状态做什么

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

有两个连接头字段很奇怪。我认为您只能期待一种不确定的行为,因为这种情况的处理完全取决于web服务器的实现。 它可能会以hashmap中存储字段的2个字段中的任意一个结束

基本上,“保持活动”意味着允许浏览器保持与服务器的连接,并通过它不断检索图像、脚本。通常情况并非如此。通常,在请求得到响应后,与web服务器的连接将关闭

Connection: Close
表示在请求完成后关闭连接

Connection: keep-alive
意味着保持连接打开以备将来请求

您应该只有一个连接参数


因此,HTTP头是不正确的

来自RFC2616第4.2节:

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

编辑:

根据第14.10节,连接是这样一个字段名,因此具有多个连接头在技术上是正确的

从14.10开始,连接头的语法生成是
Connection=“Connection”“:“1”(连接令牌)
,因此一个或多个逗号分隔的令牌是有效的

然而,在实践中,第二个连接头可能会被忽略,因此,一旦发送响应,web服务器将期望关闭底层TCP连接


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

HTTP 1.1允许多个连接头。多个此类头的语义定义为与单个头相同,所有值都用逗号连接在一起,例如

Connection: close
Connection: keep-alive
同:

Connection: close,keep-alive
所以从技术上讲,这些标题是好的。然而,在没有做一些实验的情况下,我将在此预测,将会有很多服务器(特别是测试不太好的服务器,如torrent trackers),它们将忽略这些头中的任何一个


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

你错了,连接标题是用逗号分隔的列表定义的。谢谢。你是对的;我已经根据RFC中的语法结果澄清了我的答案。