计算机网络第四章:网络层
第四章:网络层
网际层和网络层本质上并无不同,只不过属于不同模型。
分组转发和路由选择
网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能。
转发表通常指数据链路层(如交换机)使用的表,它根据MAC地址决定将数据帧从哪个物理端口转发出去,实现同一网络内的设备间通信。
路由表是网络层(如路由器)使用的表,它根据目标IP地址和路由算法,决定数据包应该发往哪个“下一跳”路由器或接口,从而实现不同网络之间的互联。
主机A若要传输信息到主机B,就需要将数据包发到路由器R1,R1通过转发表来决定转发到何处。转发表由上层路由表决定。在情况简单时可以手动配置路由表。

网络层往上层提供的服务
面向连接的虚电路服务
核心思想是“可靠通信应由网络自身来保证”。
必须首先建立网络层连接一虚电路(Virtual Circuit,VC),以保证通信双方所需的一切网络资源。
随即通信双方沿着已建立的虚电路发送分组。
通信结束后,需要释放之前建立的虚电路。

虚电路是逻辑上的链接,不是物理上的链接,这和电话通信是不同的。
这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确(无差错按序到达、不丢失、不重复)到达接收方。
无连接数据报服务
核心思想是“可靠通信应由用户主机来保证”。
不需要建立网络层连接。
每个分组可走不同的路径。因此,每个分组的首部都必须携带目的主机的完整地址。
通信结束后,没有需要释放的链路。

这种方式可能导致误码丢失重复失序。
该方式将相对简单的尽最大努力(即不可靠)的分组交付功能置于因特网核心,将复杂的用户处理功能至于因特网边缘(用户主机和运输层)
由于网络自身不提供端到端的可靠传输服务,这就使得网络中的路由器可以做得比较简单,大大降低了网络造价。
这种设计思想的运行方式灵活,适应性强。
所以,网络层想上层提供的主要是无连接的数据报服务。
网际协议IP
网际协议(Internet Protocol,,IP)是TCP体系结构网际层中的核心协议,承上启下地链接了运输层和网络接口层的工作。

因此,网络层又名网际层或IP层。
异构网络互联
因特网是由全球数以百万计的网络通过路由器相连,其拓扑,性能,协议不相同,需要在路由器作为统一通信节点。
如果他们都使用IP协议,当IP网上的主机进行通信时就好像在一个单个网络上通信一样,它们看不见互连的各网络的具体异构细节。

IPv4
IPv4地址是给因特网(Internet)上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的32比特的标识符。

IPv4地址由因特网名字和数字分配机构(Internet CoRIPoration for Assigned Names and Numbers,ICANN)进行分配,不接受个人申请,且IPv4地址已经被分配完毕,现在是IPv6时代。
IPv4编址经历了三个阶段:

IPv4地址采用点分十进制表示方法以方便用户使用。

小学生都会做的进制转换就不赘述了。
IPv4分类编址方法
他将32比特的IPv4地址分为两部分
- 网络号
- 标志主机(或路由器)的接口所连接到的网络,同一个网络中,不同主机(或路由器)的接口的IPv4地址的网络号必须相同,表示它们属于同一个网络
- 主机号
- 标志主机(或路由器)的接口,同一个网络中,不同主机(或路由器)的接口的IPv4地址的主机号必须各不相同,以便区分各主机(或路由器)的接口。
关于前几位是网络号,后几位是主机号的问题,分类编制有几类编制方式:

A类、B类和C类地址都是单播地址,只有单播地址可以分配给网络中的主机(或路由器)的各接口。
最小主机号为“全0”的地址是网络地址,不能分配给主机(或路由器)的各接口。
最大主机号为“全1”的地址是广播地址,不能分配给主机(或路由器)的各接口。
一般地,我们将最小地址分配作为网络地址,将最大地址分配作为广播地址。
A类地址

B类地址

C类地址

横向对比一下:

IPv4子网编址方法
分类编址方法不够灵活且容易造成大量地址浪费,划分子网编址方法对其进行改进。

如果可以从IPv4地址的主机号部分借用一些比特作为子网号来区分不同的子网,就可以利用原有网络中剩余的大量IPv4地址,而不用申请新的网络地址了。
我们或计算机又如何知道在分类地址中,主机号有多少比特被借用作为子网号了呢?这就需要子网掩码。
子网掩码
子网掩码可以表明分类IPv4地址的主机号部分被借用了几个比特作为子网号。
与IPv4地址类似,子网掩码也是由32比特构成的。
■用左起多个连续的比特1对应IPv4地址中的网络号和子网号:
☐之后的多个连续的比特0对应IPv4地址中的主机号。

将划分子网的IPv4地址与相应的子网掩码进行逐比特的逻辑与运算,就可得到该IPv4地址所在子网的网络地址。
来看一个例子:

若依靠子网掩码,从主机号借用几个比特给网络号,会导致主机号可分配范围减小而网络号可分配范围加大。

如图,可分配给单网络的主机号从C类地址的254个削减到到126个。
默认子网掩码
默认子网掩码是指在未划分子网的情况下使用的子网掩码。

IPv4无分类编址方法
这是为了缓解IPv4地址紧张的问题。

地址掩码
有32比特构成,和子网掩码很相似。
- 用左起多个连续的比特1对应IPv4地址中的网络前缀:
- 之后的多个连续的比特0对应IPv4地址中的主机号。
为了简便起见,可以不明确给出配套的地址掩码的点分十进制形式,而是在无分类编址的IPV4地址后面加上斜线“/”,在斜线之后写上网络前缀所占的比特数量(也就是地址掩码中左起连续比特1的数量),这种记法称为斜线记法。
如128.14.35.7 / 20,像这样一个就被称为一个CIDR地址块。
只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的以下全部细节:
- 地址块中的最小地址
- 地址块中的最大地址
- 地址块中的地址数量
- 地址块中聚合某类网络(A类、B类、C类)的数量
- 地址掩码

使用CDR的一个好处是,可以根据客户的需要分配适当大小的CDR地址块,因此可以更加有效地分配 IPv4的地址空间。

CIDR的另一个好处是路由聚合,又名构造超网。
R1链接了五个网络,路由聚合就是找这五个地址的共同前缀,并生成一个新的CIDR块来描述或定义这五个网络聚成的单网络。

所以,R1可以只发给这一条172.1.4.9 / 22发给R2.
IPv4地址的应用规划
IPv4地址的应用规划是指将给定的IPv4地址块(或分类网络)划分成若干个更小的地址块(或子网),并将这些地址块(或子网)分配给互联网中的不同网络,进而可以给各网络中的主机和路由器的接口分配 IPv4地址。
子网掩码分为两种:
- 定长的子网掩码
- 所划分出的每一个子网都使用同一个子网掩码。
- 每个子网所分配的IP地址数量相同,容易造成地址资源的浪费。
- 变长的子网掩码
- 所划分出的每一个子网能够使用不同的子网掩码。
- 每个子网分配的IP地址数量可以不同,尽可能减少对地址的浪费。
举个定长子网掩码的例子:

网络1需要P地址数量为9,网络2需要P地址数量为28,网络3需要P地址数量为15,网络4需要P地址数量为13,网络5需要P地址数量为4。一共有5个网络,需要子网数量需要达到5以上,所以借用主机号3个比特位。

答案就是:

你看,本来一共是8位比特,分走3位后,剩下5位,那就是2^5 =32个地址,但是网络5只需要4个网络地址,这就浪费了28个地址无法被使用,在某些例子中,这种浪费更严重。
再来看变长的例子:

