我想在 Linux 机器上查看从 Apache(侦听端口 80)发送到 Tomcat(端口 4080)的 HTTP 标头。
根据维基百科,
标头字段是明文字符串格式的以冒号分隔的名称-值对。
我尝试了以下tcpdump
命令的一些变体:
$ sudo tcpdump -lnX dst port 4080 -c 10
11:29:28.605894 IP SOME_IP.33273 > SOME_IP.4080: P 0:49(49) ack 1 win 23 <nop,nop,timestamp 1191760962 509391143>
0x0000: 4500 0065 3a9f 4000 3f06 0084 628a 9ec4 E..e:.@.?...b...
0x0010: 628a 9c97 81f9 0ff0 9e87 eee0 144b 90e1 b............K..
0x0020: 8018 0017 fb43 0000 0101 080a 4708 d442 .....C......G..B
0x0030: 1e5c b127 4845 4144 202f 6461 7070 6572 .\.'HEAD./dapper
0x0040: 5f73 6572 7669 6e67 2f41 644d 6f6e 6b65 _serving/AdMonke
0x0050: 793f y?
结果总是一样的 - 乱码和英文单词(例如HEAD
)的奇怪组合。
如何以人类可读的格式查看标题?
这是我想出的用于显示请求和响应 HTTP 标头的单行代码
tcpdump
(它也适用于您的情况):它限制在 10Kb 处截断数据包并且只知道 GET、POST 和 HEAD 命令,但在大多数情况下这应该足够了。
编辑:修改它以消除每一步的缓冲区,使其更具响应性。不过现在需要 Perl 和 stdbuf,所以如果您没有这些,请使用原始版本: 编辑:将脚本端口目标从 80 更改为 4080,以实际监听已经通过 apache 的流量,而不是直接到达端口的外部流量80:
一些解释:
您可以通过使用获得接近您想要的东西
-A
,例如请记住使用
-s 0
以确保您获得整个数据包。或者,您可以使用
wireshark
交互方式查看标题。尝试使用http://justniffer.sourceforge.net/ 它是更好的工具或带有“跟随 TCP 流”选项的 Wireshark,有比 tcpdump 更好的选项来查看标头(请求/响应)