第四章 网络层
4.1 网络层服务
4.1.1 网络层提供的服务
(1) 从发送主机向接收主机传送数据段 (segment)
(2) 发送主机:将传输层交付的数据段封装到数据报 (datagram) 中
(3) 接收主机:向传输层交付数据段 (segment)
(4) 网络层并非端到端服务,每个主机和路由器都运行网络层协议
(5) 路由器检验所有穿越它的IP数据报的头部域
★ 根据头部域决策如何处理该IP数据报
4.1.2 网络层核心功能
1. 转发
转发 (forwarding) : 将分组从路由器的输入端口转移到合适的输出端口。
那么问题来了,当一个数据报输入网络中的某个路由器时,这个路由器如何选择所谓的“合适的输出端口”?
答: 每个路由器事先都已经准备好了一些信息,即每一个路由器会维护一个转发表。当数据包传入时,根据数据包中的地址信息,可以到转发表中查找地址信息对应的输出链路。
2. 路由
路由 (routing) : 确定分组从源到目的经过的路径。
那么如何得到所谓的路径信息呢?
答: 网络层的协议都会运行一些路由协议 (或称路由算法) ,根据路由算法确定从源到目的应该走什么路径、如何转发。这些路由算法所确定的路径信息就记录在转发表中。
3. 连接建立
网络层进行数据分组传输之前,两端主机需要首先建立虚拟/逻辑连接。
连接路径上的每一个网络设备 (如路由器) 都要参与连接的建立并记录连接。
并非所有网络都需要连接建立功能,连接建立只是某些网络的重要功能 (例如ATM网络、帧中继网络、X.25网络) 。
网络层连接与传输层连接的对比:
★ 网络层连接: 两个主机之间 (路径上的路由器等网络设备参与其中)
★ 传输层连接: 两个应用进程之间 (对中间网络设备透明)
4.1.3 网络层服务模型
1. 网络服务模型举例
问题: 网络层为发送端 (主机) 到接收端 (主机) 的数据报传送“通道 (channel) ”提供什么样的服务模型 (service model) ?
不同的网络提供的网络服务模型是不同的。
我们最常用的 Internet 网络所提供的服务模型名为 best effort 尽力服务 (即什么也不保证的服务,带宽、丢包率、有序传输、延迟率、拥塞反馈均不保证)。
而ATM (异步传输模式网络,一个从电话网络发展而来的综合服务网络) 可以提供四种不同的网络层服务模型 (分别为固定、可变、可用、不保留 比特率模型)。CBR 固定比特率又称为电路仿真,就像一个电路一样,比特率是固定不变的,因而也不需要拥塞控制;ABR 可用比特率是指网络很空闲时可以以很高的数据传输速率进行传输,而当网络发生拥挤或拥塞时,则需要把速率降到保证服务的最低速率。
2. 网络服务模型分类
可以把网络服务模型分为两类:无连接服务和连接服务。
(1) 无连接服务 (connection-less service):
★ 不事先为系列分组 (从源向目的主机发送的一系列数据报) 的传输确定传输路径
★ 每个分组独立确定传输路径
★ 不同分组可能传输路径不同,时路由器根据网络状况临时决定的
★ 按序发送的数据可能会乱序到达
★ 最具有代表性的无连接服务: 数据报网络 (datagram network)
(2) 连接服务 (connection service):
★ 首先为系列分组的传输确定从源到目的经过的路径 (建立连接)
★ 然后沿该路径 (连接) 传输系列分组
★ 系列分组传输路径相同
★ 按序发送的数据会按序到达,数据传输顺序能够得到保障
★ 传输结束后拆除连接
★ 最具有代表性的连接服务: 虚电路网络 (virtual-circuit network)
后面章节将会详细介绍 数据报网络 和 虚电路网络。
4.2 虚电路网络
4.2.1 连接服务与无连接服务
数据报 (datagram) 网络与虚电路(virtual-circuit) 网络是典型两类分组交换网络。
数据报网络提供网络层无连接服务。
虚电路网络提供网络层连接服务。
类似于传输层的无连接服务 (UDP) 和面向连接服务 (TCP),但是网络层服务:
★ 网络层连接提供的是主机到主机的服务
★ 网络层的服务最关键在于网络核心实现,而不在于端系统
4.2.2 虚电路 (Virtual circuits)
1. 定义
要想了解虚电路网络,首先要了解什么是虚电路,虚电路实际上是从电路网络借用来的一种思想或策略。
虚电路: 一条从源主机到目的主机,确定一条类似于电路的路径 (逻辑连接)。
之所以叫虚电路,是因为和电路网络中的电路并不同,区别在于:
★ 分组交换 (电路交换中数据不需要分组)
★ 每个分组的传输利用链路的全部带宽 (电路交换使用多路复用技术,一般只占链路的一部分资源)
★ 源到目的路径经过的网络层设备共同完成虚电路功能
虚电路结合了电路交换和分组交换的优点。
2. 通信过程
呼叫建立 (call setup)→数据传输→拆除呼叫
★ 在虚电路网络中借用了很多电路交换的术语,例如呼叫建立。
问: 虚电路建立完成后,如何保证分组能够按照这一条虚电路传输呢?
★ 答: 在虚电路建立的时候,会为虚电路分配一个ID (或称标识),叫做VCID。
每个分组携带虚电路标识 (VCID),而不是目的主机地址。
虚电路经过的每个网络设备(如路由器),都要参与建立和维护每条经过它的虚电路的连接状态。
链路、网络设备资源 (如带宽、缓存等) 可以面向VC进行预分配
★ 预分配资源 = 可预期服务性能
★ 如ATM的一种网络服务: 电路仿真(CBR)
4.2.3 VC的具体实现
每条虚电路包括:
1. 从源主机到目的主机的一条路径
2. 虚电路号 (VCID),沿路每段链路一个编号
3. 沿路每个网络层设备 (如路由器),利用转发表记录经过的每条虚电路
沿某条虚电路传输的分组,携带对应虚电路的VCID,而不是目的地址
在网络中,不同链路的带宽不同,从而所能容纳的虚电路ID量也不同,因此想要在一个网络的所有链路上都是用同样的虚电路ID是不现实的,必须采用局部化管理,即同一条虚电路在每一段链路上的虚电路ID是不同的。
同一条VC,在每段链路上的VCID通常不同
★ 路由器转发分组时依据转发表改写/替换虚电路号
4.2.4 VC转发表例子
期望建立一条如图中红线所示的虚电路,这条虚电路在不同链路上的虚电路ID可能是不同的 (例如图中12、22、32)。
虚电路的路径上的每一个设备都要记录这个虚电路,那么是怎么记录的呢?记录方式如下转发表。
4.2.5 虚电路信令协议 (signaling protocols)
虚电路网络在传输分组之前一定要建立一条虚电路连接。那么就需要一个协议来完成虚电路的建立,这类协议称之为信令协议。
用于VC的建立、维护与拆除
★ 存在路径选择问题 (通过哪些设备),也即路由问题,只不过是在虚电路建立时一次性路由
应用于虚电路网络
★ 如ATM、帧中继 (frame-relay)网络等 (都是典型的虚电路网络)
目前的Internet不采用 (因为Internet是数据报网络而不是虚电路网络)
4.3 数据报网络
4.3.1 数据报网络的特点
(1) 网络层无连接
(2) 每个分组携带目的地址
(3) 路由器根据分组的目的地址转发分组
★ 基于路由协议/路由算法构建转发表
★ 路由器通过检索转发表才知道如何转发各个分组
★ 每个分组独立选路 (这可能导致送达同一目的主机的分组所选路径是不同的)
4.3.2 数据报转发表
以Intnet网络为例,上述“目的地址”采用各主机的IP地址。在IPv4中,主机IP地址是32位二进制地址,32位地址的地址空间大概为40多亿,如果转发表要记录每一个可能到达的IP地址的话,转发表中就要存储40多亿个地址,这会使转发表非常庞大。如何解决这个问题?
我们可以采取这样的方法: 在多数情况下,不针对某一具体的IP地址进行转发,而是针对一个地址范围进行转发。也即将目的地址在同一个范围内的转发表项进行聚合。
按照这样一个思路,转发表可能长成下面这样:
可以观察到,聚合之后的每一个地址范围,都代表了一块连续的地址,例如上图绿色部分、粉色部分、紫色部分代表了三块不相交的连续地址空间,这样的地址划分是“完美的”。
但是实际上,在实际应用中,地址的分配和使用不会这么完美。
4.3.3 最长前缀匹配优先
第二个目标地址明明同时符合1、2号接口的要求,为什么采用1号接口转发,而不采用2号接口呢?
最长前缀匹配优先: 在检索转发表时,优先选择与分组目的地址匹配前缀最长的入口(entry)。
这与投送信件是一样的道理,如果有一个粗略的地址 (黑龙江省) 和一个详细的地址 (黑龙江省哈尔滨市),那么一定选择投递到那个更详细的地址。
4.3.4 数据报网络 or VC网络?
1. Internet (数据报网络)
(1) 专注于计算机之间的数据交换
★ “弹性”服务,没有严格时间需求,例如早期的邮件、Web,都对时间没有要求
(2) 源到目的主机经过的链路类型众多
★ 特点、性能各异
★ 统一服务困难
(3) “智能” 端系统 (计算机)
★ 可以自适应、性能控制、差错恢复
(4) 简化网络,复杂“边缘”,很多功能都交给边缘 (端系统) 来实现
2. ATM (VC网络)
(1) 电话网络演化而来
(2) 核心业务是实时对话:
★ 严格的时间、可靠性需求
★ 需要有保障的服务
(3) “哑 (dumb) ” 端系统 (非智能)
★ 电话机、传真机远不如计算机智能
(4) 简化“边缘”,复杂网络,很多功能都交给网络来实现
4.4 IP协议(1) — IP数据报
从这一节开始,主要介绍Internet的网络层,以及Internet网络层的重要核心协议: IP协议。首先从IP协议的IP数据报开始讲起。
4.4.1 Internet 网络层概述
在介绍IP数据报之前,先来结合下图大概了解一下 Internet 网络层。
Internet 网络层是典型的数据报网络,数据报网络主要提供的功能是路由和转发。
完成路由功能,需要网络中的路由器根据路由协议去计算路径,因此Internet 网络层的一个重要内容就是路由协议。
计算出来的路径信息通常存储在转发表 (或称路由表) 中,这个转发表供网络层协议在转发或处理数据分组时使用,在Internet 网络中,这个所谓网络层协议就是IP协议。
IP协议在传输或处理分组时,难免会出现差错,把这些差错信息传输给路由器或者主机也是网络层的功能,这时就需要另一个协议: ICMP协议。ICMP协议可以看作是IP协议的伴随协议,也即在实现IP协议的同时,也要实现ICMP协议。
4.4.2 IP数据报 (或称IP分组) 格式
IP数据报中包含两个部分,分别是首部和数据。
数据是根据上层协议 (TCP或UDP) 而封装的的数据分组。
首部包含很多字段 (或称域),每个域都有不同的作用,后面会详细解释。
首部又可以分为固定部分和可变部分,固定部分是指在所有的IP数据报中都是固定大小的;可变部分的长度是不确定的,也可以没有。
1. 版本号
版本号字段占4位: IP协议的版本号
★ 例如: 4→IPv4,6 → IPv6
2. 首部长度
首部长度字段占4位: IP分组首部长度
★ 以4字节为单位,4个字节32位正好是首部的一行
★ 因为只占4位,不足以用来描述首部的长度,所以以4字节为单位
★ 例如: 5→IP首部长度为20(5×4)字节
3. 服务类型 (TOS)
服务类型 (TOS) 字段占8位: 指示期望获得哪种类型的服务
★ 1998 年这个字段改名为区分服务,意为IP协议给不同的数据报提供不同的服务 (如优先转发)
★ 只有在网络提供 区分服务 (DiffServ) 时这个字段才有效
★ 一般情况下不使用这个字段,那么通常IP分组的该字段 (第2字节) 的值为00H
4. 总长度
总长度字段占16位: IP分组的总字节数 (首部 + 数据)
★ 最大IP分组的总长度:65535 B
★ 最小的IP分组首部:20 B
★ IP分组可以封装的最大数据: 65535 - 20 = 65515 B
标识、标志位、片位移都和IP分片有关,后面介绍。
5. 生存时间 (TTL)
生存时间 (TTL) 字段占8位: IP分组在网络中可以通过的路由器数 (或跳步数)
★ 路由器转发一次分组,TTL减1
★ 如果TTL = 0,路由器则丢弃该IP分组
6. 协议字段
协议字段占8位: 指示IP分组封装的是哪个协议的数据包
★ 实现复用 / 分解
★ 例如: 6为TCP,表示封装的为TCP段;17为UDP,表示封装的是UDP数据报
7. 首部校验和
首部校验和字段占16位: 实现对IP分组首部的差错检测
★ 计算校验和时,该字段置全0
★ 采用反码算数运算求和,和的反码作为首部校验和字段 (与UDP类似)
★ 每次经过路由器都要检验,即逐跳计算、逐跳校验
8. 源IP地址、目的IP地址
源IP地址、目的IP地址字段各占32位: 分别标识发送分组的源主机/路由器(网络接口)和接收分组的目的主机/路由器 (网络接口) 的IP地址
9. 选项
选项字段占长度可变,范围在1~40B之间: 携带安全、源选路径、时间戳和路由记录等内容
★ 源选路径: 在源主机就已经选择好的从源到目的主机的路径,中间的路由器就按照这一路径进行转发
★ 实际上很少被使用
10. 填充
填充字段占长度可变,范围在0~3B之间: 目的是补齐整个首部,符合32位对齐,即保证首部长度是4字节的倍数,因为首部长度字段是以4字节为单位的
4.5 IP协议(2) — IP分片
4.5.1 最大传输单元 (MTU)
网络层的IP数据报需要封装到链路层的数据帧中才能传输,不同的链路在封装数据帧时,对数据本身是有一些要求的,比如限制最大的数据字节数,即:
网络链路存在MTU (最大传输单元) — 链路层数据帧可封装数据的上限
★ 不同链路的MTU不同
那么如果相邻链路的MTU不同,该怎么办呢?
4.5.2 IP分片与重组
大IP分组向较小MTU链路转发时,可以被“分片” (fragmented) (并不是必然分片)
★ 1个IP分组分为多片IP分组
★ IP分片到达目的主机后进行“重组” (reassembled),中间的路由器不会组装
IP首部的相关字段用于标识分片以及确定分片的相对顺序
★ 总长度、标识、标志位和片偏移
4.5.3 IP分组格式
1. 标识
标识字段占16位:标识一个IP分组
★ IP协议利用一个计数器,每产生IP分组计数器加1,作为该IP分组的标识
★ 使用标识字段并不足以完全标识一个IP分组,因为两个主机完全可能产生两个标识相同的IP分组。因此还需要利用源IP地址、目的IP地址以及协议字段共同表示一个IP分组,这样一来,IP分组就被唯一地确定了。
2. 标志位
标志位字段占3位:
★ DF (Don’t Fragment)
★ MF (More Fragment)
★ DF =1:禁止中间的路由器对IP数据报进行分片;
★ DF =0:允许中间的路由器对IP数据报进行分片
★ MF =1:非最后一片;
★ MF =0:最后一片 (或未分片)
3. 片偏移
片偏移字段占13位:一个IP分组分片封装的原IP分组数据的相对偏移量
★ 片偏移字段以8字节为单位
★ 以8字节为单位也是因为片偏移字段只有13位,以1字节为单位不够用
★ 因此除了最后一片,前面所有片封装的数据量都是8字节的整数倍
★ 若为分片,则该字段为0
4.5.3 IP分片过程
★ 假设原IP分组总长度为L,待转发链路的MTU为M
★ 若L>M,且DF=0,则可以 / 需要分片
★ 分片时每个分片的标识复制原IP分组的标识
★ 通常分片时,除最后一个分片,其他分片均分为MTU允许的最大分片
★ 假设IP数据报没有选项字段,那么IP数据报首部为20字节
★ 一个最大分片可封装的数据应该是8的倍数,因此,一个最大分片可封装的数据为:
d
=
⌊
M
−
20
8
⌋
×
8
d=\lfloor \frac{M-20}{8} \rfloor×8
d=⌊8M−20⌋×8
★ 需要的总片数:
n
=
⌈
L
−
20
d
⌉
n=\lceil \frac{L-20}{d} \rceil
n=⌈dL−20⌉
★ 每片的片偏移字段取值为: (因为片偏移字段以8字节为单位,所以除以8)
F
i
=
d
i
8
×
(
i
−
1
)
,
i
=
1
,
2
,
.
.
.
n
F_{i}=\frac{d_{i}}{8}×(i-1), i=1,2,...n
Fi=8di×(i−1),i=1,2,...n
★ 每片的总长度字段为
L
i
=
{
d
+
20
,
1
⩽
i
<
n
−
1
L
−
(
n
−
1
)
d
,
i
=
n
L_{i}=\left\{\begin{matrix}d+20, \quad 1\leqslant i <n-1\\L-(n-1)d, \quad \ \ \ i=n \end{matrix}\right.
Li={d+20,1⩽i<n−1L−(n−1)d, i=n
★ 每片的MF标志位为
M
F
i
=
{
1
,
1
⩽
i
<
n
−
1
0
,
i
=
n
MF_{i}=\left\{\begin{matrix}1, \quad 1\leqslant i <n-1\\0, \quad \quad \quad \quad \ \ i=n \end{matrix}\right.
MFi={1,1⩽i<n−10, i=n
4.6 IP协议(3) — IP编址
4.6.1 IP编址 (addressing)
首先概括地了解一下IP协议采取什么样的策略,对什么样的网络中的实体或对象进行编址。
1. 源、目的地址
一个IP分组有两个非常重要的地址:
★ 源地址 (SA) - 从哪儿来
★ 目的地址 (DA) - 到哪儿去
路由器就是根据这两个地址检索转发表的。
2. 接口
在IP网络中,真正要编址的是什么?这就要考虑IP数据报是从哪里发出来的,事实上是从一台主机的网络接口发出来的,最终也要到达另一台主机的网络接口。
IP编址的对象是实现网络层功能的接口。而交换机、wifi的接入点等设备实现的功能都不在网络层而在链路层,因此不需要为他们进行IP编址。
接口: 主机/路由器与物理链路的连接
★ 实现网络层功能
★ 路由器通常有多个接口
★ 主机通常只有一个或两个接口 (例如,同时有有线的以太网接口和无线的802.11接口)
3. IP地址
IP地址: 32比特 (IPv4) 编号标识主机、路由器的接口
32位二进制数使用起来很不方便,因此以8位为一组转换为10进制进行使用 (点分十进制)
IP地址与每个接口关联,若某主机只有一个接口,可能也会把这个接口的IP地址叫做“主机IP地址”,但是本质上,IP地址是为接口分配的,而不是为主机分配的。
那么问题就来了,怎样为接口分配IP地址呢?如果分配IP地址的过程是没有规律的、随机分配的,那么路由器的转发表将会变得非常复杂。因此IP编址时一定要遵循一定的规律。
4.6.2 IP子网 (Subnets)
下面就介绍IP编址时所要遵循的规律。
将IP地址分为两段:
★ 网络号(NetID) – 高位比特
★ 主机号(HostID) – 低位比特
在IP地址分配时要遵循一个原则,即保证分配到某一区域网络的接口的IP地址应该具有相同的网络号。
那么具有相同网络号的接口就构成了一个IP子网。换句话说,可以用一个网络号来描述这一个区域的网络接口。
IP子网:
★ IP地址具有相同网络号的设备接口
★ 不需要跨越路由器 (第三及以上层网络设备) 就可以彼此物理联通的接口
图中三个由某一区域网络构成的典型的子网不必说,图中还可以看到,路由器之间还有三个子网 (223.1.7、223.1.8和223.1.9),这三个子网比较特殊,实际上,我们可以给它们分配IP地址构造子网,也可以不给它们分配IP地址,不构成子网。
4.7 IP协议(4) — 有类IP地址
IP地址一共32位,将IP地址分为网络号和主机号,那么网络号占几位?主机号占几位?如果网络号占位多,就可以划分更多的子网,如果主机号占位多,一个子网里就可以有更多的接口。
解决这个问题之前,需要对IP地址进行分类,这个分类也可以叫做有类编址。
采用二分法:
4.7.1 A类地址
★ 将最高比特位为0的地址称为A类地址
★ A类地址占去了50%的总地址空间
★ 对于A类地址,规定网络号占8位,主机号占24位
★ 由于最高位已经固定为0,因此可以编址的网络号空间只有
2
7
2^{7}
27
★ 可以根据点分十进制IP地址的第一位十进制数判断某个地址是否属于A类地址,若在0-127之间,则为A类地址
4.7.2 B类地址
★ 将最高比特位为1,次高比特位为0的地址称为B类地址
★ B类地址占去了25%的总地址空间
★ 对于B类地址,规定网络号占16位,主机号占16位
★ 由于最高两位已经固定为10,因此可以编址的网络号空间只有
2
14
2^{14}
214
★ 可以根据点分十进制IP地址的第一位十进制数判断某个地址是否属于B类地址,若在128-191之间,则为B类地址
4.7.3 C类地址
★ 将最高三个比特位为110的地址称为C类地址
★ C类地址占去了12.5%的总地址空间
★ 对于C类地址,规定网络号占24位,主机号占8位
★ 由于最高三位已经固定为110,因此可以编址的网络号空间只有
2
21
2^{21}
221
★ 可以根据点分十进制IP地址的第一位十进制数判断某个地址是否属于C类地址,若在192-223之间,则为C类地址
4.7.4 D类地址
★ 将最高四个比特位为1110的地址称为D类地址
★ D类地址占去了6.25%的总地址空间
★ 对于D类地址,不再划分网络号和主机号
★ 这一类地址用来标识互联网中的一组主机,这一组主机共享同一协议,向某一主机发送数据,组内其他主机都可以接收到一个副本
★ D类地址标识的主机只能作为接收方,不能作为发送方
★ 可以根据点分十进制IP地址的第一位十进制数判断某个地址是否属于D类地址,若在224-239之间,则为D类地址
4.7.5 E类地址
★ 将最高四个比特位为1111的地址称为E类地址
★ E类地址占去了6.25%的总地址空间
★ 对于E类地址,不再划分网络号和主机号
★ 这一类地址留做研究使用
★ 可以根据点分十进制IP地址的第一位十进制数判断某个地址是否属于D类地址,若在240-225之间,则为D类地址
4.7.6 有类IP地址总结
按照有类地址划分,按照IP编制策略明确了网络号和主机号的A类、B类、C类共占了IP地址空间的87.5%,这三类地址是可以用于表示网络中的网络接口的。
A类IP子网数比较少,但是子网中可区分的主机数很多,即A类子网大而少。
C类IP子网数比较多,但是子网中可区分的主机数很少,即C类子网小而多。
这87.5%的地址是否都能分配给主机接口呢?实际上是不能的,因为其中有一些IP地址被用作特殊用处了。
4.7.7 特殊IP地址
★ 当一个主机不知道自己的IP地址,但是还要用IP协议发送数据时,就可以用0.0.0.0为源IP地址。
★ 所谓“本网”指的就是源主机所在的某一个子网
★ 使用本网广播地址可以向本网内的所有主机发送消息
★ “网络地址”就是用来代表某个子网整体的地址,因为子网内所有主机网络号相同
★ 使用直接广播地址可以向本网以外的某个子网的所有主机发送消息
★ 某主机向环回地址发送消息,相当于给自己发送消息
4.7.8 私有 (Private) IP地址
私有IP地址只用于内网,在公共互联网上是无效的。
例如: 单位内网,或者在实验室内部使用。
block表示子网数。
4.8 IP协议(5) — IP子网划分与子网掩码
有类地址划分实际上很不灵活,很容易出现大量的地址浪费。比如一个企业有2000台主机,分配一个C类地址 (可容纳256个主机) 是不够用的,分配一个B类地址 (可容纳65536个主机) 又会造成巨大的浪费。
又比如下图网络,左侧是一个A类地址空间,右侧是一个B类网络和一个C类网络。根据子网的定义我们知道,一个子网之内不能再有路由器,但是在这样一个庞大的子网内没有路由器是不现实的,我们必须对子网再进行划分。
4.8.1 子网划分 (Subnetting)
如何区分一个IP子网更小范围网络 (子网)?
★ 子网划分,对IP地址做出更改,具体方法如下
IP地址:
★ 网络号 (NetID) – 高位比特
★ 子网号 (SubID) – 原网络主机号部分比特
★ 主机号 (HostID) – 低位比特
子网划分之后,可以通过路由器互联在一起,数据传来时,就可以传向划分后的子网,而其他子网不会受到这次通信的影响。
4.8.2 子网掩码 (Subnetting)
作为路由器或者网络中的其他设备,如何确定某个子网是否划分了子网?又利用多少位划分子网?
★ 子网掩码
形如IP地址:
★ 32位
★ 点分十进制形式
取值:
★ NetID、SubID位全取1
★ HostID位全取0
例如:
★ 若没有进行子网划分,则子网掩码为默认值
★ A网的默认子网掩码为:255.0.0.0
★ B网的默认子网掩码为:255.255.0.0
★ C网的默认子网掩码为:255.255.255.0
★ 借用3比特划分子网的B网,主机号前三位均为1,则子网掩码为:255.255.224.0
子网地址 + 子网掩码 → 准确确定子网大小
例如:
★ 未划分的子网的子网地址和子网掩码为201.2.3.0,255.255.255.0
★ 想要将这个子网划分为4个等大的子网
★ 划分后的子网地址中网络号和子网号为特定值,主机号全为0
★ 由于是C类地址,借用IP地址最后8位的前两位作为子网号,那么子网掩码中,这两位变为1
问题又来了,路由器如何确定应该将IP分组转发到哪个子网?
★ 也就是说,子网掩码到底该怎么用。路由器在存储转发表时,不仅要存储子网地址,还要存储子网掩码。
4.8.3 子网掩码的应用 (1)
将IP分组的目的IP地址与子网掩码按位与运算,就可以提取出来这个IP分组要到达的子网地址。
例如:
★ 所谓的“目的IP地址”是某个主机的地址,我们想把数据报发送到这个主机所在的小子网里,因此要根据这个主机的地址计算出这个主机所在的小子网的子网地址。
★ 说是按位与,但不完全是按位与。就拿上图举例,子网掩码后9位为0,因此在按位与时,后9位直接不用计算。
★ 关于地址范围: 由于子网掩码23位,所以主机号占9位,可区分512个主机,由于子网地址是172.32.0.0,也就是说子网的第一个IP地址为172.32.0.0,从这个IP地址开始往后拓展512个主机,那么地址范围就是172.32.0.0-172.32.1.255。
★ 主机号全0是网络地址,主机号全1是直接广播地址
4.8.4 子网掩码的应用 (2)
图中共分8个子网,红色主机号代表网络地址,绿色主机号代表直接广播地址,都是不能分配给端口的。
可见,划分子网会带来一定的网络地址浪费,但是带来的是子网性能的提升。
4.9 IP协议(6) — CIDR与路由聚合
4.9.1 CIDR
有类地址划分可能会造成地址浪费,可能会导致路由效率变低。因此提出一种新的地址模式 / 新的技术: CIDR。
1. 无类域间路由 (CIDR: Classless InterDomain Routing)
(1) 消除传统的 A 类、B 类和 C 类地址界限
(2) NetID+SubID→Network Prefix 将网络号和子网号统称为网络前缀,Prefix可以任意长度
(3) 融合子网地址与子网掩码,方便子网划分
(4) 无类地址格式:a.b.c.d/x,其中x为前缀长度
(5) 例如:
(6) 又例如: 有类地址201.2.3.64,255.255.255.192 → 无类地址201.2.3.64/26
2. 优点
(1) 提高IPv4 地址空间分配效率 (因为有类地址会造成地址浪费)
(2) 由于摆脱了有类地址,那么就可以把A类子网划分成小子网再组合,也可以把C类子网聚合起来
(3) 更重要的是提高路由效率
★ 可以将多个子网聚合为一个较大的子网,即构造超网 (supernetting)
★ 优势在于可以在转发表里记录超网的信息,而不是小子网的信息
★ 这样一种技术也叫做路由聚合 (route aggregation)
4.9.2 路由聚合
层级编址使得路由信息通告更高效:
这里会产生一个问题,在路由聚合时,要求小子网是连续的,最好是2的幂次个子网,那样才便于合成一个超网,但是在实际中,有可能不满足这样的条件。比如:
上图中,组织1并不属于上面的超网,但是上面的超网在信息通告时却把组织1包含进来了。那么,想要发给组织1的消息真的会被误传入上面的超网中吗?答案是否定的,因为采用了最长前缀匹配优先。
最长前缀匹配优先: 路由器在分发消息时,可能有两个出口都满足条件,那么一定要选择那个前缀匹配位数更长的一个出口。
4.10 DHCP协议
作为一台主机,如何在互联网上获得一个IP地址?
4.10.1 “硬编码”
静态配置: 每个主机需要从管理员那里获得一个确定的IP地址,然后通过静态配置完成地址信息获取
★ 子网掩码根据前缀来确定,前缀是25,所以子网掩码是255.255.255.128
★ 默认网关即,当数据报要离开这个子网时,应该把数据报送到哪个接口去;也就是说路由器接入该子网的接口的IP地址就成为了该子网所有主机的默认网关
4.10.2 动态主机配置协议-DHCP: Dynamic Host Configuration Protocol
1. DHCP概述
(1) 从DHCP服务器动态获取:
★ IP地址
★ 子网掩码
★ 默认网关地址
★ DNS服务器名称与IP地址
(2) “即插即用”
(3) 允许地址重用: 一台主机停用某个IP地址后,别的主机就可以用了
(4) 支持在用地址续租
(5) 支持移动用户加入网络
(6) 在分配地址过程中主机和服务器可能会交换如下报文:
★ 主机广播 “DHCP discover”(发现报文) (主机也不知道是否存在可以提供服务的DHCP服务器,因此要广播)
★ DHCP服务器利用 “DHCP offer” (提供报文) 进行响应
★ 主机请求IP地址: “DHCP request” (请求报文)
★ DHCP服务器分配IP地址: “DHCP ack” (确认报文)
2. DHCP工作过程示例
(1) DHCP协议在应用层实现
★ 通过应用进程来实现,采用典型的客户服务器模型
★ 请求报文封装到UDP数据报中,进入应用层
★ 进入网络层,通过IP广播形式传播
★ 进入链路层,通过链路层广播 (e.g. 以太网广播) 传播
★ 服务器通过广播的方式得到信息
(2) DHCP服务器构造ACK报文
★ 包括分配给客户的IP地址、子网掩码、默认网关、DNS服务器地址
4.11 网络地址转换 (NAT)
IPv4的地址空间除去D、E类地址后的A、B、C三类地址,再去除一些特殊地址和私有地址,剩余的地址已经被分配殆尽了。这对于使用本地网络的主机来说,没什么影响,因为它们使用的是私有地址,这个地址只在本地小范围内有效。然而,如果一台主机想要连接互联网,就一定要有一个IP地址,但是IP地址根本不够互联网上那么多主机瓜分,这该怎么办呢?
解决这个问题的方法就是网络地址转换
4.11.1 NAT概述
下图中,左侧是互联网,右侧是本地网络 (内部网络),私有地址为10.0.0.0/24。
路由器在把内部网络发送到互联网之前,必须进行地址替换。那么,作为路由器,第一要实现地址转换的功能,第二要拥有至少一个公共IP地址 (俗称合法IP)。
本地网络中的主机进行数据包交换时,直接使用私有地址就可以。但是如果要向互联网发送数据报,就要把这个本地网络中的所有主机的源IP地址都替换成路由器的公共IP地址138.76.29.7,并且,为了区分本地网络中的不同主机,还要给每个主机分配一个独一无二的端口号。
当然,端口号实际上是传输层的概念,但是属于网络层的NAT却修改了由传输层负责的端口号这一内容。
4.11.2 NAT的动机
(1) 一个本地网络的所有主机只需 / 能从ISP申请一个IP地址
★ ISP: Internet Service Provider,即“互联网服务提供商”
★ 一个主要原因是IPv4地址耗尽
(2) 本地网络设备私有IP地址的变更,无需通告外界网络
(3) 变更ISP时,无需修改内部网络设备IP地址
(4) 内部网络设备对外界网络不可见,即不可直接寻址 (安全)
4.11.3 NAT的实现
分为三步走:
(1) 替换
★ 利用 (NAT IP地址,新端口号) 替换每个外出IP数据报的 (源IP地址,源端口号)
(2) 记录
★ 将每对 (NAT IP地址,新端口号) 与 (源IP地址,源端口号) 的替换信息存储到NAT转换表中
★ 记录的目的是,当数据报从互联网回来时,目的IP地址依旧是路由器的公共IP地址,根据NAT转换表,就可以转换为本地网络的IP地址
(3) 替换
★ 根据NAT转换表,利用 (源IP地址,源端口号) 替换每个进入内网IP数据报的 (目的IP地址,目的端口号),即 (NAT IP地址, 新端口号)
由于端口号实际上是16位数的字段,因此可以同时支持60,000多并行连接,可以满足绝大多数的本地网络。
4.11.4 NAT的争议
(1) 违背层次关系
★ NAT的服务都集成在路由器中,而路由器应该只处理网络层的功能,不应该把传输层已经封装好的内容再拿出来进行修改
(2) 违背端到端通信原则
★ 传输层实际上是端到端的,端口号也是端到端的一部分,那么中间经过的路由器不应该对端口号进行修改
★ 端到端的应用开发者必须考虑到NAT的存在,e.g.,P2P应用
(3) 地址短缺问题不应该由NAT解决,而应该由IPv6来解决
4.11.5 NAT穿透问题
NAT穿透问题对应于 “替换-记录-再替换” 的 “再替换” 步骤。
由于本地网路在访问互联网时,使用的都是公共IP地址,那么互联网上的主机是不知道本地网络中的主机的真实地址的,那么,如果互联网上的主机想要访问本地网络中的主机,就一定要越过NAT,直接找到NAT背后隐藏的本地网络的主机,把这个过程叫做NAT穿透。那么,可以通过什么方法完成NAT穿透呢?
客户期望连接内网地址为10.0.0.1的服务器,但是客户不能直接利用地址10.0.0.1直接访问服务器,对外唯一可见的地址是NAT地址: 138.76.29.7。
(1) 解决方案1: 手工静态配置NAT,将特定端口的连接请求转发给服务器
★ e.g.,(138.76.29.7, 2500) 总是转发给 (10.0.0.1, 25000)
(2) 解决方案2: 利用UPnP (Universal Plug and Play) 互联网网关设备协议 (IGD-Internet Gateway Device ) 自动配置:
★ 本地网络内部主机和路由器要支持UPnP协议
★ 本地网络主机可以自动学习到NAT公共IP地址 (138.76.29.7)
★ 并且可以在NAT转换表中,增删端口映射
★ 通过这样的手段,就可以自动完成 “静态配置” 的过程
解决方案3: 中继 (如Skype即时消息系统)
★ 在公共网络上设置若干个中继服务器
★ NAT内部的客户与中继服务器建立连接
★ 外部客户也与中继服务器建立连接
★ 中继服务器桥接两个连接的分组
4.12 互联网控制报文协议 (ICMP)
在互联网中的IP数据报传输过程中难免会出现差错,最简单的处理方式就是把出错的IP数据报丢弃掉,但是仅仅丢弃掉是不够的,目的主机还要通过ICMP协议向源主机发送一个差错报告。
4.12.1 ICMP概述
1. 功能
支持主机或路由器:
(1) 差错 (或异常) 报告
(2) 网络探询
2. 两类报文
(1) 差错报告报文 (5种)
有以下这些情况时,目的主机或路由器可以向源主机发送对应类型的报文,报告错误。
★ 目的不可达
在已经到达目的主机的情况下,无法成功交付给目的网络、主机或端口
★ 源抑制 (Source Quench)
网络拥塞 (路由器缓存已满) 情况下丢弃报文
路由器发送该报文给源主机希望主机降低发送速率
但是现实中网络的拥塞控制并不是采取这种方式的
★ 超时 / 超期
数据报经过的路由器数量超过了TTL
★ 参数问题
路由器认为IP数据报头部的某些参数有问题
★ 重定向 (Redirect)
某个路由器收到了本不应该由它转发的报文
(2) 网络探询报文 (2种)
是由主机或者路由器主动发送,用来对网络进行探寻的报文。
★ 回声 (Echo) 请求与应答报文 (Reply)
某个主机想探测到目的主机的网络是否通畅,可以发送回声报文,并根据回声判断网络情况
★ 时间戳请求与应答报文
用于获取时间戳
类型+编码 代表了某一种具体的报文。
3. 例外情况
(1) 几种不发送ICMP差错报告报文的特殊情况:
★ 对ICMP差错报告报文不再发送 ICMP差错报告报文
★ 除第1个IP数据报分片外,对所有后续分片均不发送ICMP差错报告报文
★ 对所有多播IP数据报均不发送 ICMP差错报告报文
★ 对具有特殊地址 (如127.0.0.0 或 0.0.0.0) 的IP数据报不发送ICMP差错报告报文
(2) 几种早期定义的ICMP报文已不再使用
★ 信息请求与应答报文
★ 子网掩码请求和应答报文
★ 路由器询问和通告报文
4.12.2 ICMP报文的格式
ICMP报文需要封装到IP数据报中传输。
1. 通用格式
所有报文的前四个字节都能反映着同样类型的信息。
2. ICMP差错报告报文数据封装
IP数据报在传输过程中出现差错,路由器就会将它丢弃,并向源主机发送一个ICMP差错报告。
在这个ICMP差错报告的报文中,要封装出错的IP数据报的完整头部和这个数据报的前8个字节。
如果数据报是UDP数据报,那么前8个字节就是完整的UDP头部,包含源、目的端口号等重要信息。
如果数据报是TCP数据报,虽然前8个字节不是完整的TCP头部 (总长20个字节),但是也已经包含源、目的端口号这两个重要信息。
4.12.3 ICMP的应用举例:Traceroute工具
这个工具用于网络路径跟踪,即记录从源主机出发到达目的主机经过哪些路由器。为了实现这一功能,Traceroute可以这样做:
(1) 源主机向目的主机发送一系列UDP数据报
★ UDP数据报要被封装在IP数据报中,封装时可以设置:
★ 第1组IP数据报TTL=1 (一般一组发3个)
★ 第2组IP数据报TTL=2, etc.
★ 目的端口号为目的主机上的一个无法使用的端口号
(2) 当第n组数据报 (TTL=n) 到达第n个路由器时:
★ 路由器丢弃数据报
★ 向源主机发送ICMP报文 (type=11, code=0)
★ ICMP报文携带路由器名称和IP地址信息
(3) 当ICMP报文返回到源主机时,记录往返时间为RTT
那么如何判断报文已经到达目的主机了呢?
停止准则:
★ UDP数据报最终到达目的主机
★ 目的主机返回“目的端口不可达”ICMP报文 (type=3, code=3)
★ 源主机收到这样一个报文之后,就可以停止了
当然,在探测过程中,由于互联网数据报传输时,满足 “路由” 功能,因此每次走的路径可能不同,但是实际上,短时间内这个路径是不变的,因为路由表的更新不会那么快。
4.13 IPv6简介
4.13.1 IPv6的动机
(1) 最初动机: 32位IPv4地址空间已分配殆尽
(2) 其他动机: 改进数据报首部格式
★ 希望在新版本的协议中支持快速处理 / 转发数据报
★ 希望在新版本的协议中支持QoS
4.13.2 IPv6数据报格式
(1) 固定长度的40字节基本首部
★ IPv4由于有 “选项” 域,因此长度不固定,若不含选项域,则长度为20字节
★ 虽然IPv6没有选项域,但是支持通过扩展首部添加选项,也可以称为选项首部
★ 路由器不需要处理扩展首部 (选项首部),这也有利于路由器快速处理数据报
(2) 不允许路由器对数据片进行分片
(3) 版本号:
★ 4bit的IPv6版本号
(4) 优先级 (priority):
★ 标识数据报的优先级
(5) 流标签 (flow Label):
★ 标识同一 “流” 中的数据报 (流: 从一个源主机到另一个目的主机的一系列数据报)
(6) 载荷长度:
★ 扩展首部和数据部分的总长度
(7) 下一个首部 (next header):
★ 标识下一个选项首部或上层协议首部 (如TCP首部)
★ 如果数据报有扩展首部,那么就指向扩展首部
★ 最后一个扩展首部指向上层协议首部 (TCP或UDP首部)
(8) 跳步限制:
★ 对应IPv4中的TTL
★ 路由器每转发一次,就把跳步限制减1,减到0后路由器不再转发,直接丢弃,发送ICMP报文
4.13.3 其他改变 vs IPv4
(1) 校验和(checksum):
★ 彻底移除,以减少每跳处理
时间
(2) 选项(options):
★ 允许,但是从基本首部移出,定义多个选项首部,通过 “下一个首部” 字段指示
(3) ICMPv6: 新版ICMP
★ 增加报文类型,e.g. “Packet Too Big”,即超过链路层MTU
★ 增加多播组管理功能
4.13.4 IPv6地址表示形式
(1) 一般形式
★ 把128位的IPv6地址划分为16位一组,每组转化为16进制数,共8组
★ 例如: 1080:0:FF:0:8:800:200C:417A
(2) 压缩形式
★ 由于IPv6地址空间非常大,经常有很多位是0,可以将连续0用两个 :: 表示
★ 由于没有规定 :: 代表几个0,因此不能在同一地址中使用两次 ::
★ FF01:0:0:0:0:0:0:43 压缩→FF01::43
(3) IPv4-嵌入形式
★ 将前80位固定为0,接下来16位全1,后32位表示IPv4地址,兼容IPv4地址
★ 0:0:0:0:0:FFFF:13.1.68.3 或 ::FFFF:13.1.68.3
(4) 地址前缀
★ 2002:43c:476b::/48 (注: IPv6不再使用掩码!)
(5) URLs
★ 由于有压缩形式容易产生歧义,因此在url种把IP地址用中括号括起来,后面再跟端口号
★ http://[3FFE::1:800:200C:417A]:8000
4.13.5 IPv6基本地址类型
(1) 单播 (unicast) 地址
★ 一对一通信
★ 可以出现在IPv6数据报源、目的地址中
(2) 多播 (multicast) 地址
★ 一对多通信
★ 只能出现在IPv6数据报目的地址中
★ 标识网络中的一组主机
★ IPv6中不再使用广播地址,而是用多播地址替代
(3) 任意播 (anycast) 地址
★ 一对一组之一 (最近一个) 通信
4.13.6 IPv4向IPv6过渡
(1) 不可能在某个时刻所有路由器同时被更新为IPv6
★ 不会有 “标志性的日期”
★ IPv4和IPv6路由器共存的网络如何运行?
(2) 隧道 (tunneling):
★ 当IPv6数据报需要使用IPv4网络 (IPv4路由器) 进行传输时
★ 要求主机同时支持IPv4和IPv6协议
★ IPv6数据报作为IPv4数据报的载荷进行封装,穿越IP v4网络
4.14 路由算法
4.14.1 路由与转发
路由器要根据转发表将到达它的数据报转发到某个接口上去,完成转发的重要依据就是转发表,而转发表中的重要信息就是通过路由算法计算得来的。
4.14.2 网络抽象:图
1. 节点和边
众多的路由算法对网络的最经典的抽象就是把网络抽象成一张图。
2. 权值 / 费用(Costs)
4.14.3 路由算法分类
不同的分类标准所得的分类结果不同,下面看两个典型的分类标准。
静态路由 vs 动态路由?
(1) 静态路由:
★ 手工配置
★ 路由更新慢
★ 由于人为设置蕴含了人的智慧,优先级高,同等条件下一般首选静态路由
(2) 动态路由:
★ 路由更新快
★ 定期更新
★ 及时响应链路费用或网络拓扑变化
全局信息 vs 分散信息?
(1) 全局信息:
★ 所有路由器掌握完整的网络拓扑和链路费用信息
★ E.g. 链路状态 (LS) 路由算法
(2) 分散 (decentralized) 信息:
★ 路由器只掌握物理相连的邻居以及链路费用
★ 邻居间信息交换、运算的迭代过程
★ E.g. 距离向量 (DV) 路由算法
4.15 链路状态路由算法 (Link State)
这一节介绍一个非常具有代表性的路由算法: 链路状态路由算法。
上一节讲到可以把网络抽象成一张图,求解图的最短路径可以使用什么算法呢?
4.15.1 路由算法原理
(1) 所有结点 (路由器) 都要掌握网络拓扑和链路费用,怎么实现呢?
★ 要求每一个路由器创建一个链路状态分组
★ 分组包含信息:
该路由器以及与之相连的所有路由器的IP地址
以及与该路由器直接相连的链路的费用
★ 每个路由器把这个分组通过 “链路状态广播” 发出去
★ 当每一个路由器都收集了所有的分组,所有结点就拥有相同信息了
(2) 计算从一个结点 (“源”) 到达所有其他结点的最短路径
★ 根据最短路径构建该结点的转发表
(3) 迭代: k次迭代后,得到到达k个目的结点的最短路径
4.15.2 Dijkstra 算法
1. 符号
(1) c(x,y): 结点x到结点y之间的链路费用;如果x和y不直接相连,则=∞
(2) D(v): 从某个源结点到目的结点v的当前路径费用值
(3) p(v): 沿从源到v的当前路径的路径中,v的前序结点
(4) N’: 已经找到最小费用路径的结点集合
2. Dijkstra 算法原理
4.15.3 Dijkstra 算法举例
1. 例1
2. 例2
4.15.4 Dijkstra 算法讨论
(1) 算法复杂性: n个结点
★ 每次迭代: 需要检测所有不在集合N’中的结点w
★ n(n+1)/2 次比较: O(n2)
★ 更高效的实现: O(nlogn)
(2) 存在震荡 (oscillations) 可能:
★ e.g., 假设链路费用是该链路承载的通信量:
★ B、C、D三个路由器要向A发送数据报,大小分别为1、e、1
★ 按照初始状态进行传输的话,可以计算出每条链路的费用
★ 基于初始状态计算出来的费用,可以计算出新的更好的路由路径,这一路径又会改变链路费用
★ 基于改变后的费用,又可以算出新的路由路径……
★ 这样一来,数据永远无法到达A
★ 因此,使用链路状态路由算法时,通常会使用增加延迟等措施避免震荡现象
4.16 距离向量路由算法 (Distance Vector)
1. Bellman-Ford方程 (动态规划)
2 Bellman-Ford 举例
假设已经知道了v、x、w到z的最短距离,求u到z的最短距离。
最关键的一点在于u无需知道整个网络的拓扑,只需要知道和邻居之间的链路费用以及邻居提供的一些信息 (邻居到达其他节点,如x的最短路径),u就能知道到x的最短路径应该经过谁。
这样一来,结点获得最短路径的下一跳,将该信息存于于转发表中,当需要从u向z发送数据报时,u就可以先转发到x。
3. 距离向量路由算法
(1)
D
x
(
y
)
D_x(y)
Dx(y) = 从结点x到结点y的最小费用估计
★ x维护距离向量(DV):
D
x
=
[
D
x
(
y
)
:
y
∈
N
]
D_x = [D_x(y): y∈N ]
Dx=[Dx(y):y∈N]
(2) 结点x:
★ 已知到达每个邻居的费用: c(x,v)
★ 维护其所有邻居的距离向量:
D
v
=
[
D
v
(
y
)
:
y
∈
N
]
D_v = [D_v(y): y∈N ]
Dv=[Dv(y):y∈N]
核心思想:
(1) 每个结点不定时地将其自身的DV估计发送给其邻居
(2) 当x接收到邻居的新的DV估计时,即依据B-F更新其自身的距离向量估计:
(3)
D
x
(
y
)
D_x(y)
Dx(y)将最终收敛于实际的最小费用
d
x
(
y
)
d_x(y)
dx(y)
4. 距离向量路由算法特点
(1) 异步迭代:
★ 每一个路由器并不是同步迭代的,每一个路由器是独立迭代的
引发每次局部迭代的因素:
局部链路费用改变
★ 来自邻居的DV更新
(2) 分布式:
★ 每个结点只当DV变化时才通告给邻居
★ 邻居在必要时 (其DV更新后发生改变) 再通告它们的邻居
4. 距离向量路由算法举例
★ 初始时 (第一列),每个节点只有和邻居之间的距离,而没有邻居节点的信息
★ 有了初始的距离向量估计,每个节点需要把自己的距离向量交换给邻居节点
★ 以x为例,第一收到了邻居的距离向量并存入表中,第二,重新计算x到达其他节点的最短路径,第三,如果本地链路费用有变化,把距离向量重新交换给邻居
★ 将距离向量反映到转发表之中
5. 链路费用变化
如果某个节点的链路费用发生变化,这个节点需要怎么操作呢?
(1) 使用一些协议,定期探测网络,结点可以检测本地链路费用变化
(2) 更新路由信息,重新计算距离向量
(3) 如果DV改变,通告所有邻居
(4) 举例
★ 假设y到x的距离由4变为2,讨论y和z的变化,先不讨论x的变化
★
t
0
t_0
t0 : y检测到链路费用改变 ,更新DV,通告其邻居
★
t
1
t_1
t1 : z收到y的DV更新,更新其距离向量表,计算到达x的最新最小费用,更新其DV,并发送给其所有邻居
★
t
2
t_2
t2 : y收到z的DV更新,更新其距离向量表,重新计算y的DV,未发生改变,不再向z发送DV
★好消息传播快
这里只举例了链路费用变小的好情况,那么链路费用变大的坏情况又是什么样的呢?
6. 无穷计数问题
★ 初始时刻,y到x最短距离为4,z到x最短距离为5
★ 某一时刻,y到x的距离由4变为60
★ 接下来y会认为经过z求x会更近,即y到x最短距离为6
★ 然后z又会以为经过y去x会更近,即z到x最短距离为7……
★ 知道几十次更改后,y才能算出正确的最短距离
★ 坏消息传播慢
那么如何解决无穷级数问题呢?
7. 毒性逆转 (poisoned reverse)
如果一个结点(e.g. Z)到达某目的(e.g.X)的最小费用路径是通过某个邻居(e.g.Y),则:
★ Z通告给Y的 “从Z到达X的距离” 为无穷大
那么毒性逆转能否彻底解决无穷计数问题?
毒性逆转确实可以解决简单网络的无穷计数问题,但是不一定能解决复杂网络的问题。因此实际上还有其他的解决无穷计数问题的方法。
8. 定义最大度量 (maximum metric)
定义一个最大的有效费用值,如15跳步,16跳步表示∞
★ 初始的网络是正常的,R1到192.168.1.0/24距离为1,那么R2到192.168.1.0/24距离为2
★ 某一时刻,R1和192.168.1.0/24的连接断开了
★ 那么R1会认为通过R2到达192.168.1.0/24为最短距离,即3
★ R2又会认为通过R1到达192.168.1.0/24为最短距离,即4……
★ 直至16次跳步之后,最短距离恒定为16,这样一来R1和R2都知道192.168.1.0/24不通了
4.17 层次路由
前面讲的路由算法中,无论是链路状态算法还是距离向量算法,都需要把网络抽象成一张图,然后使用Dijkstra算法或使用Bellman-Ford方程动态规划。小规模网络可以这样做,但是想要将任意规模网络抽象为一个图计算路由,过于理想化。为什么呢,可以考虑以下这两点:
(1) 网络规模:考虑6亿目的结点的网络
★ 路由表几乎无法存储!
★ 路由计算过程的信息 (e.g. 链路状态分组、DV) 交换量巨大,会淹没链路!
(2) 管理自治:
★ 每个网络的管理可能都期望自主控制其网内的路由
★ 互联网 (internet) = 网络之网络 (network of networks)
那么如何解决这个问题,突破网络规模的限制,满足网络自治性的需求?
1. 层次路由
(1) 自治系统
★ 层次路由要对网络再进行一层抽象
★ 把属于同一区域或同一组织的路由器聚合在一起,称为自治系统AS (autonomous systems)
★ 给每个自治系统一个16位的编号
(2) 自治系统内部路由协议
★ 路由被分为两层,同一AS内的路由器运行相同的路由协议 (算法)
★ 即自治系统内部路由协议 (“intra-AS” routing protocol)
★ 不同自治系统内的路由器可以运行不同的AS内部路由协议
(3) 网关路由器 (gateway router)
★ 如果目的网络在自治系统之外怎么办呢? 需要用到网关路由器
★ 网关路由器位于AS“边缘”
★ 通过链路连接其他AS的网关路由器
(4) 互连的AS举例
★ 转发表由AS内部路由算法与AS间路由算法共同配置
★ AS内部路由算法设置AS内部目的网络路由入口 (entries)
★ AS内部路由算法与AS间路由算法共同设置AS外部目的网络路由入口
2. 自治系统间 (Inter-AS) 路由任务
(1) 自治系统间路由任务
假设AS1内某路由器收到一个目的地址在AS1之外的数据报:
★ 网关路由器为1c和1b
★ 那么路由器应该将该数据报转发给哪个网关路由器呢?
AS1必须:
1. 学习到哪些目的网络可以通过自治系统AS2到达,哪些可以通过自治系统AS3到达
2. 通过自制系统间路由协议 将这些网络可达性信息传播给AS1内部路由器
这就是自治系统间路由任务,自治系统之间的路由信息的获取和传播都属于这一类任务。
(2) 例: 路由器1d的转发表设置
★ 假设AS1学习到 (通过AS间路由协议) : 子网x可以通过AS3 (网关1c)到达,但不能通过AS2到达
AS间路由协议向所有内部路由器传播该可达性信息
★ 路由器1d: 利用AS内部路由信息,确定其到达1c的最小费用路径接口I
在转发表中增加入口: (x, I)
(3) 例: 在多AS间选择
★ 假设AS1通过AS间路由协议学习到:子网x通过AS3和AS2均可到达
★ 为了配置转发表,路由器1d必须确定应该将去往子网x的数据报转发给哪个网关?
这个任务也是由AS间路由协议完成 !
★ 使用热土豆路由协议: 思想很简单,直接将分组发送给最近的网关路由器
4.18 RIP协议简介
1. AS内部路由
(1) Internet采用层次路由,路由也分为两层: 自治系统内的路由和自治系统间的路由
(2) InternetAS内部路由协议也称为内部网络协议IGP(interior gateway protocols)
(3) Internet最常见的AS内部路由协议:
★ 路由信息协议: RIP(Routing Information Protocol)
★ 开放最短路径优先: OSPF(Open Shortest Path First)
★ 内部网关路由协议: IGRP(Interior Gateway Routing Protocol)
是Cisco企业私有协议
2. RIP路由信息协议
最早于1982年随BSD-UNIX操作系统发布,是一个很简单的路由协议
(1) 使用距离向量路由算法计算到达某个网络的最短路径
★ 使用跳步数作为衡量距离远近的指标 (最大有效跳步数为15),每条链路1个跳步
★ 每隔30秒,不论发送变化与否,邻居之间交换一次DV,称为通告 (advertisement)
★ 每次通告最多可以包含到达25个目的子网 (IP地址形式) 的最短距离
(2) 举例
重点关注这里的 “next router” 下一跳,记录这个信息可以起到毒性逆转的作用。比如路由器M在计算达到网络p的距离时发生无穷计数的情况 (M与N相邻,M到p距离为1,N经M到p距离为2),那么与M相邻的路由器N到达网络p的下一跳往往就是M本身,这样就能帮助M克服无穷计数。
原本路由器D到网络z的最短距离为7。当A把路由表通告给D后,D就可以更新到网络z的距离。
3. RIP: 链路失效、恢复
如果一个路由器经过180秒没有收到来自某个邻居的通告,就可以推断和这个邻居之间的链路失效了,或者是邻居路由器本身失效了。
(1) 经过该邻居的路由不可用
★ 重新计算路由
(2) 如果因为失去这个邻居导致转发表变化,就要向其他邻居发送新的通告
(3) 其他邻居再依次向外发送通告 (如果转发表改变)
(4) 链路失效信息能否快速传播到全网?
★ 可能发生无穷计数问题
★ 但是规定了最大跳步数为15,即16跳为无穷大距离,且采用了毒性逆转技术,基本上可以很好地抑制无穷计数
4. RIP路由表的处理
(1) RIP路由表是利用一个称作 route-d (daemon) 的应用层进程进行管理
★ 虽然完成网络层功能,但通过应用层的应用进程实现
(2) 通告报文周期性地通过UDP数据报发送
(3) 属于哪一个层次并不是通过协议划分的,而是通过功能划分的
4.19 OSPF协议简介
上一节讲的RIP协议是基于距离向量路由算法的InternetAS内部路由协议。
而这一节的OSPF协议是基于链路状态路由算法的InternetAS内部路由协议。
1. OSPF开放最短路径优先
(1) “开放”: 指是公众可用的,不是某家企业私有的
(2) 采用链路状态路由算法
★ 每个路由器在AS内扩散自己的链路状态分组 (通告)
★ 每个路由器构造完整的AS的网络拓扑图
★ 利用Dijkstra算法计算路由
(3) OSPF通告中路由器的每个入口对应一个邻居
(4) OSPF通告在整个AS范围泛洪
★ OSPF报文直接封装到IP数据报中
2. OSPF优点 (RIP不具备)
(1) 安全(security): 所有OSPF报文都来自于被认证的路由器 (预防恶意入侵: 虚假的链路分组)
(2) 允许使用多条相同费用的路径 (RIP只能选一条)
★ 如果到达某个目的网络有多条相同费用路径,不需要只选一条,而是同时使用多条路径
(3) 对于某条链路,可以针对IP数据报不同的TOS (TOS字段) 设置多个不同的费用度量
★ 一条链路可以在不同情况下有多种费用
★ e.g., 卫星链路可以针对 “尽力” (best effort) ToS (数据分组) 设置 “低” 费用
★ 针对实时ToS (多媒体) 设置 “高” 费用
★ 最终结果是网络更倾向于在卫星链路上多发送数据分组,少发送多媒体分组
(4) 集成单播路由与多播路由:
★ 在计算多播路由路径时,可以采取和计算单播路由路径时相同的网络拓扑数据
★ 即 多播OSPF协议(MOSPF) 与OSPF利用相同的网络拓扑数据
(5) OSPF支持对大规模AS进一步进行分层( hierarchical)
3. 分层的OSPF
(1) 区边界路由器 (Area Border Routers):
★ 既是局部区路由器,又是主干区路由器
★ 可以参与局部区的链路状态分组交换,构造局部区网络拓扑,并计算局部区内路由
★ 还可以参与主干区链路状态分组交换,构造主干区网络拓扑,并计算主干区内路由
★ “汇总” 到达它所在区内的网络的距离,通告给其他区边界路由器
(2) 主干路由器(Backbone Routers):
★ 在主干区内运行OSPF路由算法.
(3) AS边界路由器(AS boundary routers):
★ 相当于网关路由器,连接其他AS
4.20 BGP协议简介
1. Internet AS间路由协议: BGP
(1) 边界网关协议BGP (Border Gateway Protocol): 事实上的标准域间路由协议
★ 将Internet “粘合” 为一个整体的关键
(2) BGP为每个AS提供了一种手段:
★ eBGP: 从邻居AS获取子网可达性信息.
★ iBGP: 向所有AS内部路由器传播子网可达性信息.
★ 基于可达性信息与策略,确定到达其他网络的 “好” 路径.
(3) 容许互联网中的任何一个子网向Internet其余部分通告它的存在: “我在这儿!”
2. BGP基础内容
(1) BGP会话(session): 两个BGP路由器 (“Peers”) 交换BGP报文:
★ 某个路由器向另一个路由器通告去往不同目的网络 (也叫目的前缀 (prefix),因为一个前缀可以代表一个IP网络) 的路径
★ BGP网络也被称为 “路径向量(path vector)” 协议,与距离向量不同的是,距离向量通告的是距离,而路径向量通告的是完整路径
★ 报文交换基于半永久的TCP连接
(2) BGP报文:
★ OPEN: 与peer建立TCP连接,并认证发送方
★ UPDATE: 通告新路径 (或撤销原路径)
★ KEEPALIVE: 在无UPDATE时,保活连接;也用于对OPEN请求的确认
★ NOTIFICATION: 报告先前报文的差错;也被用于关闭连接
(3) 举例
★ 当AS3通告一个可达路径信息给AS1时:
★ AS3承诺可以将数据报转发给该子网
★ AS3在通告中会尽可能聚合网络前缀
3. 分发路径信息的过程
(1) 在3a与1c之间,AS3利用eBGP会话向AS1发送前缀可达性信息
★ 1c则可以利用iBGP向AS1内的所有路由器分发新的前缀可达性信息
★ 1b可以 (也可能不,因为要考虑到策略问题,也许是不符合策略的) 进一步通过1b到2a的eBGP会话,向AS2通告新的可达性信息
(2) 当路由器获得新的前缀可达性时,即在其转发表中增加关于该前缀的入口 (路由项)
4. 路径属性
(1) 通告的前缀信息包括BGP属性
★ 前缀+属性= “路由”
(2) 两个重要属性:
★ AS-PATH (AS路径): 包含前缀通告所经过的AS序列: e.g., AS 67, AS 17
★ NEXT-HOP (下一跳): 开始一个AS-PATH的路由器接口,指向下一跳AS
★ 可能从当前AS到下一跳AS存在多条链路
下一跳这个信息很重要,比如,AS2要向其他网络通告前缀信息,可以通过2c也可以通过2b,那么 “下一跳” 就分别是2c或2b的IP地址,这样的话其他网络在经过AS2去往目的网络时,才能精准选择最好的路径。
至于其他网络到底会选择2c还是2b,可能会通过热土豆路由的方式。
5. BGP路由选择基本原则
(1) 网关路由器收到其他网关路由器的路由通告后,利用其输入策略 (import policy) 决策接受/拒绝该路由
★ 输入策略例如: 从不将流量路由到AS x
★ BGP路由选择也被称为 基于策略 (policy-based) 路由
★ 这一策略可能和技术层面、企业政策甚至国家政策有关
(2) 路由器可能获知到达某目的AS的多条路由,基于以下准则选择:
1. 本地偏好 (preference) 值属性: 策略决策 (policy decision)
2. 最短AS-PATH (经过的AS少,而不是路由器少)
3. 最近NEXT-HOP路由器: 热土豆路由 (hot potato routing)
4. 附加准则
5. BGP路由选择策略举例
(1) A,B,C是提供商网络/AS (provider network/AS)
(2) X,W,Y是客户网络 (customer network/AS)
(3) W,Y是桩网络 (stub network/AS): 只与一个其他AS相连
(4) X是双宿网络 (dual-homed network/AS): 连接两个其他AS
★ 客户网络通常不提供过渡流量传输,例如不能通过X路由B到C的流量
★ 因此,X不会向B通告任何一条到达C的路由
(1) A向B通告一条路径:AW
(2) B向X通告路径:BAW
(3) B是否应该向C通告路径BAW呢?
★ 绝不! B路由CBAW的流量没有任何“收益”,因为W和C均不是B的客户。
★ B期望强制C通过A向W路由流量
★ B期望只路由去往/来自其客户的流量!
6. 为什么采用不同的AS内与AS间路由协议?
(1) 策略 (policy):
★ inter-AS: 期望能够管理控制流量如何被路由,AS希望控制谁能经过其网络进行路由
★ intra-AS: 单一管理,无需策略决策
(2) 规模 (scale):
★ 层次路由节省路由表大小,减少路由更新流量
★ 适应大规模互联网
(3) 性能 (performance):
★ intra-AS: 侧重性能
★ inter-AS: 策略主导