Linux 网络层详解:IP 协议、网段划分、CIDR、NAT 与路由转发

Linux 网络层详解:IP 协议、网段划分、CIDR、NAT 与路由转发

摘要:网络层要解决的核心问题,是在复杂网络中为数据包找到一条通往目标主机的路径。本文围绕 IPv4 协议展开,从 IP 报头格式、网络号与主机号、CIDR 子网划分、特殊 IP 地址、私有地址与 NAT,到路由表匹配和逐跳转发,系统梳理网络层最容易混淆的几个概念。

前言

应用层关心"我要传什么数据",传输层关心"数据交给哪个进程、是否可靠到达",网络层关心的问题更偏底层:

text 复制代码
目标主机不在当前局域网里,数据包应该往哪里走?

这就是网络层的核心任务:在复杂网络环境中确定合适路径。

在网络层里,最重要的协议就是 IP。平时说的 IP 地址、子网掩码、网关、路由表、NAT,大多都和这一层有关。

先区分三个基本概念:

概念 含义
主机 配有 IP 地址,但不进行路由控制的设备
路由器 配有 IP 地址,并且能进行路由控制的设备
节点 主机和路由器的统称

一、IP 协议解决什么问题

如果两台机器在同一个局域网中,通信路径相对简单。但真实网络往往由很多子网、交换设备、路由器组成。源主机和目标主机之间可能隔着很多中间节点。

IP 协议要做的事情,可以理解成:
#mermaid-svg-7DGtuhK40VwEvePD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7DGtuhK40VwEvePD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7DGtuhK40VwEvePD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7DGtuhK40VwEvePD .error-icon{fill:#552222;}#mermaid-svg-7DGtuhK40VwEvePD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7DGtuhK40VwEvePD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7DGtuhK40VwEvePD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7DGtuhK40VwEvePD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7DGtuhK40VwEvePD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7DGtuhK40VwEvePD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7DGtuhK40VwEvePD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7DGtuhK40VwEvePD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7DGtuhK40VwEvePD .marker.cross{stroke:#333333;}#mermaid-svg-7DGtuhK40VwEvePD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7DGtuhK40VwEvePD p{margin:0;}#mermaid-svg-7DGtuhK40VwEvePD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7DGtuhK40VwEvePD .cluster-label text{fill:#333;}#mermaid-svg-7DGtuhK40VwEvePD .cluster-label span{color:#333;}#mermaid-svg-7DGtuhK40VwEvePD .cluster-label span p{background-color:transparent;}#mermaid-svg-7DGtuhK40VwEvePD .label text,#mermaid-svg-7DGtuhK40VwEvePD span{fill:#333;color:#333;}#mermaid-svg-7DGtuhK40VwEvePD .node rect,#mermaid-svg-7DGtuhK40VwEvePD .node circle,#mermaid-svg-7DGtuhK40VwEvePD .node ellipse,#mermaid-svg-7DGtuhK40VwEvePD .node polygon,#mermaid-svg-7DGtuhK40VwEvePD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7DGtuhK40VwEvePD .rough-node .label text,#mermaid-svg-7DGtuhK40VwEvePD .node .label text,#mermaid-svg-7DGtuhK40VwEvePD .image-shape .label,#mermaid-svg-7DGtuhK40VwEvePD .icon-shape .label{text-anchor:middle;}#mermaid-svg-7DGtuhK40VwEvePD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7DGtuhK40VwEvePD .rough-node .label,#mermaid-svg-7DGtuhK40VwEvePD .node .label,#mermaid-svg-7DGtuhK40VwEvePD .image-shape .label,#mermaid-svg-7DGtuhK40VwEvePD .icon-shape .label{text-align:center;}#mermaid-svg-7DGtuhK40VwEvePD .node.clickable{cursor:pointer;}#mermaid-svg-7DGtuhK40VwEvePD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7DGtuhK40VwEvePD .arrowheadPath{fill:#333333;}#mermaid-svg-7DGtuhK40VwEvePD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7DGtuhK40VwEvePD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7DGtuhK40VwEvePD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7DGtuhK40VwEvePD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7DGtuhK40VwEvePD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7DGtuhK40VwEvePD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7DGtuhK40VwEvePD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7DGtuhK40VwEvePD .cluster text{fill:#333;}#mermaid-svg-7DGtuhK40VwEvePD .cluster span{color:#333;}#mermaid-svg-7DGtuhK40VwEvePD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7DGtuhK40VwEvePD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7DGtuhK40VwEvePD rect.text{fill:none;stroke-width:0;}#mermaid-svg-7DGtuhK40VwEvePD .icon-shape,#mermaid-svg-7DGtuhK40VwEvePD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7DGtuhK40VwEvePD .icon-shape p,#mermaid-svg-7DGtuhK40VwEvePD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7DGtuhK40VwEvePD .icon-shape .label rect,#mermaid-svg-7DGtuhK40VwEvePD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7DGtuhK40VwEvePD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7DGtuhK40VwEvePD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7DGtuhK40VwEvePD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 源主机
路由器 A
路由器 B
路由器 C
目标主机

