本文内容基于 2025 秋季《计算机网络》课程讲述,如有差错,欢迎指正
网络层概述#
定位与功能#
网络层的基本功能是在主机之间实现了多跳的传输方式。 与应用层和传输层不同的是,网络层不仅实现于端系统(主机)中,也实现于网络核心的路由器中
- 发送端:将传输层数据单元封装成数据包,注入网络。
- 接收端:解析接收到的数据包,取出传输层数据单元,交付给上层。
- 路由器:检查数据包头部,根据路由表将其转发到合适的下一跳。
网络层的服务模型有多种选择,历史上也存在多种网络层技术,而我们如今最常用的因特网选择了“尽力而为”(Best-effort)的方式,实现了无连接的数据报服务, 即无连接、不保证服务质量、不保证可靠传输。这样的策略使得网络的造价大幅降低,运行方式灵活,得到了广泛部署
数据平面与控制平面#
网络层实现的基本功能主要可以分为两个操作:
- 转发:将数据报从路由器的输入接口传送到正确的输出接口
- 核心:转发函数
- 路由:选择数据报从源端到目的端的路径
- 核心:路由算法与协议
基于这两个功能,又能把网络层进一步划分为数据平面和控制平面:
- 数据平面:实现转发功能
- 单个路由器上的局部功能,每个路由器独自执行
- 控制平面:实现路由功能
- 需要多个路由器协同工作,共同决定路由路径
- 两种实现方式:传统路由算法与软件定义网络 (SDN)
数据平面的转发操作本质上就相当于去计算一个转发函数,这个函数的形式通常是一个转发表,输入是数据包的目的地址(有时还有端口号),输出是对应的下一跳接口。 实际执行转发时通过查表来完成

传统上,控制平面实现在路由器内部,通过运行某种路由协议相互协作,计算端到端的路径,并更改路由器的转发表。 而近年来,软件定义网络 (SDN) 的兴起使得控制平面可以从路由器中剥离出来,将路由计算交给远端的控制器(可能是一个服务器或服务器集群)完成, 路由器上只需要实现一个简单的控制代理,负责与控制器通信并更新转发表
路由器#
路由器是网络层的核心设备,传统的路由器主要由四个部分组成:
- 输入端口 (Input Ports):物理层接收、链路层处理、转发表查询、通过交换结构将报文排队发往目的接口卡
- 高速交换结构 (Switching Fabric):连接输入与输出端口的核心交换网络
- 输出端口 (Output Ports):从输出接口发送报文、缓存排队、链路层封装、物理层发送、从输出接口发送报文
- 路由处理器 (Routing Processor):执行控制平面功能(运行路由协议),计算转发表并下发给输入端口

一个路由器可同时运行多个路由协议,也可不运行任何路由协议,只使用静态路由和直连路由。 路由管理根据路由优先级,选择最佳路由,形成核心路由表,控制层将核心路由表下发到数据层,形成转发表(FIB)
具体路由算法、SDN等控制平面的内容将在后续文章中介绍,这里我们先聚焦于路由器的数据平面
路由器中IP报文转发有以下几个核心功能:
- 链路层解封装,IP头部校验
- 获取报文目的IP地址
- 用目的IP地址,基于最长前缀匹配规则查询转发表
- 查询失败,丢弃报文
- 查询成功
- IP头部“TTL”字段值减1,重新计算IP头部“校验和”
- 获取转发出接口和下一跳链路层地址
- 重新进行链路层封装,发送报文
普通IP报文转发过程中,路由器不查看传输层及以上层协议的内容;每经过一个路由器,链路层封装会更新,IP头部“TTL”减1,IP头部“校验和”会更新
这里我们介绍的路由器与家用路由器不同,家用路由器通常还集成了交换机、防火墙等一系列功能,本文只从经典路由器的角度进行介绍
输入端口#