因为允许给每个子网都使用不用的子网掩码,所以能够针对每个子网不同的设备数量来选择借用多少主机位。

IPv4地址和Mac地址关系

接下来是数据包在传输过程中,IPV4和Mac地址的变化情况。

在数据包的传送过程中,数据包的源P地址和目的IP地址保持不变;
在数据包的传送过程中,数据包的源MAC地址和目的MAC地址逐链路(或逐网络)改变。
那么,因特网为什么要使用IP地址和MAC地址这两种类型的地址来共同完成寻址工作,仅使用MAC地址进行通信不可以吗?
不行,因为:
- 因特网中的每台路由器的路由表中就必须记录因特网上所有主机和路由器各接口的MAC地址。
- 手工给各路由器配置路由表几乎是不可能完成的任务,即使使用路由协议让路由器通过相互交换路由信息来自动构建路由表,也会因为路由信息需要包含海量的MAC地址信息而严重占用通信资源。
- 包含海量MAC地址的路由信息需要路由器具备极大的存储空间,并且会给分组的查表转发带来非常大的时延。
因特网的网际层使用IP地址进行寻址,就可使因特网中各路由器的路由表中的路由记录的数量大大减少,因为只需记录部分网络的网络地址,而不是记录每个网络中各通信设备的各接口的MAC地址。
查表转发的结果可以指明P数据报的下一跳路由器的IP地址,但无法指明该P地址所对应的 MAC地址。因此,在数据链路层封装该P数据报成为帧时,帧首部中的目的MAC地址字段就无法填写,该问题需要使用网际层中的地址解析协议ARIP来解决。
地址解析协议ARIP
地址解析协议(ARIP)是用于将网络层的IP地址解析为数据链路层的物理地址(MAC地址)的协议。
如果没有ARIP,数据链路层在封装MAC帧时就不知道应该给数据分组加上什么MAC地址。

实际上,每台主机都会维护一个ARIP高速缓存表,内存有MAC地址和IP地址的对应关系,在封装时能够根据IP找到对应的MAC地址。
| IP地址 | MAC地址 | 类型 |
|---|---|---|
| 192.168.0.3 | 00-0C-CF-B8-4A-82 | 动态 |
| 192.168.0.4 | 00-01-C7-D3-B2-B5 | 静态 |
| ……….. | ……… | ….. |
如果没有找到,那主机A就会发送ARIP请求报文,这是一条广播报文,需要封装在目的MAC地址为FF-FF-FF-FF-FF-FF的广播帧中发送。该广播帧会抵达每个主机。其他主机接受到后会将帧中的IP地址与自己对比,如果不对就不理会,如果正确就发回携带自身MAC地址的ARIP响应报文。此时主机A的ARIP表会自更,这样下次就能直接在表中找到对应的MAC地址。

随即将ARIP缓存表更新为:
| IP地址 | MAC地址 | 类型 |
|---|---|---|
| 192.168.0.3 | 00-0C-CF-B8-4A-82 | 动态 |
| 192.168.0.4 | 00-01-C7-D3-B2-B5 | 静态 |
| 192.168.0.2 | 00-E0-F9-A3-43-77 7 | 动态 |
| …… | ….. | …. |
需要额外说明的是:IP-MAC的键值对往往分为静态和动态:
- 动态:通过ARIP自动获取,生命周期默认两分钟
- 静态:手工配置,不同操作系统生命周期不同,例如系统重启后不存在或重启后依旧有效
IP-MAC的对应关系不是永久不变的,比如主板更换了新的网卡,所以是有生命周期的。
注意,ARIP不能跨网络使用,只能在局域网中 逐层寻找目标主机并等待响应。
注意:
- 由于ARIP协议的主要用途是从网际层使用的P地址解析出在数据链路层使用的MAC地址。因此,有的教材将ARIP协议划归在网际层,而有的教材将ARIP协议划归在数据链路层。这两种做法都是可以的。
- 除了本节课介绍的ARIP请求报文和响应报文,ARIP协议还有其他类型的报文,例如用于检查P地址冲突的“无故ARIP”(Gratuitous ARIP)
- 由于ARIP协议很早就制定出来了(1982年11月)
,当时并没有考虑网络安全问题。因此,ARIP协议没
有安全验证机制,存在ARIP欺骗和攻击等问题。
IP数据报的发送和转发
包含两个过程:
- 主机发送IP数据报
- 路由器转发IP数据报
为了集中讲解,我们忽略使用ARIP协议获取MAC地址的过程和以太网交换机自学习和转发帧的过程。
我们都直到,通过交换机而不通过路由器,在同一个网络中通信属于“直接交付”
通过路由器在不同网络中通信属于“间接交付”
那么,主机如何判断目标主机是否与自己属于同一网络呢?
- 主机会调出目的主机的IP地址并根据地址掩码得出网络号,随后与自己的IP地址比对,如果相同就是同一个网络
那么,主机如何判断应该借助哪个路由器来转发呢?
- 实际上,每个主机都默认指认一个路由器,该地址被称为默认网关,主机默认将需要间接交互的数据分组转发到默认网关的位置。
基于IP数据报首部中的目的P地址在路由表中进行查询:
- 若找到匹配的路由条目,则按该路由条目的指示进行转发;
- 否则丢弃该P数据报,并向发送该IP数据报的源主机发送差错报告。
例如:主机A准备给主机D发送数据分组:

路由表中的每一项叫做路由条目,路由条目可以是自学习,也可以是用户或管理员自行配置。
路由器接收到数据报后,将其中的目的地址结合地址掩码解析出网络地址后,根据路由表找到对应的端口号,将其转发出去,抵达主机D。
在路由器的实际研发过程中,需要设计很好的数据结构(甚至是专用硬件)以便提高查找速度。
补充一下路由器对广播数据报的处理:
主机A发出广播帧,交换机将广播帧转发到除了主机A外的每一个端口,而路由器默认不转发广播IP数据报,即路由器隔离广播域,如果因特网中数量巨大的路由器收到广播IP数据报后都进行转发,则会造成巨大的广播风暴,严重浪费因特网资源。
IPv4数据报的首部格式
- IPv4数据报的首部格式及其内容是实现IPv4协议各种功能的基础。
- 在TCP/IP标准中,各种数据格式常常以32比特(即4字节)为单位来描述。

