因特网的网络层提供了单一的服务, 称为尽力而为服务(Best-Effort Service). 就主机到主机数据报的传递而论, 因特网的服务模型什么也保证不了, 传送的分组既不能保证以它们发送的顺序被接收, 也不能保证它们最终交付; 既不能保证端到端时延, 也不能保证有最小的带宽.

路由算法

静态

  • 手动配置,适用于小型网络或拓扑不变的环境
  • 优点:简单、开销小
  • 缺点:不具备容错性,无法动态适应拓扑变化

最长前缀匹配(Longest Prefix Match, LPM)

  • 当目标 IP 地址匹配多条路由时,选择“网络前缀最长”的那条(即掩码最长)。
  • 路由器查找路由表时优先选择匹配位数(子网掩码选择部分)最多的路由。

例子:

目标地址 匹配路由前缀 子网掩码 匹配位数
192.168.1.15 192.168.0.0/16 /16 16
192.168.1.0/24 /24 24
192.168.1.0/25 /25 25 ✅

→ 最终选中 192.168.1.0/25,因为它有最长的前缀匹配(25位)。

其中0.0.0.0/0 是所有 IP 的匹配“兜底项”,当没有其他更具体路由可匹配时才会使用。

动态

  • 依据网络拓扑动态变化自动更新每个节点的路由表
  • 分类:
    • 距离矢量(Distance Vector)算法:如 RIP
    • 链路状态(Link State)算法:如 OSPF
  • 优点:自动适应网络变化
  • 缺点:收敛时间、资源消耗大于静态

层次路由

  • 将网络划分为自治系统(AS)或区域,减少路由表规模

既然有了区域,那就有了内外之分,为了维护路由,我们需要两个路由表:

  • IGP 路由表:负责内部网络,例如对于3c来说,其IGP路由表负责3a, 3b
  • BGP 路由表:专门用来管理和选择外部路径(前缀到 AS 的路径)负责除了自己之外的AS

image.png

如图所示(假设虚线不存在),我们有四个 AS 群,连接关系:AS4 — AS3 — AS1 — AS2

每个 AS 群内部的 IGP 路由表都由他们自己设定的 IGP 协议来管理:RIP 或 OSPF 都可以。

但对于 BGP 表来说。3a, 3b, 3c 都有自己的BGP表,他们如何动态更新BGP表就涉及BGP的两个子协议:iBGP 和 eBGP。

  • iBGP:负责AS内的BGP表传播
  • eBGP:负责AS之间的BGP表传播

例子:

假定AS3和AS2正在运行其AS内部选路协议OSPF,AS1和AS4正在运行其AS内部选路协议RIP。

假定AS间选路协议使用的是eBGP和iBGP。(前缀 x 在 AS4 的 4a )

1)路由器3c从OSPF、RIP、eBGP或iBGP中哪个选路协议学习到了前缀x? 2)路由器3a从OSPF、RIP、eBGP或iBGP中哪个选路协议学习到了前缀x? 3)路由器1c从OSPF、RIP、eBGP或iBGP中哪个选路协议学习到了前缀x? 4)路由器1d从OSPF、RIP、eBGP或iBGP中哪个选路协议学习到了前缀x?

分析:

前缀x对于这四个题的路由器而言,都属于外部的数据,故存在BGP表中,只涉及BGP协议

1)3c是从AS4直接获取的,故是eBGP。

2)3a是从3b的表获取的,故是iBGP。

3)1c是从AS3直接获取的,故是eBGP。

4)1d是从1a的表获取的,故是iBGP。

IPv6

  • 地址长度:128位(16字节)
  • 首部固定40字节,简化处理
  • 不使用广播,改为组播/任播
  • 解决 IPv4 地址枯竭问题,支持更多设备接入

IPv4

  • IPv4地址长度:32位
  • 首部结构(20B):
    • 版本、首部长度、服务类型、总长度
    • 标识、标志、片偏移(单位为8字节)
    • 生存时间(TTL)、协议、首部校验和
    • 源地址、目的地址

IP分类

IP在初期设计情况下,是依据点来判断当前所处的网络。