输入端口主要功能就是接收数据包,提取网络层数据报,并根据目的地址查找转发表,决定将数据包发往哪个输出端口。 当交换结构繁忙时,输入端口还需要维持一个缓冲队列,让数据包进行排队。
一个路由器通常有多个输入端口,每个端口连接一条链路,两两之间独立工作,达到线速的效果
输入端口的转发策略有两种:
- 基于目的地址的转发
- 只根据目的IP地址
- 传统交换机中常用(受限于芯片计算能力)
- 通用转发
- 可以根据数据报文中任意字段的组合
- 现代软件定义网络中使用
基于目的IP地址的转换本质上是把所有的IP地址划分成不同的范围,每个范围对应一个输出端口。 在实际实现这种转发的时候,采用了最长前缀匹配的方式进行转换
最长前缀匹配
- 原理:转发表中存储的是目的地址的前缀。当一个目的 IP 匹配表中的多个表项时,选择掩码最长(最精确)的那一项
出于对成本的考量,交换结构的速度一般会慢于所有输入端口的速度之和,当出现突发的大量流量是,数据包会在输入端口排队, 甚至导致排队延迟和丢包
- 排头阻塞现象
- 排在队列最前面的数据包因为其输出端口拥塞而被阻塞。
- 排在它后面的数据包虽然其对应的输出端口是空闲的,但也被迫等待,无法被发送。
交换结构#
交换结构负责将报文从输入端口的缓冲队列传输到正确的输出端口,它的速率决定了路由器内部的数据搬运能力。
交换速率:所有输入端口到输入端口的总速率,期望是所有输入端口速率之和,但实际上往往达不到这个水平
目前常见的交换结构有三种:

共享内存:
早期的路由器中,交换结构内没有专用芯片,只有一块内存,由控制平面的路由处理器控制。路由处理器不仅负责路由功能,还负责转发功能
交换流程:
- 报文到达输入端口时,产生中断信号通知路由处理器
- 路由处理器将报文复制到内存中,查询对应输出端口,再将报文复制到输出端口
由于内存拷贝速度有限,这种交换结构的性能很差
共享总线:
数据包从输入端口直接到达输出端口,无需处理器干预
实现方式:
- 输入端口通过转发表后,给报文附加上“标签”,表明输出端口
- 带标签的报文通过总线广播至所有输出端口
- 每个输出端口通过标签判断报文是不是属于自己的,不属于则忽略
总线一次只能广播一个报文,因此当多个输入端口同时发送报文时,会产生冲突,延迟会增大
纵横式交换:
由 条总线组成的网格,连接 个输入和 个输出。可以进行并行工作。 只要不同的输入端口去往不同的输出端口,它们可以同时传输,互不干扰。
后续一些交换机为了达到更高性能,会使用更复杂的多级交换结构
输出端口#
输出端口主要负责将从交换结构送来的数据包通过链路发送出去,它发送数据包的顺序不一定与到达顺序相同,因为输出端口通常会维护一个缓冲区,对数据包进行排队和调度

缓冲区:
当交换结构送来的数据包速率超过了输出链路的发送速率时,需要缓存数据包,形成排队,是造成网络排队时延和丢包的主要原因
- 缓冲区大小设置:
- 经典经验法则: (链路带宽 × 往返时延)。例如 250ms × 10Gbps
- 现代改进法则:若交换机的报文分为N个流,。这说明当流很多时,需要的缓冲区可以比经典值小很多
- 流:相同网络地址的报文构成1个流
分组调度:
决定缓冲区中的哪个包先被发送,下面是一些常见的调度算法:
-
先进先出 (FIFO) + 弃尾 (Drop Tail)
- 最简单,按到达顺序发送。
- 缓冲区满时丢弃新到达的包(或头部/随机丢弃)。
- 缺点:无法区分业务优先级。
-
优先权队列 (Priority Queuing)
- 将包分为高优先级(如语音)和低优先级(如邮件)。
- 非抢占式:当前正在发送的包发完后,永远先检查高优先级队列,只有高优先级为空才发低优先级。
- 缺点:低优先级流量可能饥饿 (Starvation),永远发不出去。
-
轮询 (Round Robin, RR)
- 将包分类,轮流从每个类别的队列中发送一个包。
- 优点:解决了饥饿问题。
- 缺点:如果不同队列的包大小不同,或者业务重要性不同,简单的轮流显得不公平。
-
加权公平队列 (Weighted Fair Queuing, WFQ)
- 更一般化的轮询方式,结合优先调度与轮询方式的优势
- 每个类别(Class )分配一个权重 ()
- 轮询时考虑权重:权重高的队列,轮询到的次数更多