如何测试HTTP Keep alive是否有效

17

我知道HTTP 1.1默认开启了keep-alive,但是我想找到一种确认它是否真正起作用的方法。

有人知道从Web浏览器中测试的简单方法吗(例如如何理解Wireshark)? 我知道需要在同一个TCP连接上查找多个HTTP请求,但我不知道如何在wireshark或其他任何方式中确认它。

谢谢!

4个回答

28

Ron Garrity在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

4

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


谢谢。我没有资源管理器(我认为那是给服务器用的),但我使用了来自Sysinternals的TCPView。它有所帮助(尽管仍然很困惑!!!) - sub
你也可以直接运行 netstat - Brad

2
最准确的方法是多次使用curl访问同一个URL。
curl -v http://weibo.com -o /dev/null http://weibo.com -o /dev/null

如果输出包含Re-using existing connection,则HTTP keep-alive功能正在工作。例如:

* 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服务器即使已经开启了keep-alive功能(如uwsgi),它们可能不会返回Connection: keep-alive头文件。在这种情况下,ab不会发送keep-alive请求,这使得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。


1

首先,尝试在Wireshark中捕获目标网站的流量,并使用过滤器将其限制为所需内容,例如:

tcp port 80 and host targetwebsite.com

然后在浏览器中加载页面或使用任何工具获取它。如果目标网页自动刷新或其中一个值发生更改,请保持其打开,直到您至少有一个更改。
现在您已经有足够的数据,可以停止在Wireshark中捕获过程。
您应该看到数十条记录,它们的协议应为TCP或HTTP。为了进行快速简单的检查,您将不需要TCP记录。因此,通过应用另一个过滤器来删除它们。在窗口顶部有一个“筛选器”字段。在那里输入http,Wireshark将隐藏所有记录,但那些具有HTTP协议的记录。
现在选择一条记录并查看下一级细节,您可以在所有记录下方的第二个框中找到它们。只是为了确保您正在查看正确的位置,第一行以“Frame XYZ”开头。第四行以“传输控制协议”开头。查找“SRC Port”和“DST Port:”后面的端口号。根据记录的不同,其中之一属于Web服务器(通常为80),而另一个显示您端口号。
现在检查几个不同的GET记录。要知道请求是否为GET记录,请检查Info列。如果您的端口号被多次使用,则所有这些请求都是通过HTTP keepalive进行的。
请记住,大多数浏览器即使Web服务器支持keepalive也会打开多个连接。因此,不要仅通过找到一个不同的端口来得出评估结论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接