网络层

  • 职责
    • 网络层负责主机到主机的分组交付,可跨越多个网络。
    • 传输层负责进程到进程的通信。
    • 数据链路层负责逐跳的转发,在相邻节点之间传输。
  • 分组交换方式
    • 数据报(Datagram)
      • 每个分组独立处理,携带源地址和目的地址。
      • 路由器不维护连接状态,分组可能乱序到达。
    • 虚电路(Virtual Circuit)
      • 分组携带 VC 号,VC 号在每段链路上独立分配。
      • 路由器维护 VC 转发表,分组沿同一路径按序传输。
      • 三个阶段:建立 → 数据传输 → 终止。
  • 核心功能
    • 转发(Forwarding):路由器内的本地动作,将分组从输入端口移到输出端口。
    • 路由(Routing):确定源到目的的全局路径,计算并维护路由表。
  • 路由算法
    • 泛洪(Flooding)
      • 非自适应算法,节点将分组发送给除到达链路外的每条出链。
      • 终止条件:跳数计数器,或记录已泛洪过的分组。
      • 问题:环路和广播风暴。
    • 距离向量(DV)
      • 基于 Bellman-Ford 方程:dx(y)=minv{c(x,v)+dv(y)}d_x(y) = \min_v \{c(x, v) + d_v(y)\}vvxx 的所有邻居。
      • 每个节点维护距离向量表,仅与邻居交换。
      • 发现更小代价时更新并通告邻居。
      • 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:报告错误或关闭连接。
  • 拥塞控制
    • 负载过高时分组丢失、延迟急剧上升,超过“悬崖”后吞吐量崩溃。
    • 按照是否反馈分类:
      • 开环:预防问题,不利用运行时反馈。
      • 闭环:利用反馈做运行时修正,步骤为监测、传递信息、调整操作。
        • 显式:路由器通知拥塞,如 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 位为网络号。只是一个前缀长度的表示,没有"子网"的语义限制。
        • 既能表示子网划分,也能表示路由聚合(多个小网络聚合为一条路由条目),也能用于路由表中的匹配掩码。
        • 转发时使用最长前缀匹配:多个条目匹配时,选前缀最长的。
        • 地址块计算:地址数 =232n= 2^{32 - n},第一个地址 = 非前缀位置 0,最后一个地址 = 非前缀位置 1。
      • NAT
        • 内部用私有地址,对外共用一个公网 IP,通过端口号区分连接。
        • 私有地址范围:10.0.0.0/8172.16.0.0/12192.168.0.0/16
        • 出站时替换源地址为 NAT 地址和新端口号,入站时根据 NAT 转换表还原。
    • IPv6
      • 表示
        • 128 位,分为 8 段,每段 4 个十六进制数字,用 : 分割。
        • 每一段内可以省略前导 0。
        • 整个地址中可以压缩一段连续的 0 为 ::
        • 同样支持 CIDR。
      • 与 IPv4 的兼容
        • 双栈:通信路线中,遇到不支持 IPv4 的主机,则使用 IPv4,会丢失部分信息。
        • 隧道:在 IPv4 路线上包装 IPv6。
  • IP 转发
    • 路由表结构
      • 路由表中不保存整个完整的路由路径,只记录下一跳。
      • 一行包括:
        • 目的地址范围:使用 CIDR 表示。
        • 下一跳:如果可以直接发送给目的,则无需下一跳。
        • 接口:从哪个接口发送。
        • Metric:对于开销的测量,作为优先级机制,值越小优先级越高。
      • 一般路由表包括默认路由,地址范围为 0.0.0.0/0,下一跳指向互联网的路径。
    • 转发过程
      • 对于目的 IP,尝试和每一行匹配:
        • 使用 CIDR 的前缀构造掩码,掩码操作后如果与 CIDR 中的地址相等,则匹配。
        • 如果有多个匹配的行,则选取前缀最长的一行。
        • 如果仍然有多个匹配的行,则选取 Metric 最小的一行。
  • 网络层其他协议
    • 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 地址为原请求者地址,发送。