1. 搭建抓包环境与捕获第一个TCP包

搭建抓包环境与捕获第一个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(图形界面)

  1. 打开Wireshark,选择本机网卡(如eth0或Wi-Fi),点击开始捕获。
  2. 在浏览器访问 http://example.com。
  3. 停止捕获,在显示过滤栏输入 ip.addr == 93.184.216.34 && tcp.port == 80(example.com的IP可能变化,可用 http 过滤)。
  4. 观察前三个数据包:第一个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位,接收窗口大小,用于流量控制。
TCP三次握手抓包时序 客户端 (本机) 发起连接 服务端 (example.com) 监听80端口 ① SYN (seq=0) ② SYN-ACK (seq=0, ack=1) ③ ACK (seq=1, ack=1) 连接建立,开始传输HTTP数据

常见问题

  • 抓不到包:确认使用sudo权限;确认网卡名称正确(可用 ip addr 查看);确认过滤条件中的IP或端口正确。
  • 只看到TCP包没有HTTP内容:example.com可能已启用HTTPS(443端口),需访问 http://example.com(明文)或改用 port 443 观察TLS握手。
  • 出现大量无关包:在tcpdump中使用 -c 10 限制捕获数量,或使用更精确的过滤表达式。