每个路由器只需要根据当前掌握的路由表,决定"下一跳"该发给谁。数据包就是这样一跳一跳向目标靠近的。

二、IPv4 报头格式

IPv4 数据报由 IP 首部和数据部分组成。首部记录版本、长度、分片、TTL、协议号、源地址、目的地址等信息。

text 复制代码
0                15 16               31
+----+----+--------+----------------+
|版本|首长|服务类型|     总长度      |
+------------------+---+------------+
|      标识         |标志|  分片偏移  |
+--------+---------+----------------+
|  TTL   |  协议   |    首部校验和   |
+-----------------------------------+
|             源 IP 地址             |
+-----------------------------------+
|            目的 IP 地址            |
+-----------------------------------+
|             选项(如果有)          |
+-----------------------------------+
|               数据                 |
+-----------------------------------+

关键字段说明:

字段 作用
4 位版本号 IPv4 中该值为 4
4 位首部长度 表示 IP 首部有多少个 4 字节,最大首部长度为 60 字节
8 位服务类型 用于表示延时、吞吐量、可靠性、成本等偏好
16 位总长度 表示整个 IP 数据报占多少字节
16 位标识 分片后,同一个原始数据报的多个分片使用相同标识
3 位标志字段 包含是否禁止分片、是否还有更多分片等信息
13 位分片偏移 表示当前分片在原始数据报中的位置
8 位 TTL 数据报最多还能经过多少跳,防止路由循环
8 位协议 表示上层协议类型,如 TCP、UDP 等
16 位首部校验和 检查 IP 首部是否损坏
32 位源地址 发送端 IP 地址
32 位目的地址 接收端 IP 地址

TTL 为什么重要

TTL 是 Time To Live,通常表示数据包最多还能经过多少个路由节点。每经过一个路由器,TTL 减 1。如果减到 0 还没有到达目标,数据包会被丢弃。

它的核心作用是防止路由循环。假设路由配置错误,数据包在几个路由器之间绕圈,如果没有 TTL,这些包可能一直存在于网络中。

IP 分片相关字段

当 IP 数据报超过链路层 MTU 时,可能需要分片。分片时会用到:

字段 含义
标识 标记这些分片属于同一个原始数据报
更多分片位 除最后一个分片外,其余分片会标记还有更多分片
分片偏移 标记该分片在原始数据报中的位置

分片偏移的单位不是 1 字节,而是 8 字节。因此除了最后一个分片,其他分片长度通常要是 8 的整数倍。

三、网段划分:网络号和主机号

IP 地址不是单纯的编号,它可以拆成两部分:

text 复制代码
IP 地址 = 网络号 + 主机号
部分 作用
网络号 标识一个网络或子网
主机号 标识该网络中的某台主机

同一个子网内,主机通常具有相同网络号,但主机号必须不同。不同子网之间,网络号需要不同。

举个直观例子:

text 复制代码
192.168.1.10
192.168.1.11
192.168.1.12

如果它们都在 192.168.1.0/24 这个网段里,那么 192.168.1 可以理解为网络部分,最后一段用于区分主机。

