心中的网络
NOTE
这个标题的灵感来自于《心中的内核》(The Kernel in the Mind)。
概念介绍
以太网和 IP 网
本文讨论的是多数人最常接触到的网络类型——以太网和 IP 网。他们属于分组交换、无连接的数据报网络。
- 以太网(
Ethernet):工作在数据链路层(L2),数据单元叫做帧(Frame),帧头包含源 MAC 地址和目的 MAC 地址等信息。以太网帧通常作为物理层信号的载荷在线缆或无线电波中传输,平时常见的“网线”上就传输这种数据。 - IP(
Internet Protocol):工作在网络层(L3),硬翻译过来叫网际协议(大家一般不这么叫),从它的名字上可以看出来最开始设计是服务于网络之间(inter-network)连接的协议。数据包的头部包含源 IP 地址和目的 IP 地址等信息。大多数场景下,IP 包作为载荷封装在以太网帧里传输。
网络分层模型
整个网络被拆为了不同的层,各司其职,有 OSI 七层模型与 TCP/IP 四层模型两种分法。详细信息可以参考 zhwiki:互联网协议套件。
| OSI 层号 | OSI 名称 | TCP/IP 层号 | TCP/IP 名称 |
|---|---|---|---|
| 7 6 5 | 应用层 表示层 会话层 | 4 | 应用层 |
| 4 | 传输层 | 3 | 传输层 |
| 3 | 网络层 | 2 | 网络互连层 |
| 2 1 | 数据链路层 物理层 | 1 | 网络访问(链接)层 |
实践上,常用 TCP/IP 四层模型的分法,但是用 OSI 七层模型的叫法,下面举一些例子。
- 二层交换机(L2 Switch):只有以太网包转发功能的交换机
- 三层交换机(L3 Switch):有以太网转发和 IP 路由功能的交换机
- 四层协议:比如 TCP、UDP
- 七层代理 / 七层负载均衡:能解析 HTTP 头、URL 等应用层信息做转发决策的反向代理
另一种理解角度
- 用网线连接两个接口(interface),他们之间要传输数据,就形成了数据链路层
- 两个主机(host)要互相通信,他们要在网络中标记自身,就有了 IP 地址和网络层
- 两个应用(application)要互相通信,他们需要有一个直达对方的数据通道以及要传输的数据格式规范,就有了传输层和应用层
数据的封装结构
发送数据时,每一层都会在上一层交下来的数据前面加上自己的头部(有时还有尾部),这个过程叫封装;接收时反过来,从下往上一层一层拆掉头部,叫解封装。
以一次 HTTPS 请求为例,数据在网线上传输时的实际结构如下——从外到内,逐层包裹:
┌────────────────────────────────────┐
│ Ethernet Header (src/dst MAC addr) │
├────────────────────────────────────┤
│ IP Header (src/dst IP addr, TTL) │
├────────────────────────────────────┤
│ TCP Header (src/dst Port, Seq) │
├────────────────────────────────────┤
│ TLS Header │
├────────────────────────────────────┤
│ │
│ Encrypted HTTP │
│ │
├────────────────────────────────────┤
│ Ethernet Trailer (FCS) │
└────────────────────────────────────┘每一层只关心自己的头部信息。外层设备看不见内层,内层也感知不到外层的存在。
像网络设备一样思考
学习或排查网络问题时,一个常见误区是带着「上帝视角」去看问题——同时检查 MAC 地址、IP 地址、端口号、防火墙规则,毫无头绪。实际上,每一台网络设备只能看到自己所在协议层的信息。如果能放下上帝视角,站到设备的角度上去看它看到了什么、它能决定什么,问题往往就清晰了。
二层交换机(二层转发)
交换机将多个链路连接在一起,链路上的所有设备组成同一个链路本地网络。
这里讨论的是「傻瓜交换机」(Dumb Switch),不考虑 VLAN 等技术——它们对于初学者来说过于复杂,并且可以用相同的方法去思考。
- 能看到什么:以太网帧头里的源 MAC 地址和目的 MAC 地址。看不到 IP 地址,更看不到 TCP/UDP 端口——交换机根本不知道 IP 是什么。
- 自己有什么:MAC 地址学习表(也叫 MAC 表或 CAM 表),每条记录是一个 MAC 地址对应一个物理接口。
- 要干什么:收到帧后,把源 MAC 和接收接口记到学习表里(学习),然后查目的 MAC 在学习表中的对应接口(查找)。如果找到了,从对应接口转发出去;如果找不到(未知单播),就向除了接收接口以外的所有接口泛洪(Flood)。
一句话概括
看源 MAC 学习,看目的 MAC 转发,找不到就全网广播。
路由器(三层转发)
路由器同时连接到多个网络,在网络之间转发 IP 包。
三层交换机也是一种路由器——它在硬件上同时做了二层转发和三层转发,但三层转发的思考方式完全一样。
- 能看到什么:IP 包头里的源 IP 地址、目的 IP 地址、TTL 等。外层的以太网帧头,每经过一跳就会被拆掉并重新封装,路由器并不依赖它做转发决策。
- 自己有什么:路由表,每条记录包含目的网络前缀、下一跳地址。带有 IP 地址的接口,用于接收和发送 IP 包。
- 要干什么:收到 IP 包后,在路由表里做最长前缀匹配,找到最精确的那条路由,找不到就使用默认路由(默认路由是一条特殊的路由,前缀长度为 0,能匹配上任何地址,最不精确)。TTL 减 1(如果减到 0 就丢弃并回 ICMP 超时),然后通过能够连接到下一跳的接口(可能是物理接口,也可能是虚拟隧道接口)将这个 IP 包发给下一跳设备。
一句话概括
根据目的 IP 地址查路由表转发到下一跳设备(路由器),找不到就转发到默认路由。
网络主机
主机上发生的事情就比较复杂了,但是自顶向下也会经历上面的三层转发处理和二层转发处理,可以用相同的方法思考。