- 固定部分是指每个IPv4数据报都必须要包含的部分。
- 某些IPv4数据报的首部,除了包含20字节的固定部分,还包含一些可选的字段来增加IPV4数据报的功能
下面来介绍各个字段的作用:
版本:长度为4个比特,用来表示IP协议的版本。
通信双方使用的P协议的版本必须一致。目前广泛使用的P协议的版本号为4(即IPV4)首部长度
长度为4个比特,该字段的取值以4字节为单位,用来表示IPV4数据报的首部长度。
最小取值为二进制的0101,即十进制的5,再乘以4字节单位,表示IPv4数据报首部只有20字节固定部分。
最大取值为二进制的1111,即十进制的15,再乘以4字节单位,表示IPv4数据报首部包含20字节固定部分和最大40字节可变部分。可选字段
长度从1字节到40字节不等,用来支持排错、测量以及安全措施等功能。这同时让首部长度可变,增加了路由器处理开销填充
用来确保IPv4数据报的首部长度是4字节的整数倍(因为首部长度是4字节的整数倍),使用全0进行填充。区分服务
长度为8个比特,用来获得更好的服务。
该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。
1998年,因特网工程任务组IETF把这个字段改名为区分服务。利用该字段的不同取值可提供不同等级的服务质量。
只有在使用区分服务时该字段才起作用,一般情况下都不使用该字段。总长度
长度为16个比特,该字段的取值以字节为单位,用来表示IPv4数据报的长度(首部长度+数据载荷长度)最大取值为2进制的16个比特1,即十进制的65535。配合首部长度能够计算出数据载荷长度
在此需要讲一下“IPv4数据报分片的概念:
当IPv4数据报长度超过MTU时,无法封装成帧,就需要将IPV4数据报分为若干个更小的数据报。
- 标识
长度为16个比特,属于同一个IPv4数据报的各分片数据报应该具有相同的标识。
IP软件会维持一个计数器,每产生一个IPv4数据报,计数器值就加1,并将此值赋给标识字段。 - 标志
最低位(More Fragment,MF)
MF=1表示本分片后面还有分片
MF=0表示本分片后面没有分片
中间位(Don’t Fragment,DF)
DF=1表示不允许分片
DF=0表示允许分片
最高位为保留位,必须设置为0 - 片偏移
长度为13个比特,该字段的取值
以8字节为单位,用来指出分片
IPv4数据报的数据载荷偏移其在
原IPv4数据报的位置有多远。

如果分片2经过某个网络时还需要进行分配,那就根据MTU再分片:

生存时间字段(TTL)
长度为8个比特,最大取值为二进制的11111111,即十进制的255。该字段的取值最初以秒为单位。因此,IPv4数
据报的最大生存时间最初为255秒。路由器转发IPV4数据报时,将其首部中该字段的值减去该数据报在路由器上所耗费的时间,若结果不为0就转发,否则就丢弃。生存时间字段后来改为以“跳数”为单位,路由器收到待转发的IPV4数据报时,将其首部中的该字段的值减1,若结果不为0就转发,否则就丢弃。
生存时间是为了防止被错误路由的IPv4数据报无限制地在因特网兜圈。
如果没有TTL,数据报就会在R1和R2的闭合环路中永久兜圈。
协议
长度为8个比特,用来指明IPV4数据报的数据载荷是何种协议数据单元PDU。
协议名称 ICMP IGMP TCP UDP IPv6 OSPF 协议字段值 1 2 6 17 41 89 首部检验和
长度为16个比特,用于检测IPv4数据报在传输过程中其首部是否出现了差错。 IPv4数据报每经过一个路由器,其首部中的某些字段的值(例如生存时间TTL、标志以及片偏移等)都可能发生变化,因此路由器都要重新计算一下首部检验和。
- 检验和的计算方法不仅用于IP协议,还用于运输层的用户数据报协议UDP和传输控制协议TCP,常被称为因特网检验和(Internet Checksum)。这种检验和的检错性能虽然不如CRC,但更易用软件实现。
由于网际层并不向其高层提供可靠传输的服务,并且计算首部检验和是一项耗时的操作,因此在Pv6中,路由器不再计算首部检验和,从而更快转发P数据报。
静态路由配置
静态路由配置是指用户或网络运维人员使用路由器的相关命令给路由器人工配置路由表。
人工配置方式简单、开销小、但不能及时适应网络状态(流量、拓扑等)的变化,一般只在小规模网络中采用。

直连路由条目是路由器自行得出的。
图中的静态路由条目是人工手动配置的。
默认路由
将所有路由都加进路由表是一件荒诞的事情,这会让路由表的大小难以估量,并降低查表转发的速度。所以给其他网络都设立一个共同出口,就是默认路由,换句话说:
默认路由是一种特殊的静态路由,可以理解为网络中的“万能备用出口”或“最后选择的路径”。
默认路由条目中的目的网络0.0.0.0/0,其中
0.0.0.0表示任意网络,而网络前缀
“/01”(相应的地址掩码为0.0.0.0)是最短的网络前缀.
路由器在查找转发表转发P数据报时,遵循
“最长前缀匹配”的原则,因此默认路由条目的匹配优先级最低。
| 目的网络 | 下一跳 | 类型 |
|---|---|---|
| 192.168.1.0/24 | 接口0 | 直连 |
| 10.0.0.0/30 | 接口1 | 直连 |
| …. | …… | …… |
| 0.0.0.0/0 | 10.0.0.2 | 静态 |
这么做极大缩短了查表时间,减少了路由表占用空间。
特定主机路由
出于某种安全问题的考虑,同时为了使网络运维人员更方便地控制网络和测试网络,特别是在对网络的连接或路由表进行排错时,指明到某一台主机的特定主机路由是十分有用的。

特定主机路由条目中的目的网络192.168.2.1/32,其中192.168.2.1是特
定主机的P地址,而网络前缀“/32“(相应地址掩码为255.255.255.255)是最长的网络前缀
路由器在查找转发表转发P数据报时,遵循“最长前缀匹配”的原则,因此特定主机路由条目的匹配优先级最高。
| 目的网络 | 下一跳 | 类型 |
|---|---|---|
| 192.168.1.0/24 | 接口0 | 直连 |
| 10.0.0.0/30 | 接口1 | 直连 |
| 192.168.2.0/24 | 10.0.0.2 | 静态 |
| 192.168.2.1/32 | 10.0.0.2 | 静态 |
在查表转发去往192.168.2.1这台特定主机的P数据报时,这两个路由条目(/24和/32)都可以匹配,遵循“最长前缀匹配”的原则,按照匹配优先级最高的特定主机路由条目进行转发。
进行静态路由配置需要认真考虑和谨慎操作,否则可能出现以下问题:
- 路由条目配置有问题,出现路由环路
- 引入不存在的网络
因特网的路由选择协议
路由选择是网络设备(主要是路由器)根据路由表,为数据包选择最佳传输路径(更稳定更高效)的过程。它决定了数据从源地址到目的地址的流向,是互联网能够互联互通的核心机制。
分为两种:
- 静态路由选择
- 采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。
静态路由选择简单、开销小,但不能及时适应网络状态(流量、拓扑等)的变化,一般只在小规模网络中采用。
- 采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。
- 动态路由选择
- 路由器通过路由选择协议自动获取路由信息。
动态路由选择比较复杂、开销比较大,但能较好地适应网络状态的变化,适用于大规模网络,
- 路由器通过路由选择协议自动获取路由信息。
路由选择协议必须有以下特点:
- 自适应:因特网采用动态路由选择,能较好地适应网络状态的变化。
- 分布式:因特网中的各路由器通过相互间的信息交互,共同完成路由信息的获取和更新。
- 分层次:将整个因特网划分为许多较小的自治系统
(AutonomousSystem, AS)。在自治系统内部和外部采用不同类别的路由选择协议,分别进行路由选择。
如:
系统间使用的是外部网关协议EGP
系统内使用的是内部网关协议IGP
注意:
- 外部网关协议EGP和内部网关协议IGP只是路由选择协议的分类名称,而不是具体的路由选择
- 外部网关协议和内部网关协议名称中使用的是“网关”这个名词,是因为在因特网早期的RFC文档中,没有使用“路由器”而使用的是“网关”这一名词。
路由信息网关RIP协议
路由信息协议(Routing Information Protocol,RIP)是内部网关协议IGP中最先得到广泛使用的协议之一
RIP要求自治系统AS内的每一个路由器,都要维护从它自己到AS内其他每一个网络的距离记录。这是一组距离,称为距离向量(Distance Vector,D-V)
RIP使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离。
- RIP将路由器到直连网络的距离定义为1。
- RIP将路由器到非直连网络的距离定义为所经过的路由器数加1。
- RIP允许一条路径最多只能包含15个路由器,距离等于16时相当于不可达。因此RIP只适用于小型互联网。

