每个 HTTP 请求都使用一个单独的 TCP 连接

Posted

技术标签:

【中文标题】每个 HTTP 请求都使用一个单独的 TCP 连接【英文标题】:Every HTTP request uses a separate TCP connection 【发布时间】:2012-06-06 15:40:00 【问题描述】:

观察:

我的 Web 应用程序正在 JBoss 中运行。

由于图片等原因,每次用户点击都会产生 >5 个 HTTP 请求。

在服务器上运行 netstat 表明正在为每个 HTTP 请求打开一个新的 TCP 连接(基本上我正在查看来自端口 80 上客户端 IP 的 TCP 连接总数)。

事实:

JBoss HTTP 协议设置为 1.1。

我检查过 FF、IE9 和 Chrome - 所有浏览器都这样做。

我有两个测试环境 - 一个在 Windows7 上运行,另一个在 CentOS 上运行。我在两者中都看到了相同的行为。

我想要完成的事情

持久的 TCP 连接,因为希望这将 a) 增强用户体验 b) 减少服务器上的负载

此时,我不确定我应该将哪些代码、配置详细信息或日志附加到问题中,但如果您让我知道,我会提供。任何形式的帮助表示赞赏。

附言从标题TCP connection is not reused for HTTP requests with HttpURLConnection 来看,这个线程似乎很有希望,但它主要处理客户端。

【问题讨论】:

你能看看流量吗?你能检查客户端和服务器发送的连接HTTP头吗? 嗨菲利普,感谢您的回复。我应该查看哪些标题项?我可能会使用 HttpServletRequest 和 HttpServletResponse getHeader(String header) 方法。如果有更快的方法可以做到这一点,我将有兴趣了解这一点。感谢您的帮助! @PhilippeMarschall 请求标头:检查以下项目 1) Cookie -> JSESSIONID=blah-blah, 2) Connection -> keep-alive, 3) Cache-Control -> null, 4) pragma - > 空 我通常使用的是tcpdumpd和Wireshark的组合,然后跟随tcpstream。这使我可以查看通过 tcp 连接发出的请求。然后我查看客户端和服务器发送的 Close 标头 w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.10。我寻找“连接:关闭”标题。是客户端还是服务器发送一个? firebug、fiddler 或 httpwatch 等浏览器端工具也会为您提供这些数据。 【参考方案1】:

我想我已经找到了解决方案。感谢您的指点和建议。他们真的很有帮助。

第 1 部分: 我在 Firefox 中使用了 HttpFox 插件来查看响应标头。 Philippe 怀疑 Connection 标头的值为“close”。

第 2 部分: 在我自己的过滤器中添加一行代码来更改响应标头并没有帮助。所以我下载并添加了 jbossWebService.jar 到 WEB-INF/lib 目录,以便使用 org.jboss.web.tomcat.filters.ReplyHeaderFilter 类。 (在 JBoss 7 之前,显然这个包默认包含在 JBoss 中。)在我的 web.xml 中添加了以下内容:

<filter>

<filter-name>CommonHeadersFilter</filter-name>

<filter-class>

org.jboss.web.tomcat.filters.ReplyHeaderFilter</filter-class>

<init-param>

     <param-name>Connection</param-name>

     <param-value>keep-alive</param-value>

</init-param>

</filter>

这成功了(嗯,几乎)。现在,浏览器的第一次“点击”会产生大约 4 个 TCP 连接——不确定这个数字的原因,因为每次点击都会产生 >=7 个 http 请求。但所有后续点击,如果在 ttl 周期(15 秒)内执行,则不会生成额外的 TCP 连接。我想,按照菲利普的建议,进行更彻底的调查会揭示一些东西。但在这一点上,我必须继续前进。因此,我暂时将这个问题标记为已回答。如果以后需要,我会重新打开它。

【讨论】:

大多数现代浏览器每个主机名最多可同时打开 4-8 个连接,以加快从同一主机加载多个文件的速度。您可以在Browserscope 上找到有关每个浏览器行为的详细信息。 @MartinodF 这是非常有用的信息(您的评论以及 Browserscope 项目)!非常感谢你!我现在考虑解决这个问题。

以上是关于每个 HTTP 请求都使用一个单独的 TCP 连接的主要内容,如果未能解决你的问题,请参考以下文章

HTTP2的特性解析

http1.0与http1.1的区别

通过wireshark抓包来讲解HTTP中Connection: keep-alive头部的作用

2016/9/26复习支持点

Go: HTTP何时才会复用TCP 连接

http keep - alive 与 长连接