早期情况下,希望每个设备都有一个ip,以方便连接,但也希望一个大机构或者是一个很大的地区,使用一个网络号,便于管理。

于是有以下的分类:

类别 公网 IP 范围(首字节) 默认子网掩码 ip数量 网络数量 前面固定
A 类 1.0.0.0 ~ 126.255.255.255(不含私有和保留) 255.0.0.0 2²⁴ = 16,777,216 126 0xxx xxxx
B 类 128.0.0.0 ~ 191.255.255.255(不含私有) 255.255.0.0 2¹⁶ = 65,536 16,384 10xx xxxx
C 类 192.0.0.0 ~ 223.255.255.255(不含私有) 255.255.255.0 2⁸ = 256 2,097,152 110x xxxx

同时,还有许多私网ip:

私网IP为组织和机构预留了一片“非公网、可重复使用”的地址空间,方便他们内部自由使用IP地址,不必从ISP或IANA申请大量公网地址。私网ip是不能连入公用网络的。

类别 私有地址范围 子网掩码
A 类 10.0.0.0 ~ 10.255.255.255 255.0.0.0
B 类 172.16.0.0 ~ 172.31.255.255 255.240.0.0
C 类 192.168.0.0 ~ 192.168.255.255 255.255.0.0

可见A类网络的ip数量非常多,但是全世界只有126个,美国作为发明者,直接分配了几个例如:

A 类网络号 分配单位 备注说明
3.0.0.0/8 General Electric(通用电气) 美国公司
4.0.0.0/8 Level 3 Communications(现 Lumen) 网络运营商
6.0.0.0/8 美国陆军 政府机构
7.0.0.0/8 美国国防部 政府机构
8.0.0.0/8 Level 3(后被转给 Cloudflare) 8.8.8.8 是 Google DNS
9.0.0.0/8 IBM(国际商业机器公司) 大型 IT 企业
11.0.0.0/8 美国国防部 军方用途
12.0.0.0/8 AT&T(美国电话电报公司) 电信运营商
13.0.0.0/8 Xerox(施乐公司)
17.0.0.0/8 Apple Inc.(苹果公司) 所有 17.x.x.x 都归苹果
18.0.0.0/8 MIT(麻省理工学院) 教育科研用途

于是如何判断这个ip源自于哪,属于什么机构,就只要判断ipv4的第一个数字就可以。

同样,如果这个机构没有这么大,我们就可以给他们分配B类的网络。

在开发者早期并没有想到网络发展如此之快,ip 资源消耗超出预想。

而且,许多机构拿到一个 B 类网络(约 6 万多个地址),但实际只使用几百个,导致大量地址闲置。再加上路由表庞大,固定类地址导致路由表条目过多,给路由器带来压力。

因此,这种划分方式太过奢侈,提出了子网划分。

子网划分

子网划分就是在原有的网络号和主机号之间,借用主机号的一部分作为子网号,从而将一个大网络划分成多个更小的子网。

我们不再使用那三个点来判断当前ip属于哪一个网络了,通过子网划分。

例如,一个 B 类地址默认掩码是 255.255.0.0,但通过子网掩码可以调整为 255.255.255.0,将网络划分成更多子网。例如可以把B变成多个C一样。

这样,这个机构就不会浪费太多资源,可以把多的资源分给其他机构。

CIDR(Classless Inter-Domain Routing,无类域间路由)

出现时间:1993年由RFC 1519正式提出。

在CIDR出现之前,地址划分全依赖ABCD,未免有些过于死板了,而且ABCD每一类网络的ip数量天差地别,数量差距也有百倍。

为了更灵活和让机构的ip使用更加节俭,于是打破了固定A/B/C类地址划分,允许灵活指定任意长度的网络前缀(如/20、/22),提高地址利用率,减少路由表膨胀。

如 192.168.0.0/22 可聚合多个C类地址

VLSM(Variable Length Subnet Mask,变长子网掩码)

出现时间:概念基本与CIDR同步或稍晚,常在CIDR基础上被推广使用。

作用:允许在同一网络内部使用不同长度的子网掩码,实现更灵活细粒度的子网划分。

特点:是一种子网划分技术,实质上是CIDR在局域网或自治系统内部的应用

NAT(网络地址转换)

