我有一个简单的 CGI 脚本,可以输出简单的文本内容。它是用 Perl 编写的,使用CGI
模块,并且仅指定最基本的标头:
print $q->header(
-type => 'text/plain',
-Content_length => $length,
);
print $stuff;
功能上没有明显的问题 - 用户代理和服务器都没有抱怨,但我对 Wireshark 无法将 HTTP 响应识别为 HTTP 感到困惑 - 它被标记为 TCP。
以下是请求和响应,如“跟随 TCP 流”对话框所示:
GET /cgi-bin/memfile/memfile.pl?mbytes=1 HTTP/1.1
Host: 10.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: cs,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
HTTP/1.1 200 OK
Date: Thu, 05 Apr 2012 18:52:23 GMT
Server: Apache/2.2.15 (Win32) mod_ssl/2.2.15 OpenSSL/0.9.8m
Content-length: 1048616
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/plain; charset=ISO-8859-1
XXXXXXXX...
这是数据包概览)
No. Time Source srcp Destination dstp Protocol Info tcp.stream abstime
5 0.112749 10.0.0.1 80 10.0.0.2 48072 TCP [TCP segment of a reassembled PDU] 0 20:52:23.228063
Frame 5: 1514 bytes on wire (12112 bits), 1514 bytes captured (12112 bits)
Ethernet II, Src: 00:12:34:56:78:9a, Dst: 00:12:34:56:78:9b
Internet Protocol Version 4, Src: 10.0.0.1 (10.0.0.1), Dst: 10.0.0.2 (10.0.0.2)
Transmission Control Protocol, Src Port: http (80), Dst Port: 48072 (48072), Seq: 1, Ack: 330, Len: 1460
现在,当我在 Wireshark 中打开流时:
- 前三个数据包是通常的 TCP 握手
- 第四个数据包中的 GET 请求显示为 HTTP,并在“信息”字段中显示
GET /cgi-bin/memfile/memfile.pl
,正如我所料 - 第五个数据包包含响应,但未标记为 HTTP 响应。我期望信息字段是“HTTP 200 OK”之类的内容,但只有一个通用的“[重新组装的 PDU 的 TCP 段]”。真正的不便之处在于这个数据包没有被“http.response”过滤器捕获
有人能解释一下为什么 Wireshark 无法识别第五个数据包的 HTTP 属性吗?响应有问题吗?
答案1
我自己也遇到过同样的问题,发现答案在Wireshark问答中:
您可以通过禁用 TCP 协议首选项中的“允许子解析器重新组合 TCP 流”来让 Wireshark 立即显示 HTTP 响应(禁用该选项后您需要重新启动 Wireshark)。
答案2
解释为什么Zorel 的回答....
当 WireShark 偏好重组多包消息时,它并不知道这些消息是HTTP 直到它看到所有内容并且重组完成。
因此,数据包首先被报告为 TCP(确实是 TCP),重组后再次被报告为 HTTP。
在重新组装的行中你应该看到类似这样的内容:
Frame 10: ...
...
[3 Reassembled TCP segments (2496 bytes): #8(316), #9(1324), #10(856)]
Hypertext Transfer Protocol
...
它指示哪些记录编号以及每个记录编号提供多少个字节来构成重新组装的条目。
在你的情况下,响应是1048616
字节,所以在它之前会有很多数据包知道它是 HTTP。您指定的条目确实说:
[TCP segment of a reassembled PDU]
这再次表明 WireShark 正在推迟该消息的最终显示。