网络层分为两分布,网络构建和网络通信
自治系统
Autonomous System,AS。每个AS由一组通常处在相同管理控制下的路由器组成。一个ISP中的路由器以及连接他们的线路可以构成一个AS,一个ISP也可以将他们的网络划分成多个AS。每个AS由一个唯一的ASN来标识。所以在构建网络的时候,我们需要对 AS 内的网络和 AS 之外的网络进行区分。这两个统称为路由协议。
内部网关协议
Interior Gateway Protocol (IGP),用于自治系统(AS)内部的路由交换也叫做域内路由选择(intradomain routing),如 RIP 和 OSPF 协议
外部网关协议
Exterior Gateway Protocol (EGP),用于不同自治系统(AS)之间的路由交换,也叫做域间路由选择(interdomain routing),目前使用最多的是 BGP-4。

路由选择算法分类
常用的分类是:每个路由器知道的是全局的信息还是分散的信息?
- 全局的
- 所有的路由器具有完整的拓扑和链路费用信息
- “链路状态(L-S)”算法
- 应用于RIP协议
- 分散的
- 路由器只知道物理连接的邻居和到邻居的链路费用
- 迭代的计算过程,与邻居交换信息
- “距离向量(D-V)”算法
- 应用于OSPF协议
RIP协议
基于距离向量的分布式路由选择协议,规定:
- “距离”为到目的网络所经过的路由器数。
- 从一路由器到直接连接的网络的距离定义为 1。
- RIP允许一个通路最多包含15个路由器,多于15个路由器时不可达。
- RIP不能在两个网络之间同时使用多条路由,它选择一个具有最少路由器的路由,具有相同路径长度的路规定先入为主。
特点
- 仅和相邻路由器交换信息。
- 交换的信息是当前本路由器所知道的全部信息,即自己的路由表。
- 按固定的时间间隔交换路由信息,例如,每隔 30 秒。
距离向量算法
收到相邻路由器(其地址为 X)的一个 RIP 报文:
- 先修改此 RIP 报文中的所有项目:将“下一跳”字段中的地址都改为 X,并将所有的“距离”字段的值加 1。
- 对修改后的 RIP 报文中的每一个项目,重复以下步骤:
- 若项目中的目的网络不在路由表中,则将该项目加到路由表中。
- 否则
- 若下一跳字段给出的路由器地址是同样的,则将收到的项目替换原路由表中的项目
- 否则
- 若收到项目中的距离小于路由表中的距离,则进行更新
- 否则,什么也不做。
- 若 3 分钟还没有收到相邻路由器的更新路由表,则将此相邻路由器记为不可达的路由器,即将距离置为16(距离为16表示不可达)。
- 返回。
举例
一开始,各路由表只有到相邻路由器的信息:

修改 A 的路由表,将 RIP 报文中的所有项目下一跳的字段都改成 A ,距离增加 1。
| 目的网络 | 距离 | 下一跳 |
|---|---|---|
| 1 | 2 | A |
| 2 | 3 | A |
| 3 | 3 | A |
修改 C 的路由表,将 RIP 报文中的所有项目下一跳的字段都改成 C ,距离增加 1。
| 目的网络 | 距离 | 下一跳 |
|---|---|---|
| 4 | 2 | C |
| 6 | 2 | C |
将 B 原来不可达的项目加入到B的路由表中,加入后B的路由表:
| 目的网络 | 距离 | 下一跳 |
|---|---|---|
| 3 | 1 | - |
| 4 | 1 | - |
| 1 | 2 | A |
| 2 | 2 | A |
| 6 | 2 | C |
修改 收到的目的网络原本在B路由器中且下一跳的字段和原B路由表项目中的字段一致 的项目,发现不用修改。
修改 B 可达,A和C也可达的项目,发现收到项目中的距离小于路由表中的距离,则进行更新,否则不更新。则修改后B的路由表是:
| 目的网络 | 距离 | 下一跳 |
|---|---|---|
| 3 | 1 | - |
| 4 | 1 | - |
| 1 | 2 | A |
| 2 | 2 | A |
| 6 | 2 | C |
RIP 协议的优缺点
- RIP 存在的一个问题是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。即好消息传播得快,而坏消息传播得慢。
- RIP 协议最大的优点就是实现简单,开销较小。
- RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)。
- 路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。
好消息传播得快,坏消息传播得慢
在正常情况下,R1中项目表示到网1距离为1,R2中项目表示到网1距离为2。R2收到 R1 的项目后修改R2的项目为:1 2 R1,R2发现到网1的下一跳为R1,和原路由表一致,修改原路由表该项目为:1 2 R1。


