本文记录一下通过 tcpdump 工具,抓取 https 的报文。
以站点 http://nghttp2.org 为例,输入一下脚本:
tcpdump port 80 and host nghttp2.org -w h2c.pcap
curl http://nghttp2.org --http2 -v
生成 h2c.pcap 文件,可以通过 wireshark 抓包工具进行导入分析。
附录1:tcpdump 指令
基本指令
- -D 列举所有的网卡设备
- -i 选择网卡设备
- -c 抓取多少条报文
- –time-stamp-precision 指定捕获时的时间精度,默认毫秒 micro,可选纳秒 nano
- -s 指定每条报文的最大字节数,默认 262144 字节
文件操作
- -w 输出结果至文件
- -C 限制输入文本的大小
- -W 指定输出文字的最大数量,到达后重新覆写第一个文件
- -G 指定每隔 N 秒就重新输出新文件
- -r 读取一个抓包文件
- -V 将待读取的多个文件写入一个文件中,通过读取该文件同时读取多个文件
分析信息详情
- -e 显示数据链路层头部
- -q 不显示传输层信息
- -v 显示网络层头部更多信息,如 TTL、id等
- -n 显示 IP 地址、数字端口代替 hostname 等
- -S TCP信息以绝对序列号代替相对序列号
- -A 以 ASCII 方式显示报文内容,使用 HTTP 分析
- -x 以 16 进制方式显示报文内容,不显示数据链路层
- -xx 以 16 进制方式显示报文内容,显示数据链路层
- -X 同时以 16 进制及 ASCII 方式显示报文内容,不显示数据链路层
- -XX 同时以 16 进制及 ASCII 方式显示报文内容,显示数据链路层
示例: tcpdump -i lo -c 5 -X // 输入如下抓包指令 curl localhost // 通过 curl 工具发送请求
附录2:tcpdump 分析http 三次握手
tcpdump -i lo0 port 8888 -c 3 -S
curl localhost:8888
可以查看到如下报文:
? ~ tcpdump -i lo0 port 8888 -c 3 -S
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
12:09:33.396424 IP6 localhost.49791 > localhost.ddi-tcp-1: Flags [S], seq 997481431, win 65535, options [mss 16324,nop,wscale 6,nop,nop,TS val 4021779536 ecr 0,sackOK,eol], length 0
12:09:33.396441 IP6 localhost.ddi-tcp-1 > localhost.49791: Flags [R.], seq 0, ack 997481432, win 0, length 0
12:09:33.396521 IP localhost.49792 > localhost.ddi-tcp-1: Flags [S], seq 20003803, win 65535, options [mss 16344,nop,wscale 6,nop,nop,TS val 3510103281 ecr 0,sackOK,eol], length 0
3 packets captured
216 packets received by filter
0 packets dropped by kernel
至此,结束。
|