在前几篇中,我们已经介绍了各种应用层协议和核心网络协议的原理与流程。本篇将从整体角度讲解协议如何组合工作,并通过抓包、调试工具实践网络数据包的追踪和分析,同时简要演示常见攻击模拟与防护,以及常用的网络调试命令。
当一个应用(比如浏览器)发起通信请求时,数据从应用层一路向下封装,到达物理层变为比特流;目标主机收到比特流后,按相反顺序逐层解封,最终将应用层数据交给相应应用。以下以一个简单的 HTTP 请求为例,说明封装和解封的流程。
┌────────────────────────────────────────────┐
│ 应用层 (HTTP) │
│ GET /index.html HTTP/1.1\r\nHost: ... │
└────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────┐
│ 传输层 (TCP) │
│ [源端口=51720][目的端口=80][序列号…] [负载:HTTP数据] │
└────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────┐
│ 网络层 (IP) │
│ [版本=4][源IP=192.168.1.10][目的IP=93.184.216.34][协议=TCP]│
│ [负载:TCP段] │
└────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────┐
│ 数据链路层 (以太网帧) │
│ [目的MAC=AA:BB:CC:DD:EE:FF][源MAC=11:22:33:44:55:66]│
│ [以太类型=0x0800][负载:IP数据报][FCS校验] │
└────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────┐
│ 物理层 (比特流) │
│ 01010110 11001100 … │
└────────────────────────────────────────────┘
应用层(HTTP)
生成 HTTP 请求报文,包含请求行、请求头、空行、请求体(可选)。
例如:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: ...
传输层(TCP)
TCP 为 HTTP 数据加上 TCP 头部,包括:
源端口(例如随机 51720)
目的端口(80)
序列号、确认号、窗口大小、标志位(SYN/ACK/FIN 等)、校验和等字段
形成 TCP 段(Segment),并将 HTTP 数据作为载荷。
网络层(IP)
IP 为 TCP 段加上 IP 头部,包括:
版本 (IPv4 或 IPv6)
头部长度、服务类型、总长度
标识、标志、分片偏移
TTL(生存时间)
协议号(TCP=6,UDP=17)
源 IP、目的 IP
头部校验和
形成 IP 数据报(Datagram),并将 TCP 段作为载荷。
数据链路层(以太网)
以太网在 IP 数据报外层加上以太网帧头:
目的 MAC 地址、源 MAC 地址
以太网类型(0x0800 表示 IPv4)
在尾部加上 FCS 校验(CRC)。
形成以太网帧(Frame),发送到物理介质。
物理层
将以太网帧编码为比特流(电信号、光信号或无线电波)并通过介质传播。
接收端网络接口卡(NIC)收到比特流后依次解码和解封:
物理层 → 数据链路层
NIC 将比特流还原为以太网帧,校验 FCS。
把帧传给以太网协议栈。
数据链路层 → 网络层
提取以太网帧头部,获得源 MAC、目的 MAC、以太类型。
如果目的 MAC 匹配本机或广播,则提取后续 IP 数据报。
网络层 → 传输层
IP 解封,检查头部校验和、TTL 等,确认传递协议号。
提取出 TCP 段,检查 IP 层目的 IP 与本机一致。
传输层 → 应用层
TCP 解封,验证 TCP 校验和、序列号、确认号等。
提取 HTTP 数据,按端口(80)交给 HTTP 服务或进程。
应用层
HTTP 服务器(或浏览器)解析报文,并生成响应。
Wireshark 是目前最流行的网络抓包和分析工具,支持对网络接口的数据包进行实时捕获并解码多种协议,适合故障排查、安全分析、性能调优等场景。
Windows / macOS / Linux:
前往 Wireshark • Go Deep 下载对应平台的安装包并安装。
Linux 也可通过包管理器安装,例如:
sudo apt-get install wireshark
启动 Wireshark:
需要拥有抓包权限(Linux 上需加入 wireshark
组或以 root 权限运行)。
打开后,在界面左上角选择一个网络接口(如 eth0
、wlan0
、en0
等),点击“Start”开始抓包。
接口列表:显示各网卡实时流量、丢包率等指标。选择后点击抓包或双击开始捕获。
抓包数据列表(Packet List Pane):
每行代表一个捕获到的数据包,按时间顺序排列。
列包括编号(No.)、时间戳(Time)、源 IP(Source)、目的 IP(Destination)、协议(Protocol)、长度(Length)、摘要(Info)等。
数据包详细信息(Packet Details Pane):
选中某个数据包时,显示该包的协议层次解析(Ethernet → IP → TCP → HTTP 等)。
每层可展开查看字段值,并查看原始十六进制及 ASCII 内容。
十六进制/ASCII 视图(Packet Bytes Pane):
显示选中数据包的原始字节流,以十六进制和 ASCII 形式并排展示,便于细粒度分析。
捕获过滤(Capture Filter)
用于指定在抓包前要捕获哪些数据包。
语法与 BPF(Berkeley Packet Filter)一致,例如:
只抓 HTTP(TCP 80):
tcp port 80
只抓某个源 IP 的数据包:
src host 192.168.1.10
只抓 ARP 报文:
arp
在 Wireshark 界面顶部输入过滤表达式,再点击“Start”即可生效。
显示过滤(Display Filter)
用于已经捕获的数据包列表,对结果做进一步筛选。
语法更强大,可按字段匹配协议层次:
只显示 HTTP:
http
只显示 TCP 三次握手的 SYN 包:
tcp.flags.syn == 1 && tcp.flags.ack == 0
过滤某个 IP 的所有通信:
ip.addr == 192.168.1.10
过滤某个 MAC 地址:
eth.addr == aa:bb:cc:dd:ee:ff
在 Wireshark 中设置捕获过滤器:tcp port 80
,开始抓包。
浏览器访问 http://www.example.com
,Wireshark 会捕获到以下典型过程:
TCP 三次握手:
SYN
:客户端 → 服务器
SYN, ACK
:服务器 → 客户端
ACK
:客户端 → 服务器
HTTP 请求:
GET / HTTP/1.1\r\nHost: www.example.com\r\n…
HTTP 响应:
HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n…
TCP 四次挥手(断开连接)。
在“Packet List Pane”中选中某个 HTTP 请求,查看“Packet Details Pane”:
展开 TCP 层可查看端口号、序列号等;
展开 HTTP 层可查看请求头、请求行等。
在“Packet Bytes Pane”可看到原始十六进制和 ASCII 报文内容。
本节以 ARP 欺骗和端口扫描为例,演示如何模拟常见网络攻击,并介绍基本的防护思路。
在局域网中,各主机通过 ARP(Address Resolution Protocol)将 IP 映射到 MAC。
正常流程:主机 A 发 ARP 请求(“谁拥有 IP X,请将 MAC 发给我”),拥有 IP X 的主机 B 响应:“我的 MAC 是 Y”;A 将 IP→MAC 映射缓存到 ARP 缓存。
ARP 欺骗:攻击者伪造 ARP 响应,向目标主机发送“IP X 对应 MAC 为 Z”(Z 为攻击者 MAC),导致目标更新 ARP 缓存,把原来合法主机的 IP 指向到恶意 MAC,攻击者可进行中间人(MITM)攻击、流量嗅探、流量篡改等。
在 Linux 下可用工具 arpspoof
或 ettercap
:
sudo apt-get install dsniff # 包含 arpspoof
# 假设网关 IP=192.168.1.1,目标主机 IP=192.168.1.10
sudo arpspoof -i eth0 -t 192.168.1.10 192.168.1.1
sudo arpspoof -i eth0 -t 192.168.1.1 192.168.1.10
第一条命令:对目标主机 192.168.1.10 发送伪装成网关的 ARP 响应。
第二条命令:对网关发送伪装成目标主机的 ARP 响应。
此时,就形成了攻击者主机位于网关与目标之间的中间人。
静态 ARP 映射
在关键设备(如服务器、网关、交换机)上配置静态 ARP,将 IP 与 MAC 固定写入 ARP 表,避免动态更新。
启用 ARP 防火墙 / 监控
部分交换机支持 ARP 绑定或 DHCP Snooping + Dynamic ARP Inspection(DAI),可防止非法 ARP 响应。
使用加密协议
在关键服务(如 HTTPS、SSH)中启用端到端加密,即使流量被截获,也难以解密。
攻击者通过向目标主机的多个端口发送探测报文,判断端口是否开放、服务类型、版本等,从而发现潜在的弱点或可利用的服务。
常见扫描方式:
TCP Connect 扫描(完全握手):客户端尝试与目标端口建立 TCP 连接,若成功则端口开放。
SYN 扫描(半开放扫描):发送 SYN,若接收到 SYN+ACK,则发送 RST 中断连接;若接收 RST,则端口关闭。这种方式更隐蔽。
UDP 扫描:向目标 UDP 端口发送空数据包或特定请求,若收到 ICMP “端口不可达”,则认为端口关闭;否则可能开放或过滤。
使用 Nmap:
# TCP Connect 扫描 1-1000 端口
sudo nmap -sT 192.168.1.10 -p1-1000
# SYN 扫描(需要 root 权限)
sudo nmap -sS 192.168.1.10 -p22,80,443
# 版本探测
sudo nmap -sV 192.168.1.10 -p80,443
# UDP 扫描(较慢)
sudo nmap -sU 192.168.1.10 -p53,161
Nmap 输出解读:
22/tcp open ssh
:端口 22 是开放的 SSH 服务
80/tcp filtered http
:扫描探测未收到确定响应,可能被防火墙过滤
443/tcp closed https
:扫描探测收到 RST,端口关闭
关闭不必要的端口/服务
仅在必要时开启服务,其他端口关闭或防火墙屏蔽。
部署防火墙和入侵检测系统(IDS/IPS)
配置 ACL(访问控制列表),限制可访问主机的 IP 范围。
IDS/IPS 可检测并报警扫描行为,或自动阻断。
使用端口敲击(Port Knocking)等技术
先敲指定端口序列,服务才开放,否则端口对外隐藏,提高安全性。
针对日常网络故障排查、连通性测试和协议分析,以下命令是最常用的工具。
作用:向目标 IP 或域名发送 ICMP Echo Request 报文,接收 ICMP Echo Reply 报文,用于判断网络连通性和测量往返时延(RTT)。
常见用法:
# 连续发送 4 个 ICMP 请求
ping -c 4 www.example.com
# 指定报文大小(字节)
ping -s 100 8.8.8.8
# 指定超时时间(秒)
ping -W 2 192.168.1.1
输出示例:
PING www.example.com (93.184.216.34): 56 data bytes
64 bytes from 93.184.216.34: icmp_seq=0 ttl=56 time=23.4 ms
64 bytes from 93.184.216.34: icmp_seq=1 ttl=56 time=22.9 ms
64 bytes from 93.184.216.34: icmp_seq=2 ttl=56 time=22.7 ms
64 bytes from 93.184.216.34: icmp_seq=3 ttl=56 time=22.8 ms
--- www.example.com ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 22.7/22.9/23.4/0.3 ms
作用:通过发送带递增 TTL 的报文,依次让中间路由器返回 ICMP “Time Exceeded” 响应,从而追踪到目标主机的路径和每跳时延。
命令差异:
Linux/macOS:traceroute
Windows:tracert
常见用法:
# Linux 下追踪到 www.example.com,最多 30 跳
traceroute www.example.com
# Windows 下追踪
tracert www.example.com
# 指定协议(UDP/ICMP/TCP)、端口(取决于实现)
traceroute -I www.example.com # 使用 ICMP Echo
traceroute -T -p 443 www.example.com # 使用 TCP 到 443 端口
输出示例:
traceroute to www.example.com (93.184.216.34), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 1.123 ms 0.890 ms 0.812 ms
2 10.0.0.1 (10.0.0.1) 5.301 ms 5.287 ms 5.274 ms
3 203.0.113.1 (203.0.113.1) 12.543 ms 12.512 ms 12.489 ms
4 93.184.216.34 (93.184.216.34) 22.456 ms 22.412 ms 22.390 ms
nslookup(简单易用,支持交互模式):
# 查询 A 记录(默认)
nslookup www.example.com
# 查询 MX 记录
nslookup -query=MX example.com
# 指定 DNS 服务器
nslookup www.example.com 8.8.8.8
dig(功能更强、输出更详尽):
# 查询 A 记录
dig www.example.com
# 查询 MX 记录
dig MX example.com
# 只显示 ANSWER 部分
dig www.example.com +short
# 指定 DNS 服务器
dig @8.8.8.8 www.example.com
输出示例(dig www.example.com +short):
93.184.216.34
作用:命令行下发起 HTTP(也支持 HTTPS、FTP、SFTP、SMTP 等)请求,可查看响应头、响应体、状态码等信息。
常见用法:
# GET 请求并输出响应体
curl http://www.example.com
# GET 请求并显示响应头
curl -I http://www.example.com
# POST 请求,发送 JSON 数据
curl -X POST http://api.example.com/v1/data \
-H "Content-Type: application/json" \
-d '{"name":"Alice","age":30}'
# 带用户认证(Basic Auth)
curl -u user:password http://api.example.com/secure
# 保存响应到文件
curl http://www.example.com -o index.html
# 支持 HTTPS 跳过证书校验(不推荐,仅测试时使用)
curl -k https://self-signed.example.com
常见标志:
-I
:仅显示响应头
-X
:指定请求方法(GET、POST、PUT、DELETE)
-d
:发送请求体数据(需配合 -X POST/PUT
)
-H
:自定义请求头
-u user:pass
:使用 HTTP Basic Auth
-L
:跟随重定向
-o
:将输出保存到文件
-v
:详细模式,输出请求和响应过程
本篇介绍了从应用层到物理层的数据封装/解封过程,并基于 Wireshark 展示了抓包与协议分析的实践方法。通过 ARP 欺骗和端口扫描示例,我们了解了常见网络攻击的原理与基本防护思路。最后,我们整理了几条日常网络调试命令(ping、traceroute、nslookup、curl)的用法,在遇到网络故障或性能问题时能够快速定位与排查。