但有些厂商的路由器没有严格按照标准文档来实现RIP,但是不影响运行。
- RIP认为好的路由就是“距离短”的路由,也就是所通过路由器数量最少的路由。

这里的好路由是R1->R4->R5
- 当到达同一目的网络有多条RIP距离相等的路由时,可以进行等价负载均衡,也就是将通信量均衡地分布到多条等价的路径上。
- RIP具有第三个特点:
- 仅和相邻路由器交换信息
- 交换路由表的相关信息
- 周期性交换
我们将展示RIP的基本工作原理,如下图:

- 路由器刚开始工作时,只知道自己到直连网络的RIP距离为1。
- 每个路由器仅和相邻路由器周期性地交换并更新路由信息。
- 若干次交换和更新后,每个路由器都知道到达本自治系统内各网络的最短距离和下一跳路由器,称为收敛。
那么RIP的距离向量是如何计算的呢?
路由器C将自己的路由表封装为RIP报文发送,收到的路由表将下一跳改为C,并将RIP距离+1

C告诉D:”我可以到达这些网络,以及到达这些网络的RIP最短距离分别是….
D作为C的相邻路由器,当然也就可以通过C来到达这些网络,只是比C到达这些网络的RIP距离大1.
但是如果网络拓扑结构发生了变化,C到N2的距离变为2,那么抵达更新周期后,D就会接收到C发来的RIP报文,更新最新距离为2+1=3.
更新理由可以是:
- 更新此前未发现的网络,如N3
- 相同下一跳的路由器的RIP距离变化
- 到达目的网络的不同下一跳,新路由具有路径优势,(更新为达到指定网络的最短路径)
- 通过不同下一跳到达目的网络,RIP距离相等,可做等价负载均衡,添加新路径
除了上述RIP路由条目更新规则,在RIP的距离向量算法中还包含以下一些时间参数:
- 路由器每隔大约30秒向其所有相邻路由器发送路由更新报文。
- 若180秒(默认)没有收到某条路由条目的更新报文,则把该路由条目标记为无效(即把P距离设置为16,表示不可达),若再过一段时间(如120秒),还没有收到该路由条目的更新报文,则将该路由条目从路由表中删除。
但是RIP也是存在问题的,那就是坏消息传播的很慢。

假设R1到N1的链路出现故障,R1就会将自身路由表的N1的RIP长度改成16不可达,但是如果在R1发送路由更新报文之前,R2的更新周期到了,那么R2传过来的更新报文里包含了“抵达N1的RIP长度为2”。R1就误认为能够通过R2抵达网络N1,就会将自身的N1的RIP长度设置为3,随后周期到了又会发送给R2.
R2接收后又将N1的RIP长度加一,两者反复,直到几分钟后R1和R2将RIP长度加到16才知道R1已经不可达。这就是为什么坏消息传递慢。如果没有16为上限,那就形成无限路由环路。
“坏消息传播得慢”的问题又被称为路由环路或P距离无穷计数问题。这是距离向量算法的一个固有问题。可以采取以下多种措施减少出现该问题的概率或减小该问题带来的危害:
- 限制最大RIP距离为15(16表示不可达)。
- 当路由表发生变化时就立即发送路由更新报文(即“触发更新”),而不仅是周期性发送。
- 让路由器记录收到某个特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送(即‘水平分割”)。
但是这无法彻底解决问题,因为在距离向量算法中,每个路由器都缺少到目的网络的整个路径的完整信息,他们只知道下一跳,无法判断路由是否出现了环路。
- RIP相关报文使用运输层的用户数据报协议UDP进行封装,使用的UDP端口号为520。
- 从RIP报文封装的角度看,RIP属于TCP体系结构的应用层。
优缺点

开放最短路径优先OSPF
开放最短路径优先(Open Shortest Path First,OSPF)协议是为了克服路由信息协议RIP的缺点在1989年开发出来的。
- “开放”表明OSPF协议不是受某一厂商控制,而是公开发表的。
- “最短路径优先”是因为使用了Dijkstra提出的最短路径算法(Shortest Path First,.SPF)。
- OSPF是基于链路状态的,而不像RIP是基于距离向量的。
- OSPF基于链路状态并采用最短路径算法计算路由,从算法上保证了不会产生路由环路。
- OSPF不限制网络规模,更新效率高,收敛速度快。
链路状态
链路状态(Link State,LS)是指本路由器都和哪些路由器相邻,以及相应链路的“代价(cos)”
“代价”用来表示费用、距离、时延和带宽等,这些都由网络管理人员来决定。

OSPF相邻路由器之间通过交互问候(Hello)分组来建立和维护邻居关系。
- 问候(Helo)分组封装在P数据报中,发往组播地址224.0.0.5。P数据报首部中的协议号字段的取值为89,表明IP数据报的数据载荷为OSPF分组。
| 目的IP地址 224.0.0.5 | … | 协议号 89 | … | OSPF问候分组 |
|---|
注意:OSPF分组直接使用网际层的RIP数据报进行封装,而不像RIP报文需要使用运输层用户数据报协议UDP封装。从数据包按网络体系结构逐层封装的角度看,OSPF属于网际层协议,而RIP属于应用层协议(但其核心功能是路由选择,属于网际层)。
- 问候(Hello)分组的发送周期为10秒。
- 若40秒未收到来自邻居路由器的问候(Hello)分组,则认为邻居路由器不可达。
- 每个路由器都会建立一张邻居表。

链路状态通告LSA
使用OSPF的每个路由器都会产生链路状态通告(Link State Advertisement,LSA),用于在OSPF区域内或区域间传递路由器和网络的链路状态信息。LSA通过泛洪的方式发送后,所有路由器收集到这些LSA,就能拼凑出一张完整的、一致的网络拓扑图(即链路状态数据库LSDB)。
LSA中包含以下两类链路状态信息:
- 直连网络的链路状态信息
- 邻居路由器的链路状态信息

链路状态更新分组LSU
- 链路状态通告LSA被封装在链路状态更新(Link State Update,LSU)分组中,采用可靠的洪泛法(Flooding)进行发送。
- 洪泛法的要点是路由器向自己所有的邻居路由器发送链路状态更新分组,收到该分组的各路由器又将该分组转发给自己所有的邻居路由器(但其上游路由器除外),以此类推。
- 可靠是指收到链路状态更新分组后要发送确认,收到重复的更新分组无需再次转发,但要发送一次确认。

链路状态数据库LSDB
- 使用OSPF的每一个路由器都有一个链路状态数据库(Link State Database,LSDB),用于存储链路状态通告LSA。
- 通过各路由器洪泛发送封装有各自链路状态通告LSU的链路状态更新分组LSU,各路由器的链路状态数据库LSDB最终将达到一致。

LSDB(链路状态数据库)存储的正是整个OSPF区域的完整、详细的网络拓扑结构。所以能够根据LSDB使用最短路径算法推导出最短路径。

OSPF的五种分组类型
| 问候 (Hello) | 用来发现和维护邻居路由器的可达性。 |
|---|---|
| 数据库描述 (Database Description) | 用来向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息。 |
| 链路状态请求 (Link State Request) | 用来向邻居路由器请求发送某些链路状态项目的详细信息。 |
| 链路状态更新 (LinkState Update) | 路由器使用链路状态更新分组将其链路状态信息进行洪泛发送,即用 洪泛法对整个系统更新链路状态。 |
| 链路状态确认 (Link State Acknowledgement) | 对链路状态更新分组的确认分组。 |
OSPF 的基本工作过程如下:

多点接入网络中的OSPF路由器
在多点接入网络中OSPF路由器邻居关系的建立:

为了减少所发送问候分组和链路状态更新分组的数量,OSPF采用以下措施:
选举指定路由器(Designated Router,DR)
和备用的指定路由器(Backup Designated
Router,BDR)
并规定:所有的非DR/BDR只与DR/BDR建立邻居关系,且非DR/BDR之间通过DR/BDR交换信息。

为了使OSPF协议能够用于规模很大的网络,OSPF把一个自治系统AS再划分为若干个更小的范围,称为区域(area)。

划分区域的好处就是把利用洪泛法交换链路状态信息的范围局限于每一个区域,而不是整个自治系统AS,这样就减少了整个网络上的通信量。使得OSPF协议能用于大规模网络。
在OSPF中,路由器也有分类。
边界网关协议BGP
- 边界网关协议(Border Gateway Protocol,BGP)属于外部网关协议EGP这个类别,用于自治系统AS之间的路由选择协议。
- 由于在不同AS内度量路由的“代价”(距离、带宽、费用等)可能不同,因此对于AS之间的路由选择,使用统一的“代价”作为度量来寻找最佳路由是不行的。

AS之间的路由选择需要考虑相关策略,如政治经济安全等。
自治系统之间的路由选择协议应当允许使用多种路由选择策略。这些策略包括政治、经济、安全等,它们都是由网络管理人员对每一个路由器进行设置的。但这些策略并不是自治系统之间的路由选择协议本身。
寻找最佳路由的代价有时候大于收益,BGP只能是力求寻找一条能够到达目的网络且比较好的路由(即不能兜圈子),而并非要寻找一条最佳路由。
在配置BGP时,每个AS的管理员要选择至少一个路由器作为该AS的“BGP发言人”。
一般来说,两个BGP发言人都是通过一个共享网络连接在一起的,而BGP发言人往往就是BGP边界路由器。
使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的邻站(neighbor)或对等站(peer)。
BGP发言人除了运行BGP协议外,还必须运行自己所在AS所使用的内部网关协议IGP,例如RIP可或OSPF。
BGP发言人交换网络可达性的信息,也就是要到达某个网络所要经过的一系列自治系统。
当BGP发言人相互交换了网络可达性的信息后,各BGP发言人就根据所采用的策略,从收到的路由信息中找出到达各自治系统的较好的路由,也就是构造出树形结构且不存在环路的自治系统连通图。


BGP-4中的四种报文
| 打开 OPEN | 用来与相邻的另一个BGP发言人建立关系,使通信初始化。 |
|---|---|
| 保活 KEEPALIVE | 用来周期性地证实邻站的连通性。 |
| 更新 UPDATE | 用来通告某一条路由的信息,以及列出要撤销的多条路由。 |
| 通知 NOTIFICATION | 用来发送检测到的差错。 |
路由器的基本工作原理
路由器是一种具有多个输入端口和输出端口的专用计算机,其任务是转发分组。

交换结构的速率对于路由器的性能是至关重要的。因此,人们对交换结构进行了大量研究,以提高路由器的转发速率。
实现交换结构的三种基本方式是:通过存储器、通过总线以及通过互连网络。这三种交换结构可实现的路由器转发速率依次提高。
网际控制报文ICMP
- 为了更有效地转发P数据报以及提高P数据报交付成功的机会,TCP体系结构的网际层使用了网际控制报文协议(Internet Control Message Protocol,ICMP)[RFC792]。
- 主机或路由器使用ICMP来发送差错报告报文和询问报文。
- 1CMP报文被封装在P数据报中发送。

分为两大类:
- 差错报告报文:用来向主机或路由器报告差错情况
- 询问报文:用来向主机或路由器询问情况。
差错报告报文
负责五种差错报告:
- 终点不可达:
- 当路由器或主机不能交付P数据报时,就向源点发送终点可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种。

源点抑制
- 当路由器或主机由于拥塞而丢弃P数据报时,就向发送该P数据报的源点发送源点抑制报文,使源点知道应当把IP数据报的发送速率放慢

时间超过(超时)
- 当路由器收到一个目的IP地址不是自己的IP数据报时,会将其首部中生存时间TTL字段的值减1。若结果不为0,则路由器将该数据报转发出去;若结果为0,路由器不但要丢弃该数据报,还要向发送该P数据报的源点发送时间超过(超时)报文。
- 另外,当终点在预先规定的时间内未能收到一个数据报的全部数据报分片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过(超时)报文。

- 参数问题
- 当路由器或目的主机收到IP数据报后发现其首部中有不正确的字段值时,就丢弃该数据报,并向发送该数据报的源点发送参数问题报文。

- 改变路由
- 路由器把改变路由报文发送给主机,让主机知道下次应将P数据报发送给另外的路由器,这样可以通过更好的路由到达目的主机。

以下情况不发送ICMP差错报告报文:
- 对ICMP差错报告报文不再发送ICMP差错报告报文。
- 对第一个分片的P数据报片的所有后续数据报片都不发送CMP差错报告报文。
- 对具有多播地址的P数据报都不发送CMP差错报告报文。
- 对具有特殊地址(例如127.0.0.0或0.0.0.0)的IP数据报不发送CMP差错报告报文。
询问报文
两种:
- 会送请求和回答
- 由主机或路由器向一个特定的目的主机或路由器发出。
收到此报文的主机或路由器必须给发送该报文的源主机或路由器发送
ICMP回送回答报文。
这种询问报文用来测试目的站是否可达以及了解其有关状态。
- 由主机或路由器向一个特定的目的主机或路由器发出。
- 时间戳请求和回答
- 用来请求某个主机或路由器回答当前的日期和时间。
在CMP时间戳回答报文中有一个32比特的字段,其中写入的整数代表
从1900年1月1日起到当前时刻一共有多少秒。
这种询问报文用来进行时钟同步和测量时间。
- 用来请求某个主机或路由器回答当前的日期和时间。
ICMP应用
- 分组网间探测
分组网间探测PING用来测试主机或路由器之间的连通性。
PING是TCP/IP体系结构的应用层直接使用网际层ICMP的一个例子,它并不使用运输层的TCP或UDP。
PING应用所使用的ICMP报文类型为回送请求和回答。

然而,某些主机回或服务器为了防止恶意攻击,并不会理睬外界发来的ICMP回送请求报文。
- 跟踪路由
跟踪路由应用traceroute,用于探测IP数据报从源主机到达目的主机要经过哪些路由器。
在不同操作系统中,traceroute应用的命令和实现机制有所不同:
- 在UNIX版本中,具体命令为“traceroute’”,其在运输层使用UDP协议,在网络层使用ICMP报文类型只
有差错报告报文。 - 在Windows版本中,具体命令为”tracert”,其应用层直接使用网际层的ICMP协议,所使用的ICMP报
文类型有回送请求和回答报文以及差错报告报文。
实现过程如下:
发送探测包: tracert首先向目标主机(如 blog.willmo.top)发送一个 ICMP 回显请求(Echo Request) 数据包,并将该数据包的 TTL(生存时间) 值设置为 1。
触发ICMP超时: 第一个路由器(跃点1)收到数据包后,会将 TTL 减 1。TTL 变为 0,于是该路由器丢弃数据包,并向您的电脑发送一个 ICMP 超时(Time Exceeded) 消息。tracert由此获得了第一个路由器的地址和往返时间。
递增TTL,重复过程: 接着,tracert发送一个 TTL=2 的数据包。它经过第一个路由器(TTL减为1),到达第二个路由器(TTL再减1变为0)。第二个路由器同样丢弃包并返回 ICMP 超时消息。如此循环,每次 TTL 加 1。
到达目标: 当 TTL 足够大,数据包最终到达目标主机。目标主机则会返回一个 ICMP 回显应答(Echo Reply) 消息(对于 Windows tracert的 ICMP 探测)。收到此应答后,追踪完成。

