3. 网络层核心协议:IP、ARP 与 ICMP
网络层是整个 TCP/IP 协议栈的“交通枢纽”。它负责把数据包从源主机送到目标主机,中间可能跨过好几个路由器。说白了,就是解决“路怎么走”的问题。
这一章我们重点聊三个协议:IP(寻址与路由)、ARP(地址解析)和 ICMP(差错与控制)。这三个协议我几乎每天都在跟它们打交道,尤其是排障的时候,缺一个都玩不转。
核心关系一句话:IP 负责“送到哪”,ARP 负责“找谁要”,ICMP 负责“出了啥问题”。
3.1 IP 协议:网络世界的“门牌号”
IP 协议的核心就是 IP 地址。它好比你家门牌号,别人要给你寄快递,必须知道这个号。IPv4 地址是 32 位的,通常写成点分十进制,比如 192.168.1.1。
3.1.1 IPv4 地址分类
早期设计把 IPv4 地址分成了 A、B、C、D、E 五类。前三类是给主机用的,D 类组播,E 类保留。我记得刚入行时,背分类表背得头疼。后来发现,实际工作中根本用不着死记硬背——因为 CIDR 早就取代了分类。
但作为基础,还是得知道分类的逻辑:
| 类别 | 前导位 | 地址范围 | 默认子网掩码 | 可用主机数 |
|---|---|---|---|---|
| A 类 | 0 | 1.0.0.0 – 126.255.255.255 | 255.0.0.0 (/8) | 约 1677 万 |
| B 类 | 10 | 128.0.0.0 – 191.255.255.255 | 255.255.0.0 (/16) | 约 6.5 万 |
| C 类 | 110 | 192.0.0.0 – 223.255.255.255 | 255.255.255.0 (/24) | 254 |
| D 类 | 1110 | 224.0.0.0 – 239.255.255.255 | 组播,无掩码 | — |
| E 类 | 1111 | 240.0.0.0 – 255.255.255.255 | 保留 | — |
避坑提醒:我曾经在配置 ACL 时,把 10.0.0.0/8 当成了 A 类私有地址。其实 10.0.0.0/8 确实是 A 类私有,但 127.0.0.0/8 是回环地址,不能分配给主机。这个坑我踩过一次,后来再也没忘。
3.1.2 子网掩码与 CIDR
子网掩码的作用是“划清界限”——告诉设备,IP 地址中哪部分是网络号,哪部分是主机号。比如 255.255.255.0 表示前 24 位是网络号,后 8 位是主机号。
CIDR(无类别域间路由)是更灵活的方式。它用 /N 表示网络前缀长度,不再受 A/B/C 类限制。我个人习惯用 CIDR 来规划网络,因为它能精确控制子网大小,不浪费地址。
举个例子:
IP 地址: 192.168.10.0
子网掩码: 255.255.255.128 → /25
可用主机: 2^(32-25) - 2 = 126 台
网络地址: 192.168.10.0
广播地址: 192.168.10.127
注意:每个子网中,主机位全 0 是网络地址,全 1 是广播地址,这两个不能分配给设备。算可用主机数时一定要减 2。
3.2 ARP 协议:IP 地址怎么变成 MAC 地址?
IP 地址是逻辑地址,但数据最终要在物理链路上传输,靠的是 MAC 地址。ARP(地址解析协议)就是干这个活的——把 IP 地址解析成对应的 MAC 地址。
3.2.1 工作原理
ARP 的工作流程其实很简单:
- 主机 A 想跟主机 B 通信,但只知道 B 的 IP,不知道 B 的 MAC。
- A 在局域网内广播一个 ARP 请求:“谁的 IP 是 192.168.1.2?请告诉我你的 MAC。”
- 所有主机都收到这个广播,但只有 B 回应:“我是 192.168.1.2,我的 MAC 是 aa:bb:cc:dd:ee:ff。”
- A 收到回应后,把 IP-MAC 映射写入本地 ARP 缓存,然后开始通信。
嗯,这里要注意:ARP 只在同一个广播域内有效。跨网段通信时,数据包要先发给网关,由网关的 MAC 来接力。
关键点:ARP 请求是广播,ARP 回应是单播。这个细节我在面试时经常问别人,很多人会搞反。
3.2.2 ARP 缓存与老化
为了减少广播次数,每台主机都会缓存 ARP 表项。但缓存不是永久的,一般 2-5 分钟就会老化。我遇到过一个问题:网络突然不通,排查了半天,发现是 ARP 缓存里有一条错误的静态 ARP 条目。删掉之后,网络立刻恢复。
# 查看 ARP 缓存(Windows)
arp -a
# 查看 ARP 缓存(Linux)
ip neigh show
# 删除指定 ARP 条目
arp -d 192.168.1.2
安全提醒:ARP 协议本身没有认证机制,容易遭受 ARP 欺骗攻击。攻击者伪造 ARP 回应,让受害主机把流量发到攻击者那里。我曾经在客户现场抓包定位过一次 ARP 欺骗,最后发现是内网有人私接路由器导致的。
3.3 ICMP 协议:网络排障的“听诊器”
ICMP(互联网控制报文协议)主要用于传递网络层的差错信息和控制信息。它不传输用户数据,但却是网络排障中最常用的协议。
3.3.1 ICMP 报文类型
ICMP 报文分两大类:差错报文和查询报文。我挑几个最常用的说说:
| 类型 | 代码 | 含义 | 典型场景 |
|---|---|---|---|
| 0 | 0 | Echo Reply | Ping 回应 |
| 3 | 0 | 目标不可达(网络不可达) | 路由表中没有目标网络 |
| 3 | 1 | 目标不可达(主机不可达) | ARP 解析失败 |
| 8 | 0 | Echo Request | Ping 请求 |
| 11 | 0 | TTL 超时 | Traceroute 的核心机制 |
3.3.2 Ping 的工作原理
Ping 是最常用的网络连通性测试工具。它发送 ICMP Echo Request,等待对方回复 Echo Reply。如果收到回复,说明网络通;如果超时,说明可能不通。
我个人习惯用 Ping 来快速判断三个问题:
- Ping 127.0.0.1:检查本机 TCP/IP 协议栈是否正常。
- Ping 网关:检查局域网是否连通。
- Ping 远端服务器:检查互联网连通性。
小技巧:我曾经遇到一个情况,Ping 网关通,但 Ping 外网不通。后来发现是 DNS 解析失败,而不是网络不通。所以 Ping 域名不通时,先 Ping IP 试试,能快速定位问题。
3.3.3 Traceroute 的工作原理
Traceroute 用来追踪数据包从源到目的地的路径。它的原理很巧妙:
- 发送一个 TTL=1 的 UDP 包(或 ICMP 包)给目标。
- 第一个路由器收到后,TTL 减为 0,丢弃包并回复 ICMP TTL 超时(类型 11)。
- 源主机收到超时消息,就知道第一个路由器的 IP。
- 然后发送 TTL=2 的包,第二个路由器回复超时……
- 直到包到达目标,目标回复端口不可达(UDP 方式)或 Echo Reply(ICMP 方式),追踪结束。
说白了,就是通过逐次增加 TTL,让沿途每个路由器都“暴露”自己。
# Windows 下用 tracert
tracert 8.8.8.8
# Linux 下用 traceroute
traceroute 8.8.8.8
注意:有些路由器会屏蔽 ICMP 超时报文,导致 Traceroute 显示“* * *”。这不一定是网络不通,可能是中间设备做了安全策略。我曾经排查过一个跨国链路,中间有 3 跳全是星号,但业务正常——后来确认是运营商的路由器禁用了 ICMP。
3.4 本章小结
网络层的这三个协议,各司其职:
- IP 提供逻辑寻址和路由能力,是网络层的基石。
- ARP 把 IP 地址翻译成 MAC 地址,让数据能在链路上跑起来。
- ICMP 负责报告错误和提供诊断信息,是排障的利器。
理解它们之间的关系,比死记硬背报文格式重要得多。你想想看,一个数据包从你的电脑出发,经过路由器、交换机,最终到达服务器——每一步都离不开这三个协议的配合。搞懂了它们,网络层就算入门了。