网络层核心概念
网络层核心概念
网络层到底在管什么
把数据链路层想象成"两台相邻设备之间的对话",物理层想象成"线缆里跑的电子"。那网络层要解决的问题是:跨越多个网络,把一个包从北京送到纽约。
你打开 https://www.example.com 看到页面,背后数据可能跨了 15 个路由器、3 个大洲、几千公里光缆。每一个路由器在网络层做决策:下一跳给谁?走哪条路?这些决策合起来就是网络层的全部工作。
网络层要解决三个核心问题:
- 寻址:给每台设备分配全球唯一的 IP
- 路由:决定一个包从源到目的走哪条路
- 转发:每个路由器收到包后怎么快速决定下一跳
下面分别讲。
寻址:IP 地址的设计哲学
IPv4 地址 32 位,分成网络号和主机号。192.168.1.100/24 表示前 24 位是网络号,后 8 位是主机号。
为什么这么设计?因为路由器转发决策需要"最长前缀匹配"。当一个路由器收到目的 IP 8.8.8.8 的包,它会查自己的路由表:
| 目的网络 | 下一跳 |
|---|---|
| 10.0.0.0/8 | 192.168.1.1 |
| 8.0.0.0/8 | 192.168.1.2 |
| 0.0.0.0/0(默认) | 192.168.1.254 |
路由器找最长前缀匹配。8.8.8.8 命中 8.0.0.0/8(8 位前缀),比默认路由的 0 位前缀长,所以走 192.168.1.2。如果包的目的 IP 是 192.168.5.10,命中 10.0.0.0/8(8 位前缀),但路由器还会再查更具体的路由——比如 192.168.5.0/24 16 位前缀的——如果有就选更长的。
CIDR(无类域间路由)的精髓就是前缀长度可变。不像 A/B/C 类那种死板划分,可以根据需要把网络切成任意大小。这让 IP 地址利用率从分类时代的 30% 提升到现代的 70%+。
子网划分:一个公司怎么分网络
假设某公司申请到一段公网 IP 203.0.113.0/24(256 个地址)。公司有 4 个部门:销售 80 人、研发 100 人、市场 50 人、行政 30 人。怎么分?
方案 A:等分 4 个 /26
- 销售:203.0.113.0/26(64 地址,可用 62)
- 研发:203.0.113.64/26(64 地址,可用 62)
- 市场:203.0.113.128/26(64 地址,可用 62)
- 行政:203.0.113.192/26(64 地址,可用 62)
每个子网 62 个可用地址,4 个部门每个都够。问题:研发 100 人用 62 不够。
方案 B:变长子网掩码(VLSM)
- 销售:203.0.113.0/25(128 地址,可用 126)
- 研发:203.0.113.128/26(64 地址,可用 62,但不够 100 人)
- 行政:203.0.113.192/26(64 地址,可用 62)
研发还是要 100 个地址,必须给 128。这就需要更复杂的切法。
方案 C:先大后小
- 销售:203.0.113.0/25(128 地址,128 主机位)— 100 人正好
- 研发:203.0.113.128/26(64 地址)— 80 人够
- 市场:203.0.113.192/26(64 地址)— 50 人够
- 行政:无空间
不行,行政 30 人没地址。
最终方案:
- 销售:203.0.113.0/25(128)
- 研发:203.0.113.128/26(64)
- 市场:203.0.113.192/27(32)— 30 人够(行政 30 也够)
- 行政:融入市场子网
VLSM 让小网络可以"塞"在大网络的空隙里。计算每个子网的网络地址、广播地址、可用主机范围是基本功。
路由:包怎么从北京到纽约
你电脑在北京,目标 IP 8.8.8.8 在美国。包怎么走?
每台路由器内部有一张路由表。家用路由器的路由表可能长这样:
$ ip route show
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 scope link src 192.168.1.100第一行是默认路由:所有目标都从 192.168.1.1 出去。
第二行是直连路由:本子网直接通过 eth0 送达。
运营商骨干路由器的路由表可能有 90 万条——覆盖全球所有已分配的 IPv4 段。
路由的分类:
直连路由:路由器自己接口所在的网络,不用配置自动生成。
静态路由:管理员手动写的"去 X 网络走 Y 下一跳"。简单但扩展性差。
动态路由:路由器之间跑路由协议(OSPF、BGP、IS-IS)互相学习。最常见。
最常用的两个动态路由协议:
OSPF(Open Shortest Path First):内部网关协议(IGP),用于一个组织内部的路由器之间。用链路状态算法,每个路由器都知道整个 AS(自治系统)的拓扑,算出最短路径树。收敛快(秒级),适合企业网和运营商骨干。
BGP(Border Gateway Protocol):外部网关协议(EGP),用于不同 AS 之间。全球互联网就是靠 BGP 黏合起来的——中国电信、中国移动、Cloudflare、AWS 各自的 AS 通过 BGP 互相通告"我能到达这些网络"。BGP 路径向量算法,考虑策略(不仅是路径长度)。
转发:路由器怎么快速决策
路由表 90 万条,每个包都要查一遍匹配吗?路由器不是 O(n) 线性扫描,是用最长前缀匹配树(也叫路由查找树或 Patricia Trie)这种数据结构,O(log n) 或更快。
现代路由器用 TCAM(三态内容寻址存储器)硬件查找,速度是纳秒级。TCAM 价格贵、容量有限(一般 1M-10M 条目),所以路由器厂家会精心设计路由聚合。
路由聚合就是把多个小网段合并成大网段通告:
- 不聚合:192.168.0.0/24、192.168.1.0/24、192.168.2.0/24
- 聚合:192.168.0.0/22(覆盖 4 个 /24)
路由器聚合后,全球路由表条目数大幅减少。2000 年代 IPv4 全局路由表 20 万条,2010 年代稳定在 50 万左右,主要靠聚合。
ICMP:网络层的"运维通道"
ICMP(Internet Control Message Protocol)不是普通的数据传输协议,是网络层的"运维通道",用来传错误报告和控制消息。
ping 基于 ICMP Echo Request/Echo Reply。ping 8.8.8.8 流程:
- 你的电脑发 ICMP Echo Request 到 8.8.8.8
- 8.8.8.8 收到后回 ICMP Echo Reply
- 你的电脑算 RTT
traceroute 基于 ICMP Time Exceeded:
- 你的电脑发 TTL=1 的 UDP 包给目的
- 第一跳路由器收到,TTL 减为 0,回 ICMP Time Exceeded,告诉你它的 IP
- 你的电脑发 TTL=2 的包,第二跳回 Time Exceeded
- 重复直到包到达目的,目的回 ICMP Port Unreachable
- 你看到所有路径上每个跳的 IP 和 RTT
Windows 上叫 tracert,底层是发 ICMP Echo 不是 UDP。
Path MTU Discovery 也用 ICMP:发"不分片"标志的大包,中间路由器回 ICMP "需要分片"告诉你它的 MTU。
ICMP 也被滥用做攻击:
- ICMP Flood:DDoS 攻击之一,发海量 ICMP 包耗尽目标带宽。
- Ping of Death:发超大 ICMP 包(>65535 字节)让老系统崩溃。
- Smurf Attack:伪造源 IP 广播 ICMP,广播域里所有机器都回包给伪造源。
现代防火墙默认屏蔽外部 ICMP,运维需要时按需开。
真实场景:怎么排网络层故障
公司里某台服务器 192.168.10.50 突然连不上网关 192.168.10.1。逐层排查:
第 1 步:ping 网关。 ping 192.168.10.1,不通说明本机到网关链路出问题。
- 网线松了?网卡灯亮不亮?
- 同一子网其他机器能不能 ping 通网关?
第 2 步:traceroute 远程 IP。 traceroute 8.8.8.8,看在哪一跳卡住。
- 第 1 跳就卡:本机到网关的链路。
- 第 3 跳卡:内部网络某台设备挂了。
第 3 步:看本机路由表。 ip route show,默认网关对不对?子网掩码对不对?
第 4 步:看 ARP 缓存。 arp -a | grep 192.168.10.1,网关 MAC 对不对?
- 看到
(incomplete)说明 ARP 没解析到,网关不在线或本机 ARP 表损坏。 - MAC 跟之前不一样,说明被 ARP 欺骗了。
第 5 步:抓包分析。 tcpdump -i eth0 -n icmp,看 ICMP 包到底发出去没、收到回应没。
90% 的网络层故障用 ping + traceroute + 路由表 + ARP 就能定位。
思考题
- 你公司的网络是
192.168.0.0/16。销售部要求独立子网(192.168.1.0/24),研发部要求独立子网(192.168.2.0/24),其他部门共享一个子网(192.168.3.0/24)。其他剩余 IP 还能用吗?怎么用?(提示:可变长子网掩码、超网) - 路由器收到一个包,TTL=1。它要怎么处理?TTL=0 呢?
- 一个包从 A 主机出发到 B 主机,TTL 初始 64,到达时是 56。中间经过了几个路由器?
- 为什么 ICMP 包要封装在 IP 包里,而不是像 TCP/UDP 那样作为独立传输层协议?(提示:ICMP 的"地址"——ICMP 报文本身没有端口号,它用 IP 头部的协议字段标识)
延伸阅读
- 《深入浅出计算机网络》(高军)第 4 章
- 《计算机网络:自顶向下方法》(Kurose)第 4 章
- RFC 791: Internet Protocol
- RFC 792: Internet Control Message Protocol
- 动手实验:在 Linux
traceroute -n 8.8.8.8,看路径每一跳 - 动手实验:访问 bgp.he.net 看全球 BGP 路由表前缀统计