2

我正在尝试编写一个 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

4 回答 4

3

从 RFC2616 第 4.2 节:

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

编辑:

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

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

然而,在实践中,可能会忽略第二个 Connection 标头,因此 Web 服务器将期望在发送响应后关闭底层 TCP 连接。

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

于 2012-07-13T19:43:12.423 回答
2

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

Connection: close
Connection: keep-alive

是相同的:

Connection: close,keep-alive

所以从技术上讲,这些标题很好。但是,我将在没有进行一些实验的情况下在此预测,将会有很多服务器(尤其是没有经过很好测试的服务器,例如洪流跟踪器)将忽略这些标头中的任何一个。

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

于 2013-11-18T01:35:22.197 回答
0

有 2 个连接标题字段很奇怪。我认为你只能期待一个不确定的行为,因为这种情况的处理完全取决于 Web 服务器的实现。它可能以存储字段的哈希映射中的任何一个(比如说)结束。

基本上,保持活动状态意味着允许浏览器保持与服务器的连接并继续检索图像、脚本。通常情况并非如此。通常,在请求得到响应后,与 Web 服务器的连接会关闭。

于 2012-07-13T19:36:08.310 回答
0
Connection: Close

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

Connection: keep-alive

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

您应该只有一个 Connection 参数。

因此,HTTP 标头不正确。

于 2012-07-13T19:37:30.193 回答