手动管理子网中的 IP 地址很麻烦,所以实际环境中经常使用 DHCP 自动分配地址。家用路由器通常就具备 DHCP 能力,能给接入局域网的设备自动分配 IP。

四、CIDR 与子网掩码

早期 IP 地址曾经按 A、B、C、D、E 类划分,但这种方式很快暴露出浪费问题。比如一个组织申请到 B 类网络,理论上能容纳 6 万多个主机,但实际根本用不了这么多,剩余地址就被浪费了。

CIDR 的思路是:不再死板依赖 A/B/C 类,而是通过子网掩码灵活划分网络号和主机号。

子网掩码也是一个 32 位整数。将 IP 地址和子网掩码做按位与,得到的结果就是网络号。

text 复制代码
网络号 = IP 地址 & 子网掩码

示例 1:/24 网段

项目 十进制表示 十六进制表示
IP 地址 140.252.20.68 8C FC 14 44
子网掩码 255.255.255.0 FF FF FF 00
网络号 140.252.20.0 8C FC 14 00
地址范围 140.252.20.0 ~ 140.252.20.255 -

140.252.20.68/24 表示子网掩码高 24 位为 1,也就是:

text 复制代码
255.255.255.0

示例 2:/28 网段

项目 十进制表示 十六进制表示
IP 地址 140.252.20.68 8C FC 14 44
子网掩码 255.255.255.240 FF FF FF F0
网络号 140.252.20.64 8C FC 14 40
地址范围 140.252.20.64 ~ 140.252.20.79 -

很多初学者看到 /24/28 会觉得抽象,其实它只是子网掩码的简写。斜杠后面的数字表示子网掩码中连续的 1 有多少位。

五、特殊 IP 地址

有些 IP 地址不能当普通主机地址使用。

地址形式 含义
主机号全 0 网络号,代表整个局域网
主机号全 1 广播地址,用于给同一链路中的所有主机发送数据
127.* 本机环回地址,常见为 127.0.0.1

比如在 192.168.1.0/24 中:

地址 含义
192.168.1.0 网络号
192.168.1.255 广播地址
192.168.1.1 ~ 192.168.1.254 可分配给主机的地址范围

六、IPv4 地址为什么不够用

IPv4 地址是 32 位,理论上大约有 43 亿个地址。但实际可用数量远少于这个值,原因包括:

  1. 有些地址有特殊用途;
  2. 地址不是严格按主机数量分配,而是按网卡、网段、组织需求分配;
  3. 早期地址分配方式存在浪费;
  4. 互联网设备数量远超早期设计预期。

缓解方式主要有三类:

方式 说明
动态分配地址 设备接入网络时才分配 IP,同一设备每次接入可能得到不同地址
NAT 多台内网主机共享少量公网地址访问外网
IPv6 使用 128 位地址空间,但和 IPv4 不是简单兼容关系

CIDR 能提高地址利用率,但不能突破 IPv4 32 位地址空间的绝对上限。

七、私有 IP、公网 IP 与 NAT

如果 IP 只在局域网内部使用,不直接暴露到 Internet,就可以使用私有 IP 地址。RFC 1918 规定了几段常见私有地址范围:

私有地址范围 规模说明
10.0.0.0/8 前 8 位为网络号
172.16.0.0/12 覆盖 172.16.*.* ~ 172.31.*.*
192.168.0.0/16 常见于家用局域网

家用路由器通常有两个方向的地址:

地址 含义
LAN 口 IP 面向内网设备,例如 192.168.1.1
WAN 口 IP 面向上一级网络,可能仍是私有地址,也可能是公网地址

不同家庭中的路由器 LAN 口都可能是 192.168.1.1,这并不冲突,因为它们属于不同局域网。子网内 IP 不能重复,但不同子网之间可以重复。

NAT 做了什么