再到现在,ipv4根本不可能够用,秉承着先到先得。老美坏的要死,自己国家拥有约15亿个ip(41.6%),而作为后来者的十几亿人口的CN就只有3亿(9.3%)根本不可能够用呀。

于是提出了NAT技术。这时,之前空留的私有IP就发挥作用了。

技术主要功能:

  • 将私有地址转换为公网地址
  • 类型:静态NAT、动态NAT、端口地址转换(PAT)

将公网IP作为一个出口,其下面可以承载一个全是内网IP的网络,所有从这个出口出去的包都会被NAT设备把源ip从原有的私有改为这个出口的ip。

介于十分便于管理并且省下一堆ip,甚至可以一个机构内部全使用内网ip,然后再依赖一个公网ip作为出口。

路由聚合

路由聚合(Route Aggregation),也叫路由汇总(Route Summarization),是指在路由表中将多个连续的网络前缀合并成一个更大的前缀,从而减少路由条目数量、优化路由器性能、降低带宽开销的技术。

例如:

假设一个 ISP 有以下四个子网:

192.168.0.0/24
192.168.1.0/24
192.168.2.0/24
192.168.3.0/24

这些子网在路由表中原本会占据 4 条路由项。

但实际上,这些子网是连续的,可以聚合成一个更大的网络:

192.168.0.0/22

这个 /22 网络范围包含从 192.168.0.0192.168.3.255 的所有地址。

ARP(地址解析协议)

(不算严格意义的网络层协议,处于网络层和链路层之间)

在以太网中,数据帧是通过 MAC 地址发送的,但我们通常只知道对方的 IP 地址。

所以,在发送数据之前,主机会先通过 ARP 找到对应的 MAC 地址,用它来构造以太网帧,完成数据传输。

ARP只用于局域网,互联网中通常是多个路由器之间的连接网络,通常使用路由表。

ARP 工作流程

举个例子:主机 A 想向 IP 地址为 192.168.1.2 的主机发送数据:

  1. 查缓存:A 先查自己有没有 192.168.1.2 的 MAC 地址(ARP 缓存表)。
  2. 没有就广播:A 广播一个 ARP 请求包:(广播帧会发给局域网内所有设备)

“谁是 192.168.1.2?请告诉我你的 MAC!”

  1. 目标回应:192.168.1.2 的主机会单播回应:

“我是 192.168.1.2,我的 MAC 是 aa:bb:cc:dd:ee:ff”

  1. 更新缓存并发送数据:A 收到回应后,将 IP 和 MAC 绑定,写入 ARP 缓存表,然后开始发送数据。

举个例子:

主机A发送IP数据报给主机B,途中经过了5个路由器。试问在IP数据报的发送过程中总共使用了几次ARP?

分析每一跳(假设所有链路都是以太网):

发送方 接收方 发送方是否需要 ARP
1 主机 A 路由器 R1 ✅ 是,查找默认网关 MAC
2 R1 R2 ✅ 是,查找 R2 的 MAC
3 R2 R3 ✅ 是,查找 R3 的 MAC
4 R3 R4 ✅ 是,查找 R4 的 MAC
5 R4 R5 ✅ 是,查找 R5 的 MAC
6 R5 主机 B ✅ 是,查找 B 的 MAC

故使用了6次。

ICMP(互联网控制消息协议)

  • ICMP 是 IP 协议族中的一个辅助协议,主要用于在网络设备之间传递控制信息和错误报告。
  • 它不传输数据,只用于报告网络状态和诊断问题。
  • 工作在网络层(OSI 模型的第三层),通常封装在 IP 数据包中传输。

基础概念

  • ICMP 属于网络层协议,是 IP 协议的一个“辅助协议”。
  • 用于在主机与路由器之间传递 控制信息 和 差错报告,不是传输用户数据。
  • RFC 792 定义了 ICMP 协议。

ICMP 报文主要分为两类:

差错报告报文(Error Messages)

用于报告传输过程中出现的问题,不用于纠正错误。