虚拟专用网VPN
我知道你看到这三个字母会很兴奋,但是请冷静。
虚拟专用网(Virtual Private Network,VPN):利用公用的因特网作为本机构各专用网之间的通信载体,这样形成的网络又称为虚拟专用网。

位于两个不同地方的主机,将其用因特网链接起来,但是出于安全不能将其暴露在公网上,所以,给专用网内各主机配置的P地址应使各主机在专用网内可以相互通信,而不能直接与公用的因特网通信。
给专用网内各主机配置的P地址应该是该专用网所在机构可以自行分配的P地址,这类P地址仅在机构内
部有效,称为专用地址(Private Address),不需要向因特网的管理机构申请。
[RFC1918]规定了以下三个CDR地址块中的地址作为专用地址:
10.0.0.010.255.255.255172.31.255.255
(CDR地址块10/8)
172.16.0.0
(ClDR地址块172.16/12)
192.168.0.0~192.168.255.255
(CDR地址块192.168/16)
很显然,全世界可能有很多不同机构的专用网具有相同的专用P地址,但这并不会引起麻烦,因为这些专用地址仅在机构内部使用。
因特网中的所有路由器,对目的地址是专用地址的P数据报一律不进行转发,这需要由因特网服务提供者1SP对其拥有的因特网路由器进行设置来实现。
两个网络仍需要两个公网IP来进行公网通信,此时配备公网IP的路由器需要进行VPN设置。

主机H1封装 IP数据报,内含H1和H2的专用 地址,随后交于路由器R1,R1将数据报加密,随后添加目的网络路由器的IP地址。
R2接收后解密,再将IP数据报发给H2。
虽然两个专用网内的主机间发送的数据报是通过公用的因特网传送的,但从效果上就好像是本机构的专用网上传送一样,这也是虚拟专用网中“虚拟”的含义。

P数据报在因特网中可能要经过多个网络和路由器,但从逻辑上看,路由器R1和R2之间好像是条直通的点对点链路,因此也被称为P隧道技术。
本例所示的是同一机构内不同部门的内部网络所构成的VPN,又称为内联网VPN。
有时,一个机构的虚拟专用网VP需要某些外部机构(通常是合作伙伴)参加进来,这样的VPN就称为外联网VPN。
在外地工作的员工需要访问公司内部的专用网时,只要在任何地点接入因特网,运行驻留在员工PC中的 VPN软件,在员工的PC和公司的主机之间建立VPN隧道,就可以访问专用网中的资源,这种虚拟专用网又称为远程接入VPN。
网络地址转换
网络地址转换(Network Address Translation,NAT)技术于1994年被提出,用来缓解IPv4地址空间即将耗尽
的问题。
- NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。
- 这种方法需要在专用网络连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器称为NAT路由器,它至少要有一个有效的公网IP。这样,所有使用内部专用地址的主机在和外部因特网通信时,都要在NAT路由器上将其内部专用地址转换成Pc。
最基本的NAT方法


这样的方法的缺点是:
基础 NAT(不带端口号转换的那种)的缺点是:外网 IP 地址利用率极低。如果有 100 个内网用户想同时上网,你就必须拥有 100 个公网 IP。
这根本没有解决 IPv4 枯竭的问题,所以现在几乎见不到纯 NAT,全是 NAPT
由于目前绝大多数基于TCP协议栈的网络应用,都使用运输层的传输控制协议TCP或用户数据报协议UDP,,为了更加有效地利用NAT路由器中的全球P地址,现在常将NAT转换和运输层端口号结合使用。
- 这样就可以使内部专用网中使用专用地址的大量主机,共用NAT路由器上的1个全球P地址,因而可以同时与因特网中的不同主机进行通信。
将NAT和运输层端口号结合使用,称为网络地址与端口号转换(Network Address and Port Translation, NAPT)
- 现在很多家用路由器将家中各种智能设备(手机、平板、笔记本电脑、台式电脑、物联网设备等)接入因特网,这种路由器实际上就是一个NAPT路由器,但往往并不运行路由选择协议。
NAPT协议路由器基本工作原理

与主机A选择的源端口号相同,这纯属巧合(端口号仅在本主机中才有意义)。特意这样举例,就是为了能更好地说明 NAPT路由器还会对源端口号重新动态分配。
尽管NAT(和NAPT)的出现在很大程度上缓解了IPV4地址资源紧张的局面,但NAT(和NAPT)对网络应用并不完全透明,会对某些网络应用产生影响。
NAT(和NAPT)的一个重要特点就是通信必须由专用网内部发起,因此拥有内部专用地址的主机不能直接充当因特网中的服务器。
对于目前P2P这类需要外网主机主动与内网主机进行通信的网络应用,在通过NAT时会遇到问题,需要网络应用自身使用一些特殊的NAT穿透技术来解决。
IP多播技术
多播(Multicast,也称为组播)是一种实现“一对多”通信的技术,与传统单播“一对一”通信相l比,多播可以极大地节省网络资源。
在因特网上进行的多播,称为IP多播。

使用多播技术,视频服务器只需要发送一个视频文件即可,该视频文件会在路由器被复制为多份以保证送达每个主机。
IP多播地址和多播组
在IPv4中,D类地址被作为多播地址。
多播地址只能用作目的地址,而不能用作源地址。
用每一个D类地址来标识一个多播组,使用同一个P多播地址接收P多播数据报的所有主机就构成了一个多播组。
- 每个多播组的成员是可以随时变动的,一台主机可以随时加入或离开多播组。
- 多播组成员的数量和所在的地理位置也不受限制,一台主机可以属于几个多播组。
非多播组成员也可以向多播组发送P多播数据报。
与IP数据报相同,IP多播数据报也是“尽最大努力交付”,不保证一定能够交付给多播组内的所有成员。

IPV4多播地址又可分为预留的多播地址(永久多播地址)、全球范围可用的多播地址以及本地管理的多播地址[RFC3330]。

IP多播可以分为以下两种:
- 只在本局域网上进行的硬件多播。
- 在因特网上进行的多播。
目前大部分主机都是通过局域网接入因特网的。因此,在因特网上进行多播的最后阶段,还是要把P多播数据报在局域网上用硬件多播交付给多播组的所有成员。
在局域网中进行硬件多播
由于MAC地址(也称为硬件地址)有多播MAC地址这种类型,因此只要把IPv4多播地址映射成多播MAC地址,即可将IP多播数据报封装在局域网的MAC帧中,而MAC帧首部中的目的MAC地址字段的值,就设置为由IPv4多播地址映射成的多播MAC地址。这样,可以很方便地利用硬件多播来实现局域网内的IP多播。

当给某个多播组的成员主机配置其所属多播组的P多播地址时,系统就会根据映射规则从该IP多播地址生成相应的局域网多播MAC地址。
所以,因特网号码指派管理局IANA,将自己从IEEE注册管理机构申请到的以太网MAC地址块中从01-00-5E-00-00- 00到01-00-5E-7F-FF-FF的多播MAC地址,用于映射lIPv4多播地址。
这些多播MAC地址的左起前25个比特都是相同的,剩余23个比特可以任意变化,因此共有2^23个。