| R1 | R2 | |
|---|---|---|
| 正常 | 1 1 - | 1 2 R1 |
| 故障 | 1 16 - | 1 2 R1 |
| 第1次 | 1 3 R2 | 1 16 R1 |
| 第2次 | 1 16 R2 | 1 4 R1 |
| 第3次 | 1 5 R2 | 1 16 R1 |
| … | … | … |
这样不断更新下去,直到 R1 和 R2 到网 1 的距离都增大到 16 时,R1 和 R2 才知道网1是不可达的。
RIP协议的位置
- RIP 协议使用运输层的用户数据报 UDP进行传送(使用 UDP 的端口 520)。
- 因此 RIP 协议的位置应当在应用层。但转发 IP 数据报的过程是在网络层完成的。
这时有一个困惑,RIP是网络层协议,可是为什么用UDP封装?因为路由器虽然是网络层设备,但并不代表他只具备物理层、链路层、网络层功能,他还具备一些应用层的功能,当遇到RIP报文这类应用层的协议,他也能够解封。然后读取RIP报文中的下一跳路由。
RIP2 协议的报文格式
RIP2由RIP而来,属于RIP协议的补充协议,提升装载的信息量,增加安全性。

OSPF协议
开放最短路径优先协议OSPF (Open Shortest Path First)。
RIP 协议的问题
- 以跳数评估的路由并非最优路径
- 最大跳数16导致网络尺度小
- 收敛速度慢
- 更新发送全部路由表浪费网络资源
要点
- 向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法。
- 发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。
- “链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。
- 只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。
链路状态数据库
由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库。这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。OSPF 的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。OSPF 的更新过程收敛得快是其重要优点。
Dijkstra 算法

路径:1 -> 4 -> 5 -> 2 -> 3 -> 6
OSPF 的区域(area)
为了使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干个更小的范围,叫作区域。每一个区域都有一个 32 bit 的区域标识符(用点分十进制表示)。区域也不能太大,在一个区域内的路由器最好不超过 200 个。 同时 OSPF 划分为两种不同的区域:
OSPF 载体
- OSPF 不用 UDP 而是直接用 IP 数据报传送。
- OSPF 构成的数据报很短。这样做可减少路由信息的通信量。
- 数据报很短的另一好处是可以不必将长的数据报分片传送。分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。

OSPF 的五种分组类型
- 类型1,问候(Hello)分组。
- 类型2,数据库描述(Database Description)分组。
- 类型3,链路状态请求(Link State Request)分组。
- 类型4,链路状态更新(Link State Update)分组,用洪泛法对全网更新链路状态。
- 类型5,链路状态确认(Link State Acknowledgment)分组。

BGP协议
BGP 是不同自治系统的路由器之间交换路由信息的协议。 BGP 较新版本是 2006 年 1 月发表的 BGP-4,可以将 BGP-4 简写为 BGP。

一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话(session),利用 BGP 会话交换路由信息。使用 TCP 连接能提供可靠的服务,也简化了路由选择协议。使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此成为对方的邻站或对等站。
BGP报文
- 打开(Open)报文,用来与相邻的另一个BGP发言人建立关系。
- 更新(Update)报文,用来发送某一路由的信息,以及列出要撤消的多条路由。
- 保活(Keepalive)报文,用来确认打开报文和周期性地证实邻站关系。
- 通知(Notificaton)报文,用来发送检测到的差错。

ICMP
- IP协议
- 只有一种报文格式:IP报文
- 功能:传递上层数据
- 缺乏:应付可能出现差错的能力
- 网际控制报文协议 ICMP (Internet Control Message Protocol)
- IP的辅助协议
- 为IP提供差错报告机制
- 同时为其它层(TCP/UDP、应用)提供辅助功能
ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文。
格式

差错报告报文
- 终点不可达
- 源点抑制(Source quench)
- 时间超过
- 参数问题
- 改变路由(重定向)(Redirect)

询问报文
- 回送请求和回答报文
- 时间戳请求和回答报文
PING
Ping发送一个ICMP 报文;回声请求消息给目的地并报告是否收到所希望的ICMPecho (ICMP回声应答)。它是用来检查网络是否通畅或者网络连接速度的命令。
此上是网络层-网络构建部分
此下是网络层-网络通信部分
网络通信分类
不同主机间的数据通信可以分为三种:两个主机属于同一个网、两个主机属于相邻的两个网中、两个主机属于不相邻的两个网络中。其中第一类是链路层所解决的问题,而后两类都是网络需要解决的问题,图示如下。为了叙述方便,博主将第二类情况简称“两个网”,第三类情况简称“三个网”,但实际上“三个网”的理论可以推广到“n个网”中。