当内网主机访问外网时,路由器会把 IP 首部中的源地址替换成自己的外侧地址。经过多级网络后,最终数据包中的源地址会变成公网地址。
#mermaid-svg-tZYIa5gSDEZg3e36{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tZYIa5gSDEZg3e36 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tZYIa5gSDEZg3e36 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tZYIa5gSDEZg3e36 .error-icon{fill:#552222;}#mermaid-svg-tZYIa5gSDEZg3e36 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tZYIa5gSDEZg3e36 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tZYIa5gSDEZg3e36 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tZYIa5gSDEZg3e36 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tZYIa5gSDEZg3e36 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tZYIa5gSDEZg3e36 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tZYIa5gSDEZg3e36 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tZYIa5gSDEZg3e36 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tZYIa5gSDEZg3e36 .marker.cross{stroke:#333333;}#mermaid-svg-tZYIa5gSDEZg3e36 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tZYIa5gSDEZg3e36 p{margin:0;}#mermaid-svg-tZYIa5gSDEZg3e36 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tZYIa5gSDEZg3e36 .cluster-label text{fill:#333;}#mermaid-svg-tZYIa5gSDEZg3e36 .cluster-label span{color:#333;}#mermaid-svg-tZYIa5gSDEZg3e36 .cluster-label span p{background-color:transparent;}#mermaid-svg-tZYIa5gSDEZg3e36 .label text,#mermaid-svg-tZYIa5gSDEZg3e36 span{fill:#333;color:#333;}#mermaid-svg-tZYIa5gSDEZg3e36 .node rect,#mermaid-svg-tZYIa5gSDEZg3e36 .node circle,#mermaid-svg-tZYIa5gSDEZg3e36 .node ellipse,#mermaid-svg-tZYIa5gSDEZg3e36 .node polygon,#mermaid-svg-tZYIa5gSDEZg3e36 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tZYIa5gSDEZg3e36 .rough-node .label text,#mermaid-svg-tZYIa5gSDEZg3e36 .node .label text,#mermaid-svg-tZYIa5gSDEZg3e36 .image-shape .label,#mermaid-svg-tZYIa5gSDEZg3e36 .icon-shape .label{text-anchor:middle;}#mermaid-svg-tZYIa5gSDEZg3e36 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tZYIa5gSDEZg3e36 .rough-node .label,#mermaid-svg-tZYIa5gSDEZg3e36 .node .label,#mermaid-svg-tZYIa5gSDEZg3e36 .image-shape .label,#mermaid-svg-tZYIa5gSDEZg3e36 .icon-shape .label{text-align:center;}#mermaid-svg-tZYIa5gSDEZg3e36 .node.clickable{cursor:pointer;}#mermaid-svg-tZYIa5gSDEZg3e36 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tZYIa5gSDEZg3e36 .arrowheadPath{fill:#333333;}#mermaid-svg-tZYIa5gSDEZg3e36 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tZYIa5gSDEZg3e36 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tZYIa5gSDEZg3e36 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tZYIa5gSDEZg3e36 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tZYIa5gSDEZg3e36 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tZYIa5gSDEZg3e36 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tZYIa5gSDEZg3e36 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tZYIa5gSDEZg3e36 .cluster text{fill:#333;}#mermaid-svg-tZYIa5gSDEZg3e36 .cluster span{color:#333;}#mermaid-svg-tZYIa5gSDEZg3e36 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tZYIa5gSDEZg3e36 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tZYIa5gSDEZg3e36 rect.text{fill:none;stroke-width:0;}#mermaid-svg-tZYIa5gSDEZg3e36 .icon-shape,#mermaid-svg-tZYIa5gSDEZg3e36 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tZYIa5gSDEZg3e36 .icon-shape p,#mermaid-svg-tZYIa5gSDEZg3e36 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tZYIa5gSDEZg3e36 .icon-shape .label rect,#mermaid-svg-tZYIa5gSDEZg3e36 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tZYIa5gSDEZg3e36 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tZYIa5gSDEZg3e36 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tZYIa5gSDEZg3e36 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 内网主机 192.168.1.10
家用路由器
运营商路由器
公网服务器

从内网主机看,自己使用的是私有地址;从公网服务器看,请求来自某个公网地址。这种地址转换技术就是 NAT。

