3. 网络层核心协议:IP、ARP 与 ICMP

网络层是整个 TCP/IP 协议栈的“交通枢纽”。它负责把数据包从源主机送到目标主机,中间可能跨过好几个路由器。说白了,就是解决“路怎么走”的问题。

这一章我们重点聊三个协议:IP(寻址与路由)、ARP(地址解析)和 ICMP(差错与控制)。这三个协议我几乎每天都在跟它们打交道,尤其是排障的时候,缺一个都玩不转。

核心关系一句话:IP 负责“送到哪”,ARP 负责“找谁要”,ICMP 负责“出了啥问题”。

网络层核心协议关系 IP 协议 ARP 协议 ICMP 协议 IP 提供逻辑寻址 → ARP 将 IP 解析为 MAC → 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 的工作流程其实很简单:

  1. 主机 A 想跟主机 B 通信,但只知道 B 的 IP,不知道 B 的 MAC。
  2. A 在局域网内广播一个 ARP 请求:“谁的 IP 是 192.168.1.2?请告诉我你的 MAC。”
  3. 所有主机都收到这个广播,但只有 B 回应:“我是 192.168.1.2,我的 MAC 是 aa:bb:cc:dd:ee:ff。”
  4. 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 用来追踪数据包从源到目的地的路径。它的原理很巧妙:

  1. 发送一个 TTL=1 的 UDP 包(或 ICMP 包)给目标。
  2. 第一个路由器收到后,TTL 减为 0,丢弃包并回复 ICMP TTL 超时(类型 11)。
  3. 源主机收到超时消息,就知道第一个路由器的 IP。
  4. 然后发送 TTL=2 的包,第二个路由器回复超时……
  5. 直到包到达目标,目标回复端口不可达(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 负责报告错误和提供诊断信息,是排障的利器。

理解它们之间的关系,比死记硬背报文格式重要得多。你想想看,一个数据包从你的电脑出发,经过路由器、交换机,最终到达服务器——每一步都离不开这三个协议的配合。搞懂了它们,网络层就算入门了。