传统的IP地址划分
传统的IP地址划分规则中,地址由两个部分组成:网络号 + 主机号。具有相同网络号的IP地址属于同一个网络。


A类地址
- 前1字节标识网络地址,后3字节标识主机地址
- 每个网络最多可容纳(
)台主机
- 从高位起,前1位为“0”,第1字节用十进制表示的取值范围为“0~127”
- 具有A类地址特征的网络总数为126个
B类地址
- 前2字节标识网络地址,后2字节标识主机地址
- 每个网络最多可容纳(
)台主机
- 从高位起,前2位为“10”,第1字节用十进制表示的取值范围为“128~191”
- 具有B类地址特征的网络总数为
个
C类地址
- 前3字节标识网络地址,后1字节标识主机地址
- 每个网络最多可容纳254台主机
- 从高位起,前3位为“110”,第1字节用十进制表示的取值范围为“192~223”
- 具有C类地址特征的网络总数为
个
D类地址
- 多播通信地址(multicast address)
- 从高位起,前4位为“1110”,第1字节用十进制表示的取值范围为“224-239”,用于标识multicast通信地址
- 后28位用于区分不同的multicast组
E类地址
- 从高位起,前4位为“1111”,第1字节用十进制表示的取值范围为“240-255”,用于标识E类地址
- 后28位留作它用
划分子网
早期的 IP 地址的设计确实不够合理。会存在如下问题:
- IP 地址空间的利用率有时很低。
- 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。
- 两级的 IP 地址不够灵活。
- 网络很快就被分配完了。
所以从 1985 年起在 IP 地址中又增加了一个“子网号字段”,使两级的 IP 地址变成为三级的 IP 地址。但划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。其实现思路就是从主机号借用若干个比特作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个比特。

CIDR
划分子网后仍然没有解决IP V4的问题,1992年互联网的三大危机:
- B类地址耗尽
- 路由表爆炸
- IP地址整体耗尽
无分类域间路由选择,Classless Inter-Domain Routing,是为解决上述危机而开发的一种方案。
在CIDR技术中,IP 地址由两部分组成,网络前缀 + 主机号。CIDR 还使用“斜线记法”(slash notation),它又称为CIDR记法,即在IP地址后面加上一个斜线“/”,然后写上网络前缀所占的比特数(这个数值对应于三级编址中子网掩码中比特 1 的个数)。CIDR 将网络前缀都相同的连续的 IP 地址组成“CIDR地址块”。
- 128.14.32.0/20 表示的地址块共有 212 个地址(因为斜线后面的 20 是网络前缀的比特数,所以主机号的比特数是 12)。
- 这个地址块的起始地址是 128.14.32.0。
- 在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。
- 128.14.32.0/20 地址块的最小地址:128.14.32.0。128.14.32.0/20 地址块的最大地址:128.14.47.255
- 全 0 和全 1 的主机号地址一般不使用。
路由聚合
一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由,减少了路由器之间的路由信息交换。路由聚合也称为构成超网。(super netting)。
最长前缀匹配
- 使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果。
- 应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配(longest-prefix matching)。
- 网络前缀越长,其地址块就越小,因而路由就越具体。
- 最长前缀匹配又称为最长匹配或最佳匹配。
网关
如果把计算机网络与快递网络做类比,假设东北大学是一个网络,西南大学是一个网络,东北大学想向西南大学寄点东西那么它需要通过自己学校的驿站寄到西南大学的驿站。网络之间进行通信的时候也需要有一个这种“驿站”。这便是网关。

在“多个网”时,多个网络如何互联?我们看下面的网络拓扑图,这是 3 个路由器连接了 4 个网络。

再讨论如何配置路由器。路由器不傻,只要配置好路由器接口的 IP 地址,路由器会从接口的 IP 地址计算出网络地址,也就是说路由器能看清自己身边的网络。至于路由器是怎么看到的,在网络层-网络构建中会解释。
数据转发
之前说了这么多都是在做铺垫,本篇博文主要想介绍的一点是路由器是如何转发不同网络中的数据包。算法如下:
- 从收到的分组的首部提取目的 IP 地址 D。
- 先用各网络的子网掩码和 D 逐位相“与”,看是否和相应的网络地址匹配。若匹配,则将分组直接交付。否则就是间接交付,执行3。
- 若路由表中有目的地址为 D 的特定主机路由,则将分组传送给指明的下一跳路由器;否则,执行4。
- 对路由表中的每一行的子网掩码和 D 逐位相“与”,若其结果与该行的目的网络地址匹配,则将分组传送给该行指明的下一跳路由器;否则,执行5。
- 若路由表中有一个默认路由,则将分组传送给路由表中所指明的默认路由器;否则,执行6。
- 报告转发分组出错。