那么地址映射是如何实现的呢?
来看看两个多播地址的结构:

可以看到有5个比特处于空闲位,这会导致映射关系不唯一,比如:

可见,如果多个IP地址仅在那五个不可映射的比特中出现不同,那么这些IP地址会映射出同一个多播MAC地址。
因此收到IP多播数据报的主机还要在网际层利用软件进行过滤,把不是主机要接收的P多播数据报丢弃。

如图,主机接收到多播MAC帧后,将目的MAC地址与自身MAC地址比对,不匹配就不接收。发现MAC地址在前两个主机匹配之后接收转交到网际层处理。随后网际层将MAC多播帧中的IP地址与自身作比较,匹配的接收,不匹配的丢弃。
在因特网上进行IP多播需要的两种协议
要在因特网上进行P多播,就必须要考虑P多播数据报经过多个多播路由器进行转发的问题。
- 多播路由器必须根据IP多播数据报首部中的IP多播地址,将其转发到有该多播组成员的局域网。
如图,如果路由器收到一多播数据报,如何得知自己的局域网中有没有目的多播组的成员?
这需要用到IGMP协议。
网际组管理协议(Internet Group Management Protocol,IGMP)是TCP/IP体系结构网际层中的协议,其作用是让连接在本地局域网上的多播路由器知道本局域网上是否有主机(实际上是主机中的某个进程)加入或退出了某个多播组。
IGMP仅在本网络有效,使用IGMP并不能知道多播组所包含的成员数量,也不能知道多播组的成员都分布在哪些网络中。
但是仅使用IGMP并不能在因特网上进行P多播。连接在局域网上的多播路由器还必须和因特网上的其他多播路由器协同工作,以便把P多播数据报用最小的代价传送给所有的多播组成员,这就需要使用多播路由选择协议。
多播路由选择协议的主要任务是:在多播路由器之间为每个多播组建立一个多播转发树。
- 多播转发树连接多播源和所有拥有该多播组成员的路由器。
- P多播数据报只要沿着多播转发树进行洪泛,就能被传送到所有拥有该多播组成员的多播路由器。
- 之后,在多播路由器所直连的局域网内,多播路由器通过硬件多播,将P多播数据报发送给该多播组的所有成员。
那么总结一下,将每个网络成为节点,IGMP负责提供节点内出于多播组的主机的信息,多播路由选择协议负责连接节点构建多播转发树。随后IP数据报在转发树中进行转发即可实现多播。

针对不同的多播组需要维护不同的多播转发树,而目必须动态地适应多播组成员的变化,但此时网络拓扑并不一定发生变化,因此多播路由选择协议要比单播路由选择协议(例如RIP、OSPF等)复杂得多。
- 即使某个主机不是任何多播组的成员,它也可以向任何多播组发送多播数据报。
- 为了覆盖多播组的所有成员,多播转发树可能要经过一些没有多播组成员的路由器(例如上图中的R2)
网际管理层IGMP
网际组管理协议IGMP目前的最新版本是2002年10月公布的IGMPv3[RFC3376]。
有三种报文类型:
- 成员报告报文
- 成员查询报文
- 离开组报文
IGMP报文被封装在IP数据报中传送

加入多播组

主机A主机B希望加入多播组226.0.9.26。
主机B发送IGMP成员报告报文,随后局域网内的所有主机都会受到该多播帧,但是D不属于任何多播组,检查MAC地址不符,所以会将其丢弃。C发现自己的MAC地址相符但是经过网际层判断后IP不符,也会将其丢弃。主机A发现其MAC的地址相符接收后,检查IP地址发现与自己想加入的多播地址相同,于是接收该数据报,交付IGMP协议解析,得知该数据报来自于同一多播组的主机。
此时A会取消发送IGMP成员数据报。
为什么要取消?因为路由器只在乎自己的网络中有哪些多播组存在而不关心成员的IP地址,路由器只需要在接收到多播数据报并发现自己的网络中有该多播组的主机是将多播数据报根据“多播地址”和“物理端口”的键值对来转发。
随后,路由器R1接收并解析IGMP报告 报文,将新的多播地址添加到自己的多播组列表中,证明“我管辖的网络中有主机属于这些多播组”。
查询多播组

每隔一段时间,路由器R1就会发送IGMP成员查询报文来查询多播组情况。发送的报文中带有一个特殊的多播地址224.0.0.1,这会让 所有参与多播的主机都接收并处理该报文。随后每个接收并处理该报文的主机将在随机延迟后向路由器返回IGMP成员报告报文。
为了避免重复响应,每个多播组只需要一个主机响应即可。
主机B延时抵达,将IGMP成员报告报文广播,主机D和主机C分别在MAC层和网际层丢弃,而主机A则接收并 解析,取消发送自身的IGMP报告报文。随后R1接收到报告报文,得知多播组226.0.9.26在自己的网络中仍有成员,就更新其计时。

随后主机C响应,流程与B类似。
但是如果主机C此时已经不是多播组的成员了,那么主机C就会丢弃来自于R1的MAC帧。路由器R1长期没有接收到来自226.128.9.26的响应报文就会认为“我管理的网络中没有多播组226.128.9.26的成员”,就将其从多播组列表中删除。
补充一点:
- 同一网络中的多播路由器可能不止一个,但没有必要每个多播路由器都周期性地发送GMP成员查询报文。
- 只要在这些多播路由器中选择一个作为查询路由器,由查询路由器发送GMP成员查询报文,而其他的多播路由
器仅被动接收响应并更新自己的多播组列表即可。 - 选择查询路由器的方法:
- 每个多播路由器若监听到源P地址比自己的P地址小的GMP成员查询报文则退出选举。
- 最后,网络中只有P地址最小的多播路由器成为查询路由器。
退出多播组
IGMPv2在GMPv1的基础上增加了一个可选项:当主机要退出某个多播组时,可主动发送一个离开组报文而不必等待多播路由器的查询。这样可使多播路由器能够更快地发现某个组有成员离开。

如图,主机C准备离开了多播组,向局域网中广播IGMP离开报文,其他主机都会将其丢弃。但是R1接收后会立即发送查询报文,查看是否有其他组成员,如果有响应就不删除,如果没有就将其删除。
多播路由选择协议
多播路由选择协议的主要任务是:在多播路由器之间为每个多播组建立一个多播转发树。而多播转发树链接多播源和拥有该多播组成员的路由器。
有两种办法构造多播转发树:
- 基于源树多播路由选择
- 组共享树多播路由选择
基于源树多播路由选择
基于源树的多播路由选择的最典型算法是反向路径多播(Reverse Path Multicasting,RIP)算法。
RIPM算法包含以下两个步骤:
- 利用反向路径广播(Reverse Path Broadcasting,RIPB)算法建立一个广播转发树。
- 利用剪枝(Pruning)算法,剪除广播转发树中的下游非成员路由器,获得一个多播转发树。
要建立广播转发树,可以使用洪泛法。

但是如果遇到环路,就会出现堵塞。
但是使用RIPB算法就不需要考虑环路。
RIPB算法的要点是:每一台路由器在收到一个广播分组时,先检查该广播分组是否是从源点经最短路径传送来的。
- 若是,本路由器就从自己除刚才接收该广播分组的接口的所有其他接口转发该广播分组。
- 否则,丢弃该广播分组。
- 如果本路由器有好几个邻居路由器都处在到源点的最短路径上,也就是存在好几条同样长度的最短路径,那么只能选取一条最短路径。选取的规则是这几条最短路径中的邻居路由器的IP地址最小的那条最短路径。

