网络层:从 IP 协议到路由转发
深入理解网络层:从 IP 协议到路由转发,一篇搞定核心知识点
在 TCP/IP 协议栈中,网络层是连接 “局部” 与 “全局” 的关键 —— 它解决了跨网络通信的路径选择问题,让两台身处不同局域网的主机能通过路由器找到彼此。如果把互联网比作 “全球快递网络”,那么网络层就是 “快递调度中心”:IP 协议是包裹的 “地址标签”,路由是 “配送路线规划”,而分片组装则是 “超大包裹拆分与重组”。今天我们就从基础概念到实际流程,彻底吃透网络层的核心知识。
一、先搞懂网络层的 3 个基本角色
在开始复杂的协议细节前,先明确网络中 3 个核心设备的定义 —— 这是理解后续内容的基础:
角色 | 核心特征 | 典型设备 |
---|---|---|
主机 | 有 IP 地址,但不负责 “路径规划”(不路由) | 你的电脑、手机 |
路由器 | 有 IP 地址,且能 “规划路径”(核心路由设备) | 家用路由器、运营商路由器 |
节点 | 主机和路由器的统称(网络中的 “参与单元”) | - |
简单说:主机只负责 “发 / 收包裹”,路由器负责 “给包裹指路”,节点则是所有 “能处理包裹” 的设备总称。
二、IP 协议头:数据包的 “身份证 + 说明书”
每个 IP 数据包都带着一个 “头部”(类似快递单),里面记录了数据包的关键信息。我们以IPv4 协议头为例,拆解核心字段(共 20 字节固定部分 + 可选字段):
字段(Field) | 位数 | 核心作用 |
---|---|---|
版本(Version) | 4 | 标识 IP 版本(IPv4 填 4,IPv6 填 6) |
头部长度(Header Len) | 4 | IP 头的长度(单位:32bit),最大 15×4=60 字节(含可选字段) |
服务类型(TOS) | 8 | 优先级(已弃用)+ 4 个服务选项(选 1 个):最小延时(ssh/telnet)、最大吞吐量(ftp)等 |
总长度(Total Len) | 16 | IP 数据包总大小(头部 + 数据),最大 65535 字节 |
标识(ID) | 16 | 唯一标识一个数据包(分片后,所有分片的 ID 相同) |
标志(Flags) | 3 | 1 位保留 + 1 位 DF(禁止分片,超 MTU 则丢弃)+1 位 MF(更多分片,最后一片置 0) |
片偏移(Fragment Offset) | 13 | 分片在原数据包中的位置(单位:8 字节),确保组装顺序 |
TTL(生存时间) | 8 | 数据包最大 “跳数”(每过一个路由器减 1,到 0 丢弃),防止路由循环(默认 64) |
协议(Protocol) | 8 | 指示上层协议(TCP=6,UDP=17,ICMP=1) |
首部校验和(Checksum) | 16 | 校验 IP 头部是否损坏(用 CRC 算法) |
源 IP 地址(Source IP) | 32 | 数据包的 “出发地” IP |
目的 IP 地址(Dest IP) | 32 | 数据包的 “目的地” IP |
这些字段里,TTL、标识、标志、片偏移是后续 “路由” 和 “分片” 的关键,一定要记牢 —— 比如 TTL 能避免数据包在 “路由器环路” 里无限循环,片偏移能让分片后的数据包正确重组。
三、网段划分:从 “浪费” 到 “精打细算” 的进化
IP 地址是 32 位整数(比如 192.168.1.1),但它不是 “一个整体”—— 而是分成网络号(哪个小区)和主机号(哪个住户)两部分。网段划分的核心,就是 “合理切分这两部分”,避免 IP 地址浪费。
1. 传统分类:简单但浪费的 “一刀切”
早期 IP 地址按 “首段数字” 分成 5 类,每类的网络号 / 主机号位数固定:
类别 | 首段范围 | 网络号位数 | 主机号位数 | 最大主机数(减 2:网络号 / 广播号) | 问题 |
---|---|---|---|---|---|
A 类 | 0.0.0.0~127.255.255.255 | 7 | 24 | 16777214(约 1600 万) | 主机数太多,多数场景浪费 |
B 类 | 128.0.0.0~191.255.255.255 | 14 | 16 | 65534(约 6 万) | 企业常用,但很快分配完 |
C 类 | 192.0.0.0~223.255.255.255 | 21 | 8 | 254(约 200) | 主机数太少,不够用 |
D 类 | 224.0.0.0~239.255.255.255 | - | - | 多播地址(不分配给主机) | - |
E 类 | 240.0.0.0~247.255.255.255 | - | - | 保留(未使用) | - |
比如一个企业申请 B 类地址,理论能连 6 万台主机,但实际最多用几千台 —— 大量 IP 地址被浪费,最终导致 B 类地址很快耗尽。
2. CIDR:灵活划分的 “救星”
为解决浪费问题,无类域间路由(CIDR) 应运而生。它的核心是用子网掩码(32 位整数,比如 255.255.255.0)来 “自定义” 网络号位数,不再受 A/B/C 类限制。
关键规则:
-
子网掩码的 “1” 对应 IP 地址的 “网络号”,“0” 对应 “主机号”;
-
IP 地址与子网掩码做按位与运算,结果就是 “网络号”;
-
简化表示:
IP地址/网络号位数
(比如 140.252.20.68/24,代表前 24 位是网络号)。
举个例子(文档中的实际案例):
场景 | IP 地址 | 子网掩码 | 网络号(按位与结果) | 地址范围(主机号 0~ 全 1) |
---|---|---|---|---|
例子 1 | 140.252.20.68 | 255.255.255.0 | 140.252.20.0 | 140.252.20.0~140.252.20.255 |
例子 2 | 140.252.20.68 | 255.255.255.240 | 140.252.20.64 | 140.252.20.64~140.252.20.79 |
比如例子 2 中,子网掩码 255.255.255.240(二进制 11111111.11111111.11111111.11110000),前 28 位是网络号,后 4 位是主机号 —— 所以主机数只有 16 个(2^4),刚好满足小团队使用,避免浪费。
四、特殊 IP 地址:这些 “特殊用途” 要记牢
不是所有 IP 地址都能分配给主机,有些有固定用途,常见的有 3 类:
-
网络号:主机号全为 0 的 IP(比如 192.168.1.0/24),代表 “整个网段”,不能分配给主机;
-
广播地址:主机号全为 1 的 IP(比如 192.168.1.255/24),发往这个地址的数据包,网段内所有主机都能收到;
-
环回地址:127.* 开头的 IP(常用 127.0.0.1),用于 “本机测试”(比如 ping 127.0.0.1,能检测本机 IP 协议是否正常)。
五、私有 IP 与 NAT:解决 “公网 IP 不够用” 的难题
IPv4 只有约 43 亿个地址,而全球设备远超这个数 —— 怎么解决?答案是 “私有 IP+NAT” 组合。
1. 私有 IP:内网专用的 “临时地址”
RFC 1918 规定了 3 段 “私有 IP 地址”,只能在局域网内使用,不能直接连公网(运营商不会路由这些地址):
-
10.0.0.0~10.255.255.255(10.*,约 1677 万个地址);
-
172.16.0.0~172.31.255.255(172.16-31.*,约 104 万个地址);
-
192.168.0.0~192.168.255.255(192.168.*,约 6 万个地址)。
比如你家的路由器,给手机、电脑分配的都是 192.168.1.* 这样的私有 IP—— 这些地址在其他家庭的局域网里可能重复,但没关系,因为它们只在 “内网生效”。
2. NAT:私有 IP 转公网 IP 的 “翻译官”
内网主机要访问公网(比如刷抖音),需要把 “私有 IP” 换成 “公网 IP”—— 这个过程就是网络地址转换(NAT),由路由器完成:
-
你手机(192.168.1.200)发数据包到抖音服务器(公网 IP);
-
家用路由器把数据包的 “源 IP” 换成自己的 “WAN 口公网 IP”(比如 122.77.241.3);
-
抖音服务器的响应数据包,先发给路由器的公网 IP;
-
路由器再把 “目的 IP” 换回你手机的私有 IP,发给你。
通过 NAT,一个公网 IP 能让整个局域网的设备共享上网 —— 极大缓解了公网 IP 不足的问题。
六、路由:数据包的 “导航系统”
当数据包从源主机出发,要到达千里之外的目的主机,靠的就是 “路由”—— 路由器通过 “路由表”,决定每一步该发给哪个下一跳设备。
1. 路由表:路由器的 “地图”
每个路由器 / 主机都有一张 “路由表”,记录了 “到某个网段,该走哪条路”。我们看一张实际的路由表示例(用route
命令查看):
目的网络(Destination) | 网关(Gateway) | 子网掩码(Genmask) | 接口(Iface) | 标志(Flags) |
---|---|---|---|---|
192.168.10.0 | 0.0.0.0 | 255.255.255.0 | eth0 | U |
192.168.56.0 | 0.0.0.0 | 255.255.255.0 | eth1 | U |
127.0.0.0 | 0.0.0.0 | 255.0.0.0 | lo | U |
default(0.0.0.0) | 192.168.10.1 | 0.0.0.0 | eth0 | UG |
字段解读:
-
目的网络:要去的 “网段”(比如 192.168.56.0/24);
-
网关:下一跳设备的 IP(0.0.0.0 表示 “直接连接”,不用经过其他路由器);
-
标志:U = 该条目有效,G = 下一跳是路由器;
-
default:缺省路由(“找不到具体路线时,默认走这里”)。
2. 路由转发过程:跟着 “地图” 走
我们用两个例子,看数据包怎么 “导航”:
例子 1:目的地址 192.168.56.3
- 数据包到主机,查路由表:
-
与 192.168.10.0 的掩码做与运算,结果不是 192.168.10.0(不匹配);
-
与 192.168.56.0 的掩码做与运算,结果是 192.168.56.0(匹配);
- 从 eth1 接口直接发送(网关是 0.0.0.0,说明网段直接连接)。
例子 2:目的地址 202.10.1.2(公网 IP)
- 数据包到主机,查路由表:
- 与 192.168.10.0、192.168.56.0、127.0.0.0 都不匹配;
-
走缺省路由,从 eth0 接口发给网关 192.168.10.1;
-
192.168.10.1 路由器再查自己的路由表,继续转发,直到到达目的主机。
七、IP 分片与组装:超大数据包的 “拆分与重组”
数据链路层有 “MTU(最大传输单元)” 限制 —— 比如以太网的 MTU 是 1500 字节,意味着一次最多传 1500 字节的数据。如果 IP 数据包超过 MTU,就需要 “分片”;到了目的主机,再 “组装” 成完整数据包。
1. 分片的关键字段(回顾 IP 协议头)
-
标识(ID):同一数据包的所有分片,ID 相同(目的主机靠 ID 识别 “哪些分片是一伙的”);
-
标志(Flags):MF=1 表示 “还有下一片”,MF=0 表示 “最后一片”;DF=1 表示 “禁止分片”(超 MTU 则丢弃);
-
片偏移:分片在原数据包中的位置(单位:8 字节)—— 比如偏移 = 0,代表这是第一片;偏移 = 185,代表这是第二片(185×8=1480 字节,即第一片数据长度)。
2. 分片与组装流程(以 3000 字节数据包为例)
假设 IP 头 20 字节,MTU=1500 字节(数据部分最多 1480 字节):
分片过程(路由器 / 源主机):
-
原始数据包:总长度 3020 字节(IP 头 20 + 数据 3000);
-
第一片:IP 头 20 + 数据 1480(总长度 1500),ID=123,MF=1,片偏移 = 0;
-
第二片:IP 头 20 + 数据 1480(总长度 1500),ID=123,MF=1,片偏移 = 185(1480/8);
-
第三片:IP 头 20 + 数据 40(总长度 60),ID=123,MF=0,片偏移 = 370(2960/8);
-
三片分别独立发送,可能走不同路由。
组装过程(目的主机):
-
接收分片,按 “ID” 分组(把 ID=123 的分片归为一组);
-
按 “片偏移” 排序(0→185→370);
-
检查 “MF 标志”:当收到 MF=0 的分片,说明所有分片已到;
-
拼接所有分片的数据部分,加上原始 IP 头(或重新封装),传给上层协议(TCP/UDP)。
关键注意:IP 分片对传输层透明——TCP/UDP 完全不知道数据包被分片了,只负责接收组装后的完整数据。
八、总结:网络层的 “核心逻辑链”
最后我们用一句话串联所有知识点,帮你形成框架:
网络层通过 IP 协议给数据包 “贴标签”(源 / 目 IP),用 CIDR 和 NAT 解决 “IP 地址不够用” 的问题,靠路由表规划 “配送路径”,用分片组装解决 “MTU 限制”,最终实现跨网络的数据包传输。
如果想加深理解,建议动手实操:
-
用
ipconfig
(Windows)或ifconfig
(Linux)看自己的 IP 和子网掩码; -
用
route print
(Windows)或route -n
(Linux)看路由表; -
用
ping ``127.0.0.1
测试环回地址,用ping 百度IP
测试公网连通性。