前面几篇都是"往上跳"——VLAN 讲二层怎么切广播域,OSPF 讲路由器怎么互相认识。这篇往回退一步,把地基补上:一个数据包从你的键盘出发,到对面主机收到,中间到底经过了什么。

分层不是为了好看,是为了"改一层不动其他层"。你换光纤不用重写 HTTP,换 WiFi 不用重写 TCP——这才是分层真正的价值。

为什么非得分层

网络要解决的问题本质上是三个:找到对方(寻址)、把数据送过去(传输)、保证送对(可靠性)。这三个问题的粒度完全不同——寻址是端到端的,传输是点到点的,可靠性是端到端的。硬塞进一个协议里,改一处就得全改。

所以拆开:每一层只解决自己的问题,只对上层提供接口,不关心上层的语义。

OSI 七层TCP/IP 五层PDU 名称这一层认什么地址典型协议 / 设备
应用层 / 表示层 / 会话层应用层报文 Message—HTTP、DNS、DHCP、FTP
传输层传输层段 Segment(TCP)/ 数据报(UDP)端口号TCP、UDP;防火墙
网络层网络层包 PacketIP 地址IP、ICMP、OSPF;路由器
数据链路层数据链路层帧 FrameMAC 地址以太网、PPP、ARP;交换机
物理层物理层比特 Bit—双绞线、光纤、无线电;集线器

OSI 七层是"教科书模型",TCP/IP 四层是"工程模型",我们平时说的五层就是把 OSI 的上三层合并、下四层照搬。记住一句话:下三层负责把数据送到对面,上两层负责让程序用起来。

物理层:把 0 和 1 变成信号

物理层不认地址,也不认帧。它只干一件事:把比特流变成能在介质上传播的信号,以及反过来。

物理层的问题很好认:灯不亮、CRC 错包多、链路频繁 up/down,基本就是这一层的事——线缆、光模块、接口。

数据链路层:一跳一跳地送

链路层管的是同一段链路上的两台设备。它给数据加上帧头帧尾,用 MAC 地址寻址,用 FCS 做校验。

ethernet ii
┌──────────┬──────────┬────────┬─────────────────────┬────────┐
│ 目的 MAC  │ 源 MAC    │ 类型   │        数据          │  FCS   │
│  6 字节   │  6 字节   │ 2 字节 │   46 ~ 1500 字节     │ 4 字节 │
└──────────┴──────────┴────────┴─────────────────────┴────────┘
                                 ↑ 类型 0x0800 = IPv4
                                   类型 0x0806 = ARP
                                   类型 0x86DD = IPv6

几个容易记混的点:

ARP:把 IP 翻译成 MAC

同网段通信时,只知道对方 IP 是发不出帧的——帧头要填 MAC。于是有了 ARP:

  1. 查本机 ARP 缓存,有就直接用;
  2. 没有就发 ARP Request(广播,目的 MAC 全 F),"谁是 192.168.1.2?";
  3. 目标主机回 ARP Reply(单播),"我是,我的 MAC 是 xx";
  4. 双方都写进 ARP 缓存(华为默认老化 20 分钟)。

跨网段时,ARP 问的不是目的主机,而是网关的 MAC——因为帧只需要送到下一跳。

网络层:端到端找路

网络层负责从源主机到目的主机的寻址和路由。核心是 IP 协议。

ipv4 header
┌──────┬──────┬──────────┬──────────────────────────────┐
│ 版本 │ 首部 │  服务类型 │        总长度                │
│ (4)  │ 长度 │           │                              │
├──────┴──────┴───────────┼────────┬─────────────────────┤
│      标识               │  标志  │     片偏移          │
├─────────────────────────┼────────┴─────────────────────┤
│   TTL   │   协议        │        首部校验和            │
├─────────┴───────────────┼──────────────────────────────┤
│            源 IP 地址(32 位)                          │
├─────────────────────────┼──────────────────────────────┤
│           目的 IP 地址(32 位)                         │
└─────────────────────────┴──────────────────────────────┘
字段要点
TTL每经过一台路由器减 1,减到 0 就丢弃并回 ICMP 超时。traceroute 就是靠它工作的
协议号1 = ICMP,6 = TCP,17 = UDP,89 = OSPF
标识 / 标志 / 片偏移分片与重组用。DF=1 表示禁止分片,MF=1 表示后面还有片
首部校验和只校验首部,不含数据(数据靠上层校验)

IP 地址与掩码

一个 IPv4 地址分两部分:网络位 + 主机位,分界线由掩码决定。掩码里 1 的个数就是前缀长度。

subnetting
192.168.1.130 / 25      255.255.255.128
11000000.10101000.00000001.1 | 0000010
└──────── 网络位 25 位 ────────┘└ 主机位 7 位 ┘

网络地址  192.168.1.128     (主机位全 0)
广播地址  192.168.1.255     (主机位全 1)
可用范围  192.168.1.129 ~ 192.168.1.254   (共 126 个)

传输层:端到端的可靠性

网络层把包送到主机,但主机上跑着几十个程序——到底给谁?靠端口号。IP + 端口 = 一个连接的唯一标识,叫 Socket。

TCPUDP
连接面向连接(三次握手)无连接
可靠性序号 + 确认 + 重传不保证
顺序保证按序不保证
流量控制滑动窗口无
开销首部 20 字节起首部 8 字节
典型应用HTTP、SSH、BGP(179)DNS、DHCP、SNMP、VXLAN(4789)
tcp three-way handshake
客户端                                服务器
   │  ── SYN  seq=x ──────────────────▶  │
   │  ◀── SYN+ACK  seq=y, ack=x+1 ────   │
   │  ── ACK  ack=y+1 ───────────────▶   │
   │           连接建立,开始传数据        │