这里也能解释一个常见现象:自己在家里写了一个服务器程序,局域网内能访问,外网却访问不到。因为外网并不知道怎么直接找到你的私有地址。要让服务被公网访问,通常需要公网地址、端口映射,或者直接部署在具备公网地址的服务器上。

八、路由:一跳一跳转发数据包

路由的本质是根据目的 IP 查表,决定下一跳。
#mermaid-svg-7DGtuhK40VwEvePD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7DGtuhK40VwEvePD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7DGtuhK40VwEvePD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7DGtuhK40VwEvePD .error-icon{fill:#552222;}#mermaid-svg-7DGtuhK40VwEvePD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7DGtuhK40VwEvePD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7DGtuhK40VwEvePD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7DGtuhK40VwEvePD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7DGtuhK40VwEvePD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7DGtuhK40VwEvePD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7DGtuhK40VwEvePD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7DGtuhK40VwEvePD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7DGtuhK40VwEvePD .marker.cross{stroke:#333333;}#mermaid-svg-7DGtuhK40VwEvePD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7DGtuhK40VwEvePD p{margin:0;}#mermaid-svg-7DGtuhK40VwEvePD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7DGtuhK40VwEvePD .cluster-label text{fill:#333;}#mermaid-svg-7DGtuhK40VwEvePD .cluster-label span{color:#333;}#mermaid-svg-7DGtuhK40VwEvePD .cluster-label span p{background-color:transparent;}#mermaid-svg-7DGtuhK40VwEvePD .label text,#mermaid-svg-7DGtuhK40VwEvePD span{fill:#333;color:#333;}#mermaid-svg-7DGtuhK40VwEvePD .node rect,#mermaid-svg-7DGtuhK40VwEvePD .node circle,#mermaid-svg-7DGtuhK40VwEvePD .node ellipse,#mermaid-svg-7DGtuhK40VwEvePD .node polygon,#mermaid-svg-7DGtuhK40VwEvePD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7DGtuhK40VwEvePD .rough-node .label text,#mermaid-svg-7DGtuhK40VwEvePD .node .label text,#mermaid-svg-7DGtuhK40VwEvePD .image-shape .label,#mermaid-svg-7DGtuhK40VwEvePD .icon-shape .label{text-anchor:middle;}#mermaid-svg-7DGtuhK40VwEvePD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7DGtuhK40VwEvePD .rough-node .label,#mermaid-svg-7DGtuhK40VwEvePD .node .label,#mermaid-svg-7DGtuhK40VwEvePD .image-shape .label,#mermaid-svg-7DGtuhK40VwEvePD .icon-shape .label{text-align:center;}#mermaid-svg-7DGtuhK40VwEvePD .node.clickable{cursor:pointer;}#mermaid-svg-7DGtuhK40VwEvePD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7DGtuhK40VwEvePD .arrowheadPath{fill:#333333;}#mermaid-svg-7DGtuhK40VwEvePD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7DGtuhK40VwEvePD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7DGtuhK40VwEvePD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7DGtuhK40VwEvePD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7DGtuhK40VwEvePD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7DGtuhK40VwEvePD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7DGtuhK40VwEvePD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7DGtuhK40VwEvePD .cluster text{fill:#333;}#mermaid-svg-7DGtuhK40VwEvePD .cluster span{color:#333;}#mermaid-svg-7DGtuhK40VwEvePD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7DGtuhK40VwEvePD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7DGtuhK40VwEvePD rect.text{fill:none;stroke-width:0;}#mermaid-svg-7DGtuhK40VwEvePD .icon-shape,#mermaid-svg-7DGtuhK40VwEvePD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7DGtuhK40VwEvePD .icon-shape p,#mermaid-svg-7DGtuhK40VwEvePD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7DGtuhK40VwEvePD .icon-shape .label rect,#mermaid-svg-7DGtuhK40VwEvePD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7DGtuhK40VwEvePD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7DGtuhK40VwEvePD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7DGtuhK40VwEvePD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 源主机
路由器 A
路由器 B
路由器 C
目标主机