类型 名称 功能说明
3 目的不可达(Destination Unreachable) 通知无法到达目标地址
4 源站抑制(Source Quench) 告诉源主机降低发送速率(已弃用)
5 重定向(Redirect) 告诉主机改用其他路由
11 超时(Time Exceeded) 报告 IP 数据包生命周期(TTL)到期
12 参数问题(Parameter Problem) 报告 IP 报头字段出错

查询报文(Query Messages)

用于诊断和网络信息查询。

类型 名称 功能说明
0/8 回送应答/请求(Echo Reply/Request) 用于 ping 工具,检测主机是否可达
13/14 时间戳请求/应答 检测网络时延(很少用)
10/9 路由请求/应答 查询路由器可达性(已弃用)

路由协议

接下来来详细介绍路由协议

IGP(内部网关协议)

下面说明的两个协议都是需要维护自己的路由表

路由表需要记录的数据(简化例子):

目的网络 (Destination) 下一跳 (Next Hop) 成本 (Metric)
A B 1
B C 2
C D 3
D E 1

RIP(Routing Information Protocol)

借助邻居发送的路由表来更新自己的路由表,我们先要厘清一个性质:

  • 设X = 当前点到邻居的距离,邻居给我的表所有距离+X,就是我收到的数据
  • 邻居告诉我 他到A的距离 + X = 我经过 邻居 到A的距离
  • 所以 我到A的最短距离 就是 所有邻居到A + X的最短距离

那有的人就要问了,如果当前有一条路径断了,我该怎么更新这个距离,可以见下面的行为。

在合并路由表的时候有以下行为:

  1. 收到某条路由的跳数为16(不可达)时:
    • 必须立刻将该路由的跳数标记为16(不可达),表示该目的网络现在不可达(出现断路)。
    • 这个不可达信息要尽快通知所有邻居,防止环路。
  2. 其他情况下(跳数<16):
    • 从所有邻居收到的到某目的网络的跳数,取最小值 + 1,即选择最短路径。

来一个例子:

来自B的向量为(5,0,8,12,6,2);来自D的向量为(16,12,6,0,9,10);来自E的向量为(7,6,3,9,0,4)。经过测量,C到B,D,E的延迟分别是6,3,5,求C到达所有节点的最短路径和下一跳跃。

image.png

分析:

C经过B(11, 6 , 14, 18, 12, 8)全部+6

C经过D(19, 15, 9, 3, 12, 13)全部+3

C经过E(12, 11,8, 14, 5, 9)全部+5

得到C(11, 6, 0, 3, 5, 8)全部取min

下一跳:(B, B, 0, D, E, E, B)

还要注意的一点是跳数=16就是不可达。

路由器会在定时+变化触发的时候把自己的路由表发送给邻居。

OSPF(Open Shortest Path First)

OSPF是链路状态协议,基于“全局拓扑视图”计算最短路径,核心流程:

  1. 每个路由器向同一区域内所有路由器广播自己与邻居的链路状态信息(LSA,链路状态公告)。
  2. 每个路由器收集所有LSA,构建整个网络拓扑图。
  3. 利用Dijkstra算法计算从自己到所有目的地的最短路径。
  4. 生成路由表,确定每个目的地的下一跳。

主要借助Dijkstra算法。学会Dijkstra就会了。

EGP(外部网关协议)

BGP(Border Gateway Protocol)

  • 基于路径向量,应用于自治系统之间
  • 支持路由策略控制与路径选择
  • 协议端口号:TCP 179

IP组播(Multicast)

简介

IP组播是一种网络通信方式,允许一台主机(发送者)将数据包发送给一组感兴趣的接收者(组播组),而不是单播(一对一)或广播(一对全网)。

特点:

  • 一对多通信:发送方只发一份数据,网络设备(路由器/交换机)负责将数据复制转发给所有组成员,节省带宽。
  • 组播地址:IPv4中,组播地址范围是224.0.0.0到239.255.255.255(D类地址)。
  • 组成员管理:主机通过协议(如IGMP)加入或离开组播组。
  • 路由支持:路由器使用组播路由协议(如PIM)在网络中构建转发树,确保数据从源到所有组成员高效传输。
通信方式 发送数据量 适用场景
单播 N份 一对一通信
广播 1份 一对所有,局域网内
组播 1份 一对多,跨网络多接收