端口范围要记住三段:0–1023 知名端口(80 HTTP、443 HTTPS、22 SSH、53 DNS、179 BGP)、1024–49151 注册端口、49152–65535 动态端口(客户端随机用)。

数据转发过程:两条路

这是整篇最该背下来的一段。转发分两种情况:

case 1 · 同网段
源 192.168.1.10/24  →  目的 192.168.1.20/24

1. 用掩码算出:目的 IP 与本机同网段(都是 192.168.1.0/24)
2. 查 ARP:目的 IP 的 MAC 是多少?没有就广播问
3. 封装二层帧:源 MAC = 自己,目的 MAC = 对方的
4. 二层帧交给交换机,交换机查 MAC 表转发
5. 全程不经过网关,路由器完全不参与
case 2 · 跨网段
源 192.168.1.10/24  →  目的 10.1.1.20/24

1. 用掩码算出:不同网段 → 交给网关(192.168.1.1)
2. ARP 问的是【网关】的 MAC,不是目的主机的
3. 封装二层帧:源 MAC = 自己,目的 MAC = 网关的
4. 网关(路由器)收帧、解封装、看目的 IP
5. 查路由表 → 命中 10.1.1.0/24 → 出接口
6. 重新封装新的二层帧(新源 MAC / 新目的 MAC),TTL 减 1
7. 重复 4~6,一跳一跳直到目的主机

★ 关键:IP 地址端到端不变,MAC 地址每一跳都换

记住这句话,很多问题就通了:IP 是"最终寄给谁",MAC 是"这一站交给谁"。所以路由表里查的是 IP,ARP 表里查的是 MAC,两张表各管一段。

路由的三个来源

路由器凭什么知道往哪走?路由表里的条目有三个来源,优先级从高到低:

来源说明华为默认优先级
直连路由 Direct接口配上 IP 且物理 UP,自动生成。掩码是接口掩码0
静态路由 Static手工配置。适合小网络和兜底(默认路由)60
动态路由 Dynamic协议自己学:OSPF(10)、IS-IS(15)、RIP(100)、BGP(255)按协议

选路有两条铁律,顺序不能反:

  1. 先比掩码长度,最长匹配优先——192.168.1.0/24 和 0.0.0.0/0 同时命中,选 /24;
  2. 掩码相同时比优先级(Preference),数字小者优;
  3. 优先级也相同时比度量值(Cost / Metric),小者优;
  4. 全都一样就负载分担(ECMP)。
最长匹配 · 举例
目的地址 192.168.1.99,路由表里有:
  192.168.1.0/24   →  下一跳 A      ← 命中,掩码最长(24)
  192.168.0.0/16   →  下一跳 B         也命中,但被 /24 打败
  0.0.0.0/0        →  下一跳 C         也命中,最早出局

结论:走 A。

RIB 和 FIB:控制平面与转发平面

这是很多人卡住的一个概念:路由表(RIB)不等于转发表(FIB)。

RIB · 路由表FIB · 转发表
干什么的存所有学到的路由,包括没选上的只存最终选出来的最优路由
谁生成路由协议 + 静态配置由 RIB 下刷
谁用控制平面(算路)转发平面(查表转发)
数据来源协议本身可能来自 RIB、也可能是 MPLS 标签 / ACL 引流

一个路由要进 FIB,得满足两个条件:① 被选为最优(Active),② 下一跳可达。只有 RIB 没有 FIB,说明这条路由的下一跳不可达——路由表里能看到,但数据包就是发不出去。这是现场排障最常见的"幽灵路由"。

环回口:一台路由器的"身份证"

Loopback 是一个逻辑接口,没有物理形态,但好处一堆:

huawei · 配置
interface LoopBack0
 ip address 1.1.1.1 255.255.255.255

# OSPF 里通告出去
ospf 1 router-id 1.1.1.1
 area 0.0.0.0
  network 1.1.1.1 0.0.0.0

# BGP 用它建邻居(指定更新源)
bgp 100
 peer 2.2.2.2 as-number 200
 peer 2.2.2.2 connect-interface LoopBack0

排错:一层层往下问

分层的最大好处就是排错可以二分:先定位在哪一层,再往细里查。

huawei
display interface brief              # 物理层:接口 up/down、错包
display mac-address                 # 二层:MAC 表
display arp all                     # 二层半:ARP 有没有学到
display ip routing-table            # 三层:路由表(RIB)
display fib 10.1.1.20               # 三层:转发表(FIB)—— 最准
display ip interface brief          # 接口 IP 和状态
ping / tracert                      # 连通性 + 路径

# 抓包确认报文有没有到
terminal monitor
terminal debugging
debugging ip icmp

顺序就是:接口 UP 吗 → MAC 学到吗 → ARP 通吗 → 路由有吗 → FIB 里有吗 → 对面回得来吗。任何一步断了,后面的都不用查。

一句话总结:物理层送比特,链路层管一跳,网络层找路,传输层找程序,应用层办事。转发时 IP 不变、MAC 每跳换;路由先比掩码长短,再比优先级。看懂这条链,后面所有协议都只是"在某一层上加东西"。

📌 本篇整理自 2024–2025 的「数通」学习笔记(HCIE-Datacom 方向)

原始笔记是一个 700MB+ 的 OneNote 分区,内容以华为培训胶片截图与实验记录为主,图片经 OCR 后文字有损耗。
本文把其中「物理层 / 数据链路层 / 网络层 / 传输层 / 应用层 / 层次模型 / 数据转发过程 / IP 地址 / RIB 和 FIB / 路由的三个来源 / 环回口」几页重新编排成一条主线:分层 → 封装 → 转发 → 查表。
配置命令保留华为 VRP 原样。