公众号旧文
路由器到底是干什么的?一篇讲清工作原理
我们每天都在使用路由器。
家里的手机要上网:
手机 → 路由器 → Internet
电脑访问服务器:
电脑 → 路由器 → 多个网络 → 服务器
整个互联网,本质上也是由大量路由器连接起来的。
但很多人对路由器的理解仍然停留在:路由器就是发 Wi-Fi 的。
但 Wi-Fi 只是家用路由器附带的一项功能。
路由器真正核心的职责只有两个字:
路由。
更准确地说,是:
连接不同的 IP 网络,并根据路由表决定数据包下一步应该往哪里发送。
一、什么是路由器?
从传统 TCP/IP 网络模型来看,路由器主要工作在:
网络层
Layer 3
也就是 IP 层。
它最重要的工作可以拆成两个过程:
路由
+
转发
这两个词看起来很像,但不是一回事。
二、什么叫“路由”?
所谓路由,可以简单理解成:
决定去某个目标网络应该往哪走。
假设现在有三个网络:
192.168.1.0/24
192.168.2.0/24
192.168.3.0/24
中间通过路由器连接:
192.168.1.0/24
│
▼
R1
│
▼
R2
│
▼
192.168.3.0/24
那么 R1 必须知道:
如果目标是 192.168.3.0/24
应该把数据交给谁?
这就是:
路由选择。
而这些信息会被记录在:
路由表
Routing Table
里面。
三、什么叫“转发”?
转发则是另一个过程。
假设路由器已经知道:
192.168.3.0/24
应该从 eth1 发出去
现在真的收到一个目标地址为:
192.168.3.20
的数据包。
路由器就会:
收到数据包
↓
查看目标 IP
↓
查询路由表
↓
确定下一跳 / 出接口
↓
把数据包发送出去
这个实际搬运数据包的过程,就是:
转发 Forwarding。
所以可以简单记成:
路由:
决定怎么走
转发:
真的把包送出去
四、路由表是什么?
路由器不可能每收到一个数据包都临时思考:
我现在应该往哪儿走?
它依靠的是:
路由表。
路由表本质上是一张:
目标网络 → 下一步怎么走
的表。
例如 Linux 上执行:
ip route
可能看到:
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0
10.0.0.0/24 via 192.168.1.254
可以理解成:
192.168.1.0/24
直接从 eth0 访问
10.0.0.0/24
交给 192.168.1.254
其他不知道怎么走的地址
交给 192.168.1.1
最后这一条:
default
就是:
默认路由。
五、什么叫下一跳?
路由器并不一定知道:
从这里一直到最终服务器完整应该经过哪些路由器。
很多时候,它只需要知道:
下一步交给谁。
例如:
北京
│
▼
东京
│
▼
洛杉矶
│
▼
纽约
北京的路由器可能只需要知道:
去纽约的数据
下一跳交给东京
东京再决定:
下一跳交给洛杉矶
洛杉矶继续:
下一跳交给纽约
所以整个互联网的转发方式,很像:
快递一站一站往下送。
每一站负责决定:
下一站是谁
而不是每一台路由器都保存互联网完整的物理线路图。
六、主机为什么需要“默认网关”?
假设你的电脑:
IP:
192.168.1.100
掩码:
255.255.255.0
网关:
192.168.1.1
现在访问:
192.168.1.20
电脑通过自己的地址和掩码计算发现:
自己:
192.168.1.0/24
对方:
192.168.1.0/24
属于同一个子网。
于是可以直接通信:
PC1
│
▼
交换机
│
▼
PC2
通常不需要经过路由器。
七、如果目标不在同一个网段呢?
如果电脑访问:
8.8.8.8
它发现:
192.168.1.100
和
8.8.8.8
显然不是同一网段。
电脑就不会直接寻找 8.8.8.8 的 MAC 地址。
而是把这个数据包交给默认网关。
也就是:
192.168.1.1
于是:
PC
│
▼
默认网关
│
▼
其他路由器
│
▼
Internet
│
▼
8.8.8.8
所以,默认网关就是本地设备通往其他网络的出口。
八、为什么同网段通信不需要路由器?
这是理解网络最关键的地方之一。
同网段:
192.168.1.10
│
│
▼
192.168.1.20
可以通过:
ARP / Neighbor Discovery
+
二层交换
直接找到对方。
而不同网段:
192.168.1.10
│
X
10.0.0.10
必须先交给:
网关
所以可以简单记:
同网段:
找目标主机
不同网段:
找网关
九、路由器和交换机最大的区别是什么?
这是网络学习中最常见的问题。
最简单的理解:
交换机主要看 MAC
路由器主要看 IP
传统二层交换机根据:
MAC 地址表
转发以太网帧。
路由器根据:
路由表
转发 IP 数据包。
十、交换机是怎么工作的?
假设交换机的 MAC 地址表里有:
MAC A → Port 1
MAC B → Port 2
MAC C → Port 3
收到目标 MAC 为:
MAC B
的帧时:
查 MAC 表
↓
发现 MAC B 在 Port 2
↓
从 Port 2 发出去
如果目标 MAC 暂时不知道在哪里:
未知单播
传统交换机会在对应 VLAN 内泛洪。
也就是:
除了入端口之外
向其他相关端口发送
直到学习到目标所在位置。
十一、路由器找不到路怎么办?
路由器收到:
目标 IP:203.0.113.10
以后会查询路由表。
如果:
没有匹配路由
+
没有默认路由
那么这个数据包通常会被丢弃。
在某些情况下,设备还可能返回:
ICMP Destination Unreachable
也就是目的不可达。
但是不能简单理解成路由器每次找不到路都一定会返回 ICMP。
实际行为还会受到:
设备实现
ACL
防火墙
安全策略
ICMP 策略
等因素影响。
十二、为什么路由器能隔离广播域?
交换机默认会在同一个 VLAN 内传播广播。
例如:
ARP Request
可能会:
PC
│
▼
交换机
├── PC2
├── PC3
└── PC4
但普通 IP 路由器不会把这种二层广播直接转发到另外一个网络。
因此:
LAN 1
│
▼
Router
│
▼
LAN 2
两边通常属于不同广播域。
所以我们经常说,路由器可以隔离广播域。
十三、但是“交换机工作在局域网,路由器工作在广域网”并不准确
这是很多教材里的简化说法。
现实中:
企业局域网内部
一样大量使用路由器或三层交换机进行 VLAN 间路由。
比如:
办公 VLAN
│
▼
三层设备
│
▼
服务器 VLAN
这完全发生在局域网内部。
同样,交换技术也不意味着只能用于家庭 LAN。
所以更准确的说法应该是:
交换解决的是二层网络中的转发问题,路由解决的是不同 IP 网络之间的转发问题。
而不是简单地:
交换机 = LAN
路由器 = WAN
十四、路由器转发数据时,到底发生了什么?
这一部分非常重要。
假设:
PC A:
192.168.1.10
PC B:
192.168.2.10
中间有一台路由器:
192.168.1.1
192.168.2.1
结构:
PC A
192.168.1.10
│
▼
Router
│
▼
PC B
192.168.2.10
PC A 要发送一个数据包给 PC B。
十五、第一步:PC A 判断目标是不是本地网络
PC A 根据:
目标 IP:
192.168.2.10
和自己的:
192.168.1.10/24
判断不在同一网段。
所以它知道:
不能直接发送给 PC B
而应该发送给:
默认网关
192.168.1.1
十六、第二步:寻找网关 MAC 地址
以 IPv4 为例,PC A 需要知道:
192.168.1.1
对应的 MAC 地址。
于是使用:
ARP
查询:
谁是 192.168.1.1?
路由器回答:
192.168.1.1
对应 MAC:
AA:AA:AA:AA:AA:AA
于是 PC A 构造:
以太网帧:
源 MAC:
PC A MAC
目标 MAC:
路由器 MAC
但是里面的 IP 包仍然是:
源 IP:
192.168.1.10
目标 IP:
192.168.2.10
十七、第三步:路由器收到帧
路由器首先处理:
二层以太网帧
发现:
目标 MAC 是自己
于是去掉这一跳的二层封装。
然后看到里面的:
IP 数据包
目标 IP 是:
192.168.2.10
接下来:
查询路由表
发现:
192.168.2.0/24
是自己的直连网络。
十八、第四步:重新封装
路由器接下来需要把数据发送到:
PC B
于是通过 ARP 获取:
192.168.2.10
的 MAC。
然后重新封装新的以太网帧:
源 MAC:
路由器 192.168.2.1 接口的 MAC
目标 MAC:
PC B 的 MAC
但里面:
源 IP:
192.168.1.10
目标 IP:
192.168.2.10
通常仍然保持不变。
于是:
PC A
│
第一层二层封装
▼
Router
│
重新封装
▼
PC B
十九、为什么 MAC 地址一路都在变化?
因为 MAC 地址解决的是:
当前这一跳的数据帧应该交给谁。
而 IP 地址解决的是:
这个数据包最终从哪里来、要到哪里去。
因此一个数据包经过多个路由器:
PC A
│
▼
R1
│
▼
R2
│
▼
R3
│
▼
PC B
每经过一跳:
源 MAC
目标 MAC
通常都会重新生成。
而:
源 IP
目标 IP
在没有 NAT 等特殊处理时,一般不会改变。
所以有一句非常经典的话:
路由转发过程中,二层封装逐跳变化,IP 层的端到端地址通常保持不变。
比简单说:
IP 不变,MAC 变
更加准确。
二十、为什么我说“通常”?
因为现实中的家用路由器还有一个非常重要的功能:
NAT。
例如家里的电脑:
192.168.1.100
访问互联网:
8.8.8.8
经过家用路由器以后:
源 IP:
192.168.1.100
可能会被修改成:
公网 IP:
203.0.113.8
这就是:
NAT
Network Address Translation
所以“IP 地址经过路由器永远不会变化”也是不准确的。
应该说:
纯路由转发通常不会改变源、目标 IP;如果经过 NAT,则 IP 地址可能发生转换。
二十一、TTL 其实也会变化
即便不做 NAT,一个 IPv4 数据包经过路由器时,也不是完全原封不动。
其中有一个字段:
TTL
Time To Live
每经过一台路由器:
TTL - 1
例如:
64
↓
63
↓
62
↓
61
如果最终变成:
0
路由器就会丢弃这个数据包。
这是为了防止路由环路导致数据包永远在网络中循环。
二十二、traceroute 为什么能知道经过哪些路由器?
这就和 TTL 有关系。
traceroute / tracert 会故意发送:
TTL = 1
TTL = 2
TTL = 3
……
的数据包。
第一次:
TTL = 1
到第一台路由器变成 0。
第一台路由器返回相关 ICMP 信息。
于是知道:
第一跳是谁
然后:
TTL = 2
可以到第二跳。
依次进行:
1
2
3
4
5
……
于是我们就能看到:
数据包经过了哪些网络节点
这就是:
traceroute
tracert
能够工作的基本原理之一。
二十三、路由从哪里来?
路由表里的信息大体可以来自三种方式。
二十四、第一种:直连路由
例如路由器配置:
eth0:
192.168.1.1/24
那么它自然知道:
192.168.1.0/24
就在:
eth0
这一侧。
这类路由叫 直连路由 Connected Route。
只要接口和地址状态正常,系统就可以根据接口 IP 和掩码形成对应的直连路由。
二十五、第二种:静态路由
管理员自己告诉路由器:
去 10.0.0.0/24
下一跳走 192.168.1.254
例如 Linux:
ip route add 10.0.0.0/24 via 192.168.1.254
这就是静态路由。
优点:
简单
可控
资源消耗小
缺点:
网络变化时不会自动调整
大型网络维护困难
所以静态路由非常适合:
小型网络
固定拓扑
末梢网络
特殊指定路由
二十六、第三种:动态路由
大型网络不可能靠管理员手工维护成千上万条路由。
于是路由器之间可以运行:
OSPF
IS-IS
BGP
RIP
等路由协议。
它们可以相互交换:
我这里有哪些网络
通过我可以到哪里
路径成本是多少
然后自动计算路由。
例如企业内部经常使用:
OSPF
IS-IS
而互联网不同自治系统之间,最重要的是:
BGP
所以我们今天能够访问全球互联网,本质上就是:
大量路由器通过路由协议不断交换可达性信息,再逐跳转发 IP 数据包。
二十七、什么是默认路由?
默认路由可以理解成:
实在不知道往哪走,就往这里走。
IPv4 通常表示:
0.0.0.0/0
Linux 上可能看到:
default via 192.168.1.1
也就是:
如果没有更具体的路由
全部交给 192.168.1.1
这就是为什么家里的电脑不需要保存:
Google
腾讯
阿里
美国
日本
欧洲
所有互联网路由。
它只需要知道:
默认网关
即可。
二十八、路由器到底怎么选择一条路由?
假设路由表有:
10.0.0.0/8
10.1.0.0/16
10.1.2.0/24
0.0.0.0/0
现在访问:
10.1.2.100
这四条里面其实有多条都能匹配。
但是路由器会选择:
10.1.2.0/24
因为它最具体。
这个规则叫 最长前缀匹配 Longest Prefix Match。
可以理解成:
匹配范围越精确
优先级越高
这是 IP 路由中非常核心的一条规则。
二十九、家用路由器不只是“路由器”
现在再回来看我们家里的盒子。
所谓:
无线路由器
里面实际上经常同时集成了:
路由器
+
NAT
+
防火墙
+
DHCP Server
+
DNS Forwarder
+
交换机
+
无线 AP
所以它才可以做到:
WAN 接光猫
LAN 接电脑
Wi-Fi 接手机
自动分配 IP
共享一个公网 IP
从严格意义上说:
家用“路由器”是一台多功能网络设备。
三十、把家庭网络再看一遍
现在我们就可以理解:
运营商
│
▼
光猫
│
▼
路由器
│
├── LAN
│ └── 交换机
│
└── Wi-Fi
其中光猫负责:
光纤接入
光电转换
路由器负责:
不同网络之间转发
NAT
DHCP
防火墙
默认网关
交换机负责:
同一二层网络内
根据 MAC 转发数据
AP 负责:
Wi-Fi 无线接入
这样整个家庭网络的逻辑就清晰了。
三十一、最后用一句话理解路由器
如果只允许用一句话解释什么是路由器:
路由器就是负责连接不同 IP 网络,并根据目标 IP 和路由表决定数据包下一跳往哪里走的设备。
整个过程可以浓缩成:
数据包到达
│
▼
读取目标 IP
│
▼
查询路由表
│
▼
最长前缀匹配
│
▼
确定下一跳 / 出接口
│
▼
重新进行二层封装
│
▼
发送给下一跳
一台路由器就是这样。
而整个互联网,也不过是把这个过程重复了数十亿次。
我们每天打开一个网页、发送一条消息、连接一台服务器,看起来只是一次简单的网络访问。
但背后实际上可能已经经过:
家庭路由器
运营商接入路由器
城域网
骨干网
国际出口
其他运营商
数据中心边界
等大量路由设备。
它们所做的核心事情其实都一样:看看目标 IP,再决定下一步往哪里走。