【问题标题】:How to test HTTP Keep alive is actually working如何测试 HTTP Keep alive 确实有效
【发布时间】:2011-05-13 15:09:07
【问题描述】:

我知道 HTTP keep-alive 在 HTTP 1.1 中默认开启,但我想找到一种方法来确认它确实有效。

有谁知道从网络浏览器进行测试的简单方法(例如如何理解wireshark)。我知道我需要通过同一个 TCP 连接查找多个 HTTP 请求,但我不知道如何在 wireshark 或任何其他方式中确认。

谢谢!

【问题讨论】:

    标签: http wireshark keep-alive


    【解决方案1】:

    作为Ron Garrity said on ServerFault,你可以像这样使用Curl

    curl -Iv http://www.aptivate.org 2>&1 | grep -i 'connection #0'
    

    如果 keep-alive 工作,它会输出这两行:

    * Connection #0 to host www.aptivate.org left intact
    * Closing connection #0
    

    如果 keep-alive 不起作用,那么它只会输出这一行:

    * Closing connection #0
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 Windows Vista 或更高版本,则可以使用资源管理器。网络选项卡将列出所有打开的 TCP 连接以及它们启动的进程。打开带有一个选项卡的浏览器,浏览到您的页面并进行测试。

      【讨论】:

      • 谢谢。我没有资源管理器(我认为那是用于服务器的),但我使用了来自 sysinternals 的 TCPView。它有帮助(尽管仍然令人困惑!!!)
      • 你也可以只运行netstat
      【解决方案3】:

      首先,尝试在 Wireshark 中捕获目标网站的流量,并使用以下过滤器将其限制在您需要的范围内:

      tcp port 80 and host targetwebsite.com
      

      然后在浏览器中加载页面或通过您拥有的任何工具获取它。如果目标网页会自行刷新或刷新其中的某个值,请将其保持打开状态,直到其中至少有一项更改。

      现在您有足够的数据,您可以停止在 Wireshark 中捕获程序。

      您应该看到几十条记录,它们的协议应该是 TCP 或 HTTP。出于快速简单检查的目的,您不需要 TCP 记录。因此,让我们通过应用另一个过滤器来删除它们。在窗口顶部有一个“过滤器”字段。在此处输入 http,wireshark 将隐藏除具有 HTTP 协议的记录之外的所有记录。

      现在选择一条记录并查看下一级详细信息,您可以在所有记录下方的第二个框中找到该详细信息。为了确保您查看的是正确的位置,那里的第一行以“Frame XYZ”开头。第四行以“传输控制协议”开头。在“SRC 端口”和“DST 端口:”之后查找端口号。根据记录,其中一个数字属于网络服务器(通常为 80),另一个显示您的端口号。

      现在检查几个不同的 GET 记录。要了解请求是否为 GET 记录,请检查 Info 列。如果你端的端口号被多次使用,那么所有这些请求都是通过 HTTP keepalive 发出的。

      请记住,大多数浏览器会打开多个连接,即使网络服务器支持 keepalive。所以,不要只找到一个不同的端口来结束您的评估。

      【讨论】:

        【解决方案4】:
        1. 最准确的方法是多次curl同一个网址。
        curl -v http://weibo.com -o /dev/null http://weibo.com -o /dev/null
        

        如果输出包含Re-using existing connection,则 HTTP 保持活动功能正在工作。例如,

        * TCP_NODELAY set
        * Connected to weibo.com (180.149.138.251) port 80 (#0)
        > GET / HTTP/1.1
        > Host: weibo.com
        > User-Agent: curl/7.68.0
        > Accept: */*
        > 
        * Mark bundle as not supporting multiuse
        < HTTP/1.1 301 Moved Permanently
        < ...
        < ...
        < 
        { [236 bytes data]
        * Connection #0 to host weibo.com left intact
        * Found bundle for host weibo.com: 0x56324121d9a0 [serially]
        * Can not multiplex, even if we wanted to!
        * Re-using existing connection! (#0) with host weibo.com
        * Connected to weibo.com (180.149.138.251) port 80 (#0)
        > GET / HTTP/1.1
        > Host: weibo.com
        > User-Agent: curl/7.68.0
        > Accept: */*
        > 
        * Mark bundle as not supporting multiuse
        < HTTP/1.1 301 Moved Permanently
        < ...
        < ...
        < 
        { [236 bytes data]
        * Connection #0 to host weibo.com left intact
        
        1. 另一种快速方法是使用ab 进行测试。但是一些 HTTP 服务器可能不会返回 Connection: keep-alive 标头,即使它们已经打开了 keep-alive 功能,例如 uwsgi。在这种情况下,ab 不会发送保持活动的请求。这使得ab 只能对 HTTP keep-alive 进行“肯定”检测。
        ab -c 5 -n 50 -k https://www.google.com/
        

        如果结果显示

        ...
        Complete requests:      50
        Failed requests:        0
        Keep-Alive requests:    50    # Pay attention to this line
        Total transferred:
        ...
        

        然后启用HTTP keep-alive。

        【讨论】:

          猜你喜欢
          • 2016-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-08
          • 1970-01-01
          相关资源
          最近更新 更多