| 目的网络地址 | 子网掩码 | 下一跳 |
|---|---|---|
| 128.30.33.0 | 255.255.255.128 | 接口0 |
| 128.30.33.128 | 255.255.255.128 | 接口1 |
| 128.30.36.0 | 255.255.255.0 | R2 |
R2的路由表:
| 目的网络地址 | 子网掩码 | 下一跳 |
|---|---|---|
| 128.30.33.0 | 255.255.255.128 | R1 |
| 128.30.33.128 | 255.255.255.128 | 接口0 |
| 128.30.36.0 | 255.255.255.0 | 接口1 |
在上图中,若H1(128.30.33.13)想给H3(128.30.36.12)发送数据,我们来分析一下具体的过程:
- 主机 H1 首先将本子网的子网掩码 255.255.255.128与分组的 IP 地址 128.30.36.12 逐位相“与”(AND 操作)。即255.255.255.128 AND 128.30.36.12 得到 128.30.36.0,发现不等于128.30.33.0,所以他要将数据报发送到它的默认网关(128.30.33.1)上。
- R1收到这个地址后,会遍历所有的子网掩码,进行按位与后再和对应的网络地址做比对。可以得到转发给R2计算过程如下:
- 255.255.255.128 AND 128.30.36.12 = 128.30.36.0 不等于 128.30.33.0
- 255.255.255.128 AND 128.30.36.12 = 128.30.36.0 不等于 128.30.33.128、
- 255.255.255.0 AND 128.30.36.12 等于 128.30.36.0
- R1收到这个地址后,会遍历所有的子网掩码,进行按位与后再和对应的网络地址做比对。可以得到转发给接口1。
- 然后便是链路层需要解决的问题。
ARP深入
只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP 协议就会自动地将该 IP 地址解析为链路层所需要的硬件地址。可以分为四种情况:
- 发送方是主机,要把IP数据报发送到本网络上的另一个主机。这时用 ARP 找到目的主机的硬件地址。
- 发送方是主机,要把 IP 数据报发送到另一个网络上的一个主机。这时用 ARP 找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成。
- 发送方是路由器,要把 IP 数据报转发到本网络上的一个主机。这时用 ARP 找到目的主机的硬件地址。
- 发送方是路由器,要把 IP 数据报转发到另一个网络上的一个主机。这时用 ARP 找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成。
IP数据报的格式



- 协议(8 位):指出此数据报携带的数据使用何种协议,即运输层协议。
- 首部检验和(16 位)字段只检验数据报的首部不检验数据部分。
- 源地址和目的地址都各占 4 字节。
NAT
在现在的网络中,IP地址分为公网IP地址和私有IP地址。公网IP是在Internet使用的IP地址,而私有IP地址则是在局域网中使用的IP地址。私有IP地址是一段保留的IP地址。只使用在局域网中,无法在Internet上使用。
- A类私有地址:10.0.0.0~10.255.255.255
- B类私有地址:172.16.0.0~172.31.255.255
- C类私有地址:192.168.0.0~192.168.255.255
这些地址可以在任何组织或企业内部使用,和其他Internet地址的区别就是,仅能在内部使用,不能作为全球路由地址。这就是说,出了组织的管理范围这些地址就不再有意义,无论是作为源地址,还是目的地址。对于一个封闭的组织,如果其网络不连接到Internet,就可以使用这些地址而不用向 IANA(The Internet Assigned Numbers Authority,互联网数字分配机构,是负责协调一些使Internet正常运作的机构) 提出申请,而在内部的路由管理和报文传递方式与其他网络没有差异。
对于有Internet访问需求而内部又使用私有地址的网络,就要在组织的出口位置部署NAT网关,在报文离开私网进入Internet时,将源IP替换为公网地址,通常是出口设备的接口地址。一个对外的访问请求在到达目标以后,表现为由本组织出口设备发起,因此被请求的服务端可将响应由Internet发回出口网关。出口网关再将目的地址替换为私网的源主机地址,发回内部。这样一次由私网主机向公网服务端的请求和响应就在通信两端均无感知的情况下完成了。依据这种模型,数量庞大的内网主机就不再需要公有IP地址了。

