1. 搭建抓包环境与捕获第一个TCP包
任务目标
在本机搭建抓包环境,捕获一次HTTP网页访问过程中的TCP流量,从抓包结果中识别并观察TCP三次握手(SYN、SYN-ACK、ACK)的完整过程,并对照报文结构理解TCP首部关键字段。
环境准备
- 操作系统:Linux(如Ubuntu 22.04)或Windows/macOS(命令略有差异,本案例以Linux为例)
- 抓包工具:Wireshark(图形界面)或 tcpdump(命令行),任选其一
- 访问目标:
http://example.com(明文HTTP,便于观察数据内容)
实现与操作步骤
本案例不涉及代码编写,核心操作是使用抓包工具捕获流量并进行分析。以下给出两种工具的完整操作路径。
方案A:使用tcpdump(命令行)
先启动抓包,再发起HTTP请求。打开终端执行:
# 抓取eth0网卡上访问example.com的流量,保存到文件
sudo tcpdump -i eth0 -w http_handshake.pcap host example.com and port 80
# 另开一个终端,发起HTTP请求
curl http://example.com
# 等待curl结束后,按Ctrl+C停止tcpdump
查看抓包结果:
# 显示数据包摘要(不解析细节)
tcpdump -r http_handshake.pcap -nn
# 显示TCP三次握手详细标志位
tcpdump -r http_handshake.pcap -nn 'tcp[13] & 2 != 0 or tcp[13] & 16 != 0'
方案B:使用Wireshark(图形界面)
- 打开Wireshark,选择本机网卡(如eth0或Wi-Fi),点击开始捕获。
- 在浏览器访问
http://example.com。 - 停止捕获,在显示过滤栏输入
ip.addr == 93.184.216.34 && tcp.port == 80(example.com的IP可能变化,可用http过滤)。 - 观察前三个数据包:第一个SYN(Seq=0),第二个SYN-ACK(Seq=0, Ack=1),第三个ACK(Seq=1, Ack=1)。
验证方法与判定标准
无论使用哪种工具,满足以下条件即判定抓包成功:
- 抓包文件中存在至少3个TCP数据包,且满足以下顺序与标志位:
# 预期输出(示例,实际IP和端口可能不同)
IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [S], seq 0
IP 93.184.216.34.80 > 192.168.1.100.54321: Flags [S.], seq 0, ack 1
IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [.], ack 1
- 在Wireshark中点击第一个SYN包,展开Transmission Control Protocol首部,能依次看到:源端口、目的端口、Sequence Number(相对值0)、Flags中的SYN位被置1。
- 第二个包中SYN和ACK位同时为1,Acknowledgment Number为1。
- 第三个包仅ACK位为1,Sequence Number为1。
若抓到的包顺序或标志位与此不符,说明抓到了其他流量或过滤条件不准确,需检查过滤表达式后重试。
TCP报文结构对照
在Wireshark中点击任意一个TCP包,对照首部字段理解以下关键信息:
- 源端口/目的端口:各占16位,标识通信应用。
- Sequence Number:32位,本报文段数据首字节的序号。
- Acknowledgment Number:32位,期望收到对方下一字节的序号。
- Flags:9位控制位,其中SYN=1表示连接请求,ACK=1表示确认号有效,FIN=1表示断开连接。
- Window Size:16位,接收窗口大小,用于流量控制。
常见问题
- 抓不到包:确认使用sudo权限;确认网卡名称正确(可用
ip addr查看);确认过滤条件中的IP或端口正确。 - 只看到TCP包没有HTTP内容:example.com可能已启用HTTPS(443端口),需访问
http://example.com(明文)或改用port 443观察TLS握手。 - 出现大量无关包:在tcpdump中使用
-c 10限制捕获数量,或使用更精确的过滤表达式。