网络层
- 职责
- 网络层负责主机到主机的分组交付,可跨越多个网络。
- 传输层负责进程到进程的通信。
- 数据链路层负责逐跳的转发,在相邻节点之间传输。
- 分组交换方式
- 数据报(Datagram)
- 每个分组独立处理,携带源地址和目的地址。
- 路由器不维护连接状态,分组可能乱序到达。
- 虚电路(Virtual Circuit)
- 分组携带 VC 号,VC 号在每段链路上独立分配。
- 路由器维护 VC 转发表,分组沿同一路径按序传输。
- 三个阶段:建立 → 数据传输 → 终止。
- 数据报(Datagram)
- 核心功能
- 转发(Forwarding):路由器内的本地动作,将分组从输入端口移到输出端口。
- 路由(Routing):确定源到目的的全局路径,计算并维护路由表。
- 路由算法
- 泛洪(Flooding)
- 非自适应算法,节点将分组发送给除到达链路外的每条出链。
- 终止条件:跳数计数器,或记录已泛洪过的分组。
- 问题:环路和广播风暴。
- 距离向量(DV)
- 基于 Bellman-Ford 方程:, 为 的所有邻居。
- 每个节点维护距离向量表,仅与邻居交换。
- 发现更小代价时更新并通告邻居。
- Count to Infinity:
- 链路费用增大时收敛缓慢,即坏消息传播慢。
- 缓解方法:
- 有限计数:限制距离的上界,16 就视为不可达。
- 水平分割:不向来源回传路由。
- 毒性逆转:向来源回传时,距离设为无穷大,其他目标不变。
- 链路状态(LS)
- 每台路由器泛洪 LSP 给全网所有路由器,各自拼出完整拓扑图,本地用 Dijkstra 计算最短路径。
- LSP 包含:
- 发送者标识:最初构造这个 LSP 的路由器。
- 序列号:接收者用来判断新旧,只有更新的才可以被采用。
- 年龄:每秒递减,归零丢弃。
- 直连邻居及链路代价。
- 工作过程:
- 发现邻居:发送 Hello 分组,目的节点回复地址。
- 测量代价:发送 ECHO 分组测往返时间。
- 构建 LSP。
- 可靠泛洪:收到新 LSP 后原样转发给除来源外的所有邻居,路由器维护分组缓冲区跟踪 Sent/Ack 确保每个邻居确认收到。
- 本地 Dijkstra 计算最短路径。
- 分组缓冲区为每个来源的 LSP 维护一行,包括:
- 原始 LSP。
- Sent:记录所有邻居是否已经发送。来源的邻居此处永远为 0。
- Ack:记录所有邻居是否回复已经收到。来源的邻居此处永远为 1。
- 触发条件:
- 拓扑变化。
- 配置变化。
- 定期刷新。
- 层次路由
- 概念
- 将路由器划分为区域,每台路由器知道本区域内的路由,对其他区域只保存到达该区域的路由。
- 代价:可能导致次优路由。
- Internet 中对应自治系统(AS):
- AS 内部用域内路由:如 RIP、OSPF。
- AS 之间用域间路由:如 BGP。
- RIP
- 基于距离向量,但是有如下具体规范:
- 最大跳数为 15,16 视为不可达。
- 使用毒性反转,对于之前路由的来源通告时就使用 16。
- 如果 180 秒后没有收到邻居通告,则认为下线。
- RIP 基于 UDP 通信,路由表在应用层管理。
- 基于距离向量,但是有如下具体规范:
- OSPF
- 基于链路状态,并具有以下特性:
- 具有安全机制。
- 使用泛洪通知链路状态。
- 允许存在多个到同一个目的的相同开销的路径,实现负载均衡。
- 对于不同类型的链路,可以使用不同的开销度量。
- 支持单播和组播。
- 支持层次化结构,分为骨干区域和普通区域。
- 层次结构中:
- 路由器分为:
- 边界路由器:在骨干区域中,连接到其他 AS。
- 区域边界路由器:同时处于骨干区域和普通区域中,作为两者分界。
- 骨干路由器:在骨干区域中的普通路由器。
- 内部路由器:在普通区域中的普通路由器。
- 骨干区域中,链路状态传播仅限于骨干区域,不传递到普通区域。
- 普通区域中,到普通区域外的路由只需要指向区域边界路由器。
- 区域边界路由器总结到自己区域内的距离,在骨干区域中向其他路由器报告。
- 路由器分为:
- OSPF 直接基于 IP 通信。
- 基于链路状态,并具有以下特性:
- BGP
- 使用路径向量,路径向量记录经过的所有 AS 编号。
- 路由表中一项包括:
- 前缀:即路由的目标网段。
- 路径属性:
AS_PATH:记录到达前缀经过的所有 AS 编号,从自己到目标按顺序记录到列表中。NEXT_HOP:具体的下一跳的 IP。- 其他。
- 通信分为:
- eBGP:AS 之间的路由器的通信,即 BGP 邻居之间的通信。
- iBGP:AS 内部的通信。
- 路由器从不同的相邻路由器收到通告,使用导入策略(Import Policy)进行更新。
- 按照路径属性比较接收到的通告和当前路由。
- 不同路径属性具有优先级,高优先级先比较,如果相等再比较低优先级。
- eBGP 通告给邻居可以是选择性的。
- BGP 通信是持续的长连接,相邻路由器持续发送以下类型消息:
OPEN:建立 BGP 连接。UPDATE:发出通告,仅包括变化的部分,增量更新。KEEPALIVE:心跳。NOTIFICATION:报告错误或关闭连接。
- 概念
- 泛洪(Flooding)
- 拥塞控制
- 负载过高时分组丢失、延迟急剧上升,超过“悬崖”后吞吐量崩溃。
- 按照是否反馈分类:
- 开环:预防问题,不利用运行时反馈。
- 闭环:利用反馈做运行时修正,步骤为监测、传递信息、调整操作。
- 显式:路由器通知拥塞,如 ECN
- 隐式:端系统自行推断,如 TCP 通过丢包推断。
- 按照控制方式分类:
- 基于速率:直接控制发送速率
- 基于窗口:控制传输窗口大小。
- 虚电路中的控制方法:
- 准入控制:拒绝建立新虚电路。
- 替代路由。
- 预留资源。
- 数据报中:
- 抑制分组:向源端发减速消息。
- 逐跳抑制分组:每跳都生效,更快缓解。
- 负载丢弃:直接丢包。
- Wine 策略:旧的比新的好,用于文件传输。
- Milk 策略:新的比旧的好,用于多媒体。
- RED:缓冲区耗尽前随机丢弃分组。
- IP 数据报
- 头部字段:
- Version:IP 协议版本,IPv4 = 4。
- IHL:头部长度,以 4 字节为单位。
- Total Length:整个数据报长度。
- Identification:标识符,用于分片重组,总长 2 B。
- Flags:分片标志,MF = 1 表示还有后续分片,MF = 0 表示最后一片。
- Fragment Offset:分片偏移量,以 8 字节为单位。
- TTL:最大剩余跳数,每经路由器减 1,归零时丢弃。
- Protocol:上层协议,TCP = 6, UDP = 17。
- Header Checksum:仅校验头部。
- Source Address / Destination Address:32 位源/目的 IP 地址。
- 分片:
- 网络链路有 MTU 限制,大的数据报在传输中被分片,仅在最终目的地重组。
- 每个分片的数据长度必须是 8 的倍数(最后一个除外),因为 Fragment Offset 以 8 字节为单位。
- 头部字段:
- IP 寻址
- IPv4
- 有类地址
- A/B/C/D/E 五类,网络号按位划分:A 类前 8 位,B 类前 16 位,C 类前 24 位。
- D 类用于多播,E 类保留。判断类别看首字节范围(A: 0-127, B: 128-191, C: 192-223)。
- 特殊地址:
- 主机号全 0:网络地址本身。
- 主机号全 1:广播地址。
- 127.x.x.x:环回地址。
- 子网掩码
- 子网掩码用于在有类网络内部进一步划分子网。高位为 1 对应网络号,低位为 0 对应主机号。
- IP 地址与掩码按位与得到网络地址。
- 子网转发:目的地址与掩码按位与,匹配本子网则直接发送,否则发往默认路由器。
- CIDR
- /n 表示前缀长度,即前 n 位为网络号。只是一个前缀长度的表示,没有"子网"的语义限制。
- 既能表示子网划分,也能表示路由聚合(多个小网络聚合为一条路由条目),也能用于路由表中的匹配掩码。
- 转发时使用最长前缀匹配:多个条目匹配时,选前缀最长的。
- 地址块计算:地址数 ,第一个地址 = 非前缀位置 0,最后一个地址 = 非前缀位置 1。
- NAT
- 内部用私有地址,对外共用一个公网 IP,通过端口号区分连接。
- 私有地址范围:
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。 - 出站时替换源地址为 NAT 地址和新端口号,入站时根据 NAT 转换表还原。
- 有类地址
- IPv6
- 表示
- 128 位,分为 8 段,每段 4 个十六进制数字,用
:分割。 - 每一段内可以省略前导 0。
- 整个地址中可以压缩一段连续的 0 为
::。 - 同样支持 CIDR。
- 128 位,分为 8 段,每段 4 个十六进制数字,用
- 与 IPv4 的兼容
- 双栈:通信路线中,遇到不支持 IPv4 的主机,则使用 IPv4,会丢失部分信息。
- 隧道:在 IPv4 路线上包装 IPv6。
- 表示
- IPv4
- IP 转发
- 路由表结构
- 路由表中不保存整个完整的路由路径,只记录下一跳。
- 一行包括:
- 目的地址范围:使用 CIDR 表示。
- 下一跳:如果可以直接发送给目的,则无需下一跳。
- 接口:从哪个接口发送。
- Metric:对于开销的测量,作为优先级机制,值越小优先级越高。
- 一般路由表包括默认路由,地址范围为
0.0.0.0/0,下一跳指向互联网的路径。
- 转发过程
- 对于目的 IP,尝试和每一行匹配:
- 使用 CIDR 的前缀构造掩码,掩码操作后如果与 CIDR 中的地址相等,则匹配。
- 如果有多个匹配的行,则选取前缀最长的一行。
- 如果仍然有多个匹配的行,则选取 Metric 最小的一行。
- 对于目的 IP,尝试和每一行匹配:
- 路由表结构
- 网络层其他协议
- ICMP
- 基于 IP,PDU 存放于 IP 分组的数据中。
- 提供 IP 状态和错误的交流和报告服务。
- PDU 包括 Type、Code、Checksum、Content。
- Type = 3:Destination Unreachable。
- Type = 8:Echo。
- Type = 0:Echo Reply。
- ARP
- 用于根据 IP 地址确定 IP 地址对应的 MAC 地址。
- 基于数据链路层,PDU 存放于数据链路层帧中。
- PDU 包括的重要字段:
- Source Hardware Address:发送者的 MAC 地址。
- Source Protocol Address:发送者的 IP 地址。
- Target Hardware Address:目标的 MAC 地址。如果未知,则为全 0。
- Target Protocol Address:目标的 IP 地址。
- ARP 表结构:
- IP Address
- Hardware Address
- Age:经过指定时间后删除此行。
- ARP 请求过程:
- 构造 ARP 请求,填写自己的 IP 地址、MAC 地址、目标的 IP 地址,目标的 MAC 地址填全 0。
- 装入数据链路层帧中,目标 MAC 地址为广播地址
FF:FF:FF:FF:FF:FF,发送。
- ARP 相应过程:
- 构造 ARP 相应,发送者和目标相关字段相反,发送者 MAC 地址填写自己的 MAC 地址。
- 装入数据链路层帧中,目标 MAC 地址为原请求者地址,发送。
- ICMP