所谓"一跳",可以理解为数据链路层中的一个传输区间。在以太网中,一跳对应从源 MAC 地址到目的 MAC 地址之间的一次帧传输。

IP 数据包到达路由器后,路由器会:

  1. 查看目的 IP;
  2. 查询路由表;
  3. 判断目标是否在直连网络;
  4. 如果不是直连网络,就发给下一跳路由器;
  5. 重复这个过程,直到到达目标。

可以使用命令查看路由表:

bash 复制代码
route

在较新的系统中也常用:

bash 复制代码
ip route

九、路由表字段怎么理解

一个路由表通常包含这些字段:

字段 含义
Destination 目的网络地址
Genmask 子网掩码
Gateway 下一跳地址
Iface 发送接口
Flags 中的 U 表示该路由条目有效
Flags 中的 G 表示下一跳是某个路由器地址

没有 G 的条目,通常表示目的网络和本机接口直连,不需要经过额外路由器转发。

可以用一个简化路由表来理解:

Destination Gateway Genmask Flags Iface
192.168.10.0 * 255.255.255.0 U eth0
192.168.56.0 * 255.255.255.0 U eth1
127.0.0.0 * 255.0.0.0 U lo
default 192.168.10.1 0.0.0.0 UG eth0

示例 1:目的地址是 192.168.56.3

匹配过程:

  1. 和第一行掩码 255.255.255.0 做按位与,得到 192.168.56.0,不等于第一行 192.168.10.0
  2. 和第二行掩码 255.255.255.0 做按位与,得到 192.168.56.0,匹配第二行;
  3. 第二行没有 G,说明目标网络和本机 eth1 直连;
  4. 数据从 eth1 发出,不需要交给下一跳路由器。

示例 2:目的地址是 202.10.1.2

匹配过程:

  1. 依次和前几条路由做匹配,都不命中;
  2. 命中 default 缺省路由;
  3. eth0 发出,交给下一跳 192.168.10.1
  4. 后续由 192.168.10.1 根据自己的路由表继续决定下一跳。

这就是网络层"逐跳转发"的核心:每个节点只关心当前应该把包交给谁,不需要一开始就知道完整路径。

十、路由表从哪里来

路由表可以通过两种方式得到:

方式 说明
静态路由 由管理员手动配置,适合结构简单、变化少的网络
动态路由 通过路由算法或路由协议自动生成,适合复杂网络

动态路由背后会涉及距离向量、链路状态、Dijkstra 等算法。刚开始学习网络层时,不必急着深入算法细节,先把"查表、匹配、下一跳、缺省路由"这条转发逻辑理解清楚更重要。

十一、常见问题与易错点

1. 把 IP 地址当成主机唯一身份

IP 地址用于网络通信定位,不等同于设备永久身份。同一设备接入不同网络可能获得不同 IP;同一网卡也可能配置多个 IP。

2. 分不清网络号和主机号

判断是否在同一网段,不是看字符串前几段是否"看起来一样",而是看 IP 地址和子网掩码按位与后的网络号是否一致。

3. 误以为私有 IP 全网唯一

私有 IP 只要求在同一个局域网内不冲突。不同局域网都可以使用 192.168.1.1192.168.1.100 这类地址。

4. 认为 NAT 只是改源 IP

NAT 的核心确实是地址转换,但实际实现中还要维护连接映射关系,否则返回数据不知道该转给内网哪台主机。

5. 忽略默认路由

当目的地址不匹配任何具体网段时,系统会尝试使用缺省路由。很多"能访问局域网但不能上网"的问题,都和默认路由或网关配置有关。

总结

网络层的核心任务是路径选择。IP 报头记录源地址、目的地址、TTL、分片等信息;IP 地址通过网络号和主机号描述网络位置;CIDR 用子网掩码灵活划分网段;私有地址配合 NAT 缓解 IPv4 地址不足;路由器通过路由表逐跳转发数据包。

把这些概念串起来看,网络层并不是一堆零散名词,而是一套完整流程:主机生成 IP 数据报,路由器查看目的地址,根据路由表选择下一跳,必要时经过 NAT 转换,最终让数据包一步步到达目标网络。