但是这只是实现了广播而非多播,这就需要剪枝算法。
剪枝算法是为了减掉那些“内部没有多播组成员”的路由器。
但是如果减除了这种路由器通过IGMP发现了新的多播组成员,就需要嫁接算法重新接到树中。
组共享树多播路由选择
组共享树多播路由选择采用基于核心的分布式生成树算法来建立共享树。
- 该方法在每个多播组中指定一个核心(co)路由器,以该路由器为根,建立一棵连接多播组的所有成员路由器的生成树,作为多播转发树。
每个多播组中除了核心路由器,其他所有成员路由器都会向自己多播组中的核心路由器单播加入报文。
- 加入报文通过单播朝着核心路由器转发,直到它到达已经属于该多播生成树的某个节点或者直接到达该核心路由器。
- 加入报文所经过的路径,就确定了一条从单播该报文的边缘节点到核心路由器之间的分支,而这个新分支就被嫁接到现有的多播转发树上。

如图,定义R5为核心路由器,那么具有多播组成员的路由器就会试图和R5组成生成树。
若源主机需要发送数据,将该多播分组封装到目的地址为核心路由器R5的单播分组中,将该单播分组发送给R5。R5将被封装在单播分组中的多播分组解封出来,在多播转发树上洪泛转发。
在因特网上的多播路由选择协议
目前还没有在整个因特网范围使用的多播路由选择协议。下面是一些建议使用的多播路由选择协议:
- 距离向量多播路由选择协议(Distance Vector Multicast Routing Protocol,.DVMRIP)[RFC1075]。
- 开放最短路径优先的多播扩展(Multicast Extensions to OSPF,MOSPF)RFC1585]。
- 协议无关多播-稀疏方式(Protocol Independent Multicast–Sparse Mode,PIM-SW)[RFC2362]。
- 协议无关多播-密集方式(Protocol Independent Multicast-.Dense Mode,PIM-DM)[RFC3973]。
- 基于核心的转发树(Core Based Tree,CBT)[RFC2189,RFC2201].
尽管因特网工程任务组IETF努力推动着因特网上的全球多播主干网(Multicast Backbone On the Internet, MBONE)的建设,但至今在因特网上的P多播还没有得到大规模的应用。
主要原因是:
- 改变一个已成功运行且广泛部署的网络层协议是一件极其困难的事情。
- 目前IP多播主要应用在一些局部的园区网络、专用网络或者虚拟专用网中。
另外,P2P技术的广泛应用推动了应用层多播技术的发展,许多视频流公司和内容分发公司通过构建自己的应用层多播覆盖网络来分发它们的内容。但上述多播路由选择协议的算法思想在应用层多播中依然适用。
移动IP技术
来看三个应用场景:

为了解决应用场景3,因特网工程任务组开发了移动IP技术,使得移动主机在各网络中漫游时,保持IP不变。
我们需要了解以下概念:
- 每个移动主机都有一个默认连接的网络或初始申请接入的网络,称为归属网络(Home Network)
- 移动主机在归属网络中的P地址在其整个移动通信过程中是始终不变的,因此称为永久地址(Permanent Address)或归属地址(Home Address)
- 在归属网络中,代表移动主机执行移动管理功能的实体称为归属代理(Home
Agent)。归属代理通常就是连接在归属网络上的路由器,然而它作为代理的特定功能则是在网络层完成的。 - 移动主机当前漫游所在的网络称为外地网络(Foreign Network)或被访网络(Visited Network)
- 在外地网络中,帮助移动主机执行移动管理功能的实体称为外地代理(Foreign Agent)
- 外地代理通常就是连接在外地网络上的路由器。外地代理会为移动主机提供一个临时使用的属于外地网络的转交地址(Care-of Address)
搁置,移动IP技术未看完。
IPv6
诞生背景就是IPv4不够用,而NAT等技术只是延长寿命而不能从根本上解决问题。
解决IPV4地址耗尽的根本措施就是采用具有
更大地址空间(IP地址的长度为128比特)的新版本P,即IPv6。
IPv6 是已经成熟并大规模部署的国际标准
IPv6有很多好处:

IPv6的数据报的基本首部

所有的扩展首部并不属于Pv6数据报的首部,它们与其后面的数据部分合起来构成有效载荷(payload,也称为净负荷)。
Pv6将IPv4数据报首部中不必要的功能取消了,这使得P6数据报基本首部中的字段数量减少到只有8个。
- 但由于Pv6地址的长度扩展到了128比特,因此使得Pv6数据报基本首部的长度反而增大到了40字节,
- 比IPv4数据报首部固定部分的长度(20字节)增大了20字节。
ipv6后面再倒过来看,累了。
软件定义网络
软件定义网络(Software Defined Network,SDN)的概念最早由斯坦福大学的Nick McKeown教授于2009年提出。
SDN是当前网络领域最热门和最具发展前途的技术之一,成为近年来的研究热点。
请回忆普通路由器的功能:
- 为主机间的通信提供转发服务
- 路由选择
路由器的信息种类:
- 主机之间的分组
- 路由信息
此前,路由器被分为控制层面和数据层面:

在SDN体系结构中,路由器中的路由软件都不存在了。因此,路由器之间不再交换路由信息。
- 在控制层面中,有一个在逻辑上集中的远程控制器。
- 逻辑上集中的远程控制器在物理上可由不同地点的多个服务器组成。
- 远程控制器掌握各主机和整个网络的状态。
- 远程控制器能够为每一个分组计算出最佳的路由。
- 远程控制器为每一个路由器生成其正确的转发表。

那么,路由器就能专注于查表转发这一个业务。
SD这种新型网络体系结构的核心思想:把网络的控制层面和数据层面分离,而让控制层面利用软件来控制数据层面中的许多设备。
- OpenFlow协议是一个得到高度认可的标准,在讨论SDN时往往与OpenFlow-一起讨论。
- OpenFlow协议可被看成是SDN体系结构中控制层面与数据层面之间的通信接口。
- OpenFlow协议使得控制层面的控制器可以对数据层面中的物理设备进行直接访问和控制。
数据层面
传统意义上的数据层面的任务:根据转发表转发分组。
- 进行“匹配”:查找转发表中的网络前缀,进行最长前缀匹配。
- 执行“动作”:把分组从匹配结果指明的接口转发出去。
SDN中的广义转发分为以下两个步骤:
- 进行“匹配”:能够对网络体系结构中各层(数据链路层、网络层、运输层)首部中的字段进行匹配。
- 执行“动作”:不仅转发分组,还可以负载均衡、重写IP首部(类似NAT路由器中的地址转换)人为地阻挡或丢弃一些分组(类似防火墙一样)
在SDN的广义转发中,完成“匹配+动作”的设备并不局限在网络层工作,因此不再称为路由器,而称为“OpenFlow交换机”或”分组交换机”,或更简单地称为“交换机”
相应的,在SDN中取代传统路由器中转发表的是“流表(Flow Table)“。
- 一个流就是穿过网络的一种分组序列,而在此序列中的每个分组都共享分组首部某些字段的值。例如,某个流可以是具有相同源P地址和目的P地址的一
连串分组。 - OpenFlow交换机中的流表是由SDN远程控制器来管理的。SDN远程控制器通过一个安全信道,使用OpenFlow协议来管理OpenFlow交换机中的流表。