公众号旧文

路由器到底是干什么的?一篇讲清工作原理

作者:胖子阅读 —

我们每天都在使用路由器。

家里的手机要上网:

手机 → 路由器 → 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,再决定下一步往哪里走。