计算机网络第4章:网络层
1 网络层提供的两种服务
在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接”)曾引起了长期的争论。
争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?
1.1 观点1:面向连接,即让网络负责可靠交付
建立虚电路(Virtual Circuit),以保证双方通信所需的一切网络资源。设计并使用可靠传输的网络协议,使源端所发送的分组实现通过虚电路无差错地按序地到达目的端。
1.1.1 虚电路服务
当在H1(源端)和H2(目的端)建立了虚电路后,H1 发送给 H2 的所有分组都沿着同一条虚电路传送,分组传输完毕后可以拆除该虚电路,也可长期保留。
虚电路表示这只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发(由中间路由器完成)方式传送,而并不是真正建立了一条物理连接。
请注意,电路交换是先建立了一条真正的连接。因此分组交换的虚连接和电路交换的连接只是类似,并不完全一样。
1.2 观点2:不面向连接,即不让网络负责可靠交付
网络层向上(如传输层或调用IP协议的协议)只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。
网络在发送分组时不需要事先建立连接。每一个分组(即 IP 数据报)均独立发送,与其前后的分组无关。
网络层不提供服务质量的承诺。即所传送的分组可能会出现出错、丢失、重复和失序(不按序到达终点)等问题,同时也不保证分组传送的时限。
1.2.1 数据报服务
如下图所示,H1 发送给 H2 的分组可能沿着不同路径传送。
由于传输网络不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)。
如果主机(即端系统)中的进程之间的通信需要是可靠的,那么就由网络的主机中的运输层负责(包括差错处理、流量控制等)。
采用这种设计思路的好处是:网络的造价大大降低,运行方式灵活,能够适应多种应用。因特网能够发展到今日的规模,充分证明了当初采用这种设计思路的正确性。
1.3 虚电路服务与数据报服务对比
2 网际协议IP
网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。与 IP 协议配套使用的还有三个协议:
地址解析协议 ARP(Address Resolution Protocol)
网际控制报文协议 ICMP(Internet Control Message Protocol)
网际组管理协议 IGMP(Internet Group Management Protocol)
2.1 虚拟互连网络
互连在一起的网络要进行通信,会遇到许多问题需要解决,如:
- 不同的寻址方案
- 不同的最大分组长度
- 不同的网络接入机制
- 不同的超时控制
- 不同的差错恢复方法
- 不同的状态报告方法
- 不同的路由选择技术
- 不同的用户接入控制
- 不同的服务(面向连接服务和无连接服务)
- 不同的管理与控制方式
没有单一的网络能够适应所有用户的需要。此外,网络互相连接起来要使用一些中间设备。中间设备又称为中间系统或中继(relay)系统。
- 物理层中继系统:转发器(repeater)。
- 数据链路层中继系统:网桥或桥接器(bridge)以及交换机。
- 网络层中继系统:路由器(router)。
- 网桥和路由器的混合物:桥路器(brouter)。
- 网络层以上的中继系统:网关(gateway)。
当中继系统是转发器或网桥时,一般并不称之为网络互连,因为这仅仅是把一个网络扩大了,而这仍然是一个网络。
网关由于比较复杂,目前使用得较少。互联网都是指用路由器进行互连的网络,由于历史的原因,许多有关 TCP/IP 的文献将网络层使用的路由器称为网关。
所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用 IP 协议就可以使这些性能各异的网络从用户看起来好像是一个统一的网络。
使用 IP 协议的虚拟互连网络可简称为 IP 网。
使用虚拟互连网络的好处是:当互联网上的主机进行通信时,就好像在一个网络上通信一样,而看不见互连的各具体的网络异构细节。
在IP网中,IP数据包的传输过程如下图所示:
互联网可以由多种异构网络互连组成,如果我们只从网络层考虑问题,那么 IP 数据报就可以想象是在网络层中传送。
分组在传送过程中的每一次转发都成为一“跳(hop)”,每一跳两端的两个结点都必定直接连接在同一个网络上。
2.2 IP地址
2.2.1 IP 地址及其表示方法
我们把整个因特网看成为一个单一的、抽象的网络。IP 地址就是给每个连接在因特网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符。
IP 地址现在由因特网名字与号码指派公司ICANN(Internet Corporation for Assigned Names and Numbers)进行分配。
IP 地址的编址方法(有三类):
- 分类 IP 地址。这是最基本编址方法,1981年通过相应的标准协议。
- 子网的划分。这是对最基本编址方法的改进,其标准[RFC 950]在 1985 年通过。
- 无分类 IP 地址。这是比较新的编址方法。1993 年提出后很快就得到推广应用。
2.2.2 分类 IP 地址
每一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号 host-id,它标志该主机(或路由器)。
两级的 IP 地址可以记为:
IPv4地址表示方法:
按网络规模划分为A、B、C三类:
- A 类地址的网络号字段 net-id 为 1 字节,host-id 为 3 字节
- B 类地址的网络号字段 net-id 为 2 字节,host-id 为 2 字节
- C 类地址的网络号字段 net-id 为 3 字节,host-id 为 1 字节
- D 类地址是多播地址
- E 类地址保留为今后使用
在相应的规则下,IP 地址的使用范围:
2.2.3 子网的划分
划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。
从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位。
凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 net-id,先找到连接在本单位网络上的路由器。
然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网。
最后就将 IP 数据报直接交付目的主机。
2.2.3.1 一个未划分子网的 B 类网络145.13.0.0
2.2.3.2 划分为三个子网后对外仍是一个网络
划分子网后变成了三级结构:
当没有划分子网时,IP 地址是两级结构。
划分子网后 IP 地址就变成了三级结构。
划分子网只是把 IP 地址的主机号 host-id 这部分进行再划分,而不改变 IP 地址原来的网络号 net-id。
2.2.3.3 子网掩码
从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。
使用子网掩码(subnet mask)可以找出 IP 地址中的子网部分。
(IP 地址) AND (子网掩码) = 网络地址
默认子网掩码
子网掩码是一个网络或一个子网的重要属性。
路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。
路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。
若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码。
【例】 IP 地址是 141.14.72.24,子网掩码是 255.255.192.0
问:该IP地址的网络地址是多少?
在上例中,若子网掩码改为255.255.224.0。试求网络地址,讨论所得结果。
结论:不同的子网掩码得出相同的网络地址,但不同的掩码的效果是不同的。
2.2.4 无分类编址 CIDR
1987 年,RFC 1009 就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码。使用变长子网掩码 VLSM (Variable Length Subnet Mask)可进一步提高 IP 地址资源的利用率。
在 VLSM 的基础上又进一步研究出无分类编址方法,它的正式名字是无分类域间路由选择 CIDR (Classless Inter-Domain Routing)。
2.2.4.1 CIDR 最主要的特点
CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。
CIDR使用各种长度的“网络前缀”(network-prefix)来代替分类地址中的网络号和子网号。
IP 地址从三级编址(使用子网掩码)又回到了两级编址。
无分类的两级编址的记法是:
- CIDR 还使用“斜线记法”(slash notation),它又称为CIDR记法,即在 IP 地址后面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。
- CIDR 把网络前缀都相同的连续的 IP 地址组成“CIDR 地址块”。
2.2.4.2 CIDR 地址块
2.2.4.3 路由聚合(route aggregation)
一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由。
路由聚合也称为构成超网(supernetting)。
CIDR 虽然不使用子网了,但仍然使用“掩码”这一名词(但不叫子网掩码)。对于 /20 地址块,它的掩码是 20 个连续的 1。 斜线记法中的数字就是掩码中1的个数。
2.2.4.4 CIDR 记法的其他形式
0.0.0.0/10 可简写为 10/10,也就是将点分十进制中低位连续的 0 省略
10.0.0.0/10 相当于指出 IP 地址 10.0.0.0 的掩码是 255.192.0.0,即
11111111 11000000 00000000 00000000
网络前缀的后面加一个星号 * 的表示方法,如
00001010 00*
,在星号 * 之前是网络前缀,而星号 * 表示 IP 地址中的主机号,可以是任意值。
2.2.4.5 CIDR 地址块划分举例
这个 ISP 共有 64 个 C 类网络。如果不采用 CIDR 技术,则在与该 ISP 的路由器交换路由信息的每一个路由器的路由表中,就需要有 64 个项目。
但采用地址聚合后,只需用路由聚合后的 1 个项目 206.0.64.0/18 就能找到该 ISP。
2.2.5 IP 地址的一些重要特点
- IP 地址是一种分等级的地址结构。分两个等级的好处是:
- IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理。
- 路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间。
- 实际上 IP 地址是标志一个主机(或路由器)和一条链路的接口。
- 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址,其网络号 net-id 必须是不同的。这种主机称为多归属主机(multihomed host)。
- 由于一个路由器至少应当连接到两个网络(这样它才能将 IP 数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的 IP 地址。
- 用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号 net-id。
- 所有分配到网络号 net-id 的网络,无论是范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。
举例如下:
2.3 IP地址与MAC地址
MAC地址是数据链路层使用的地址,IP地址是网络层和以上各层使用的地址,是一种逻辑地址。
在发送数据时,数据从高层下到低层,IP数据包一旦交给数据链路层,就被封装成MAC帧,MAC帧在传递过程中使用的源地址和目的地址都是MAC地址。
看一个传输实例:
路由器只根据目的站的 IP 地址的网络号进行路由选择。
在 IP 层抽象的互联网上只能看到 IP 数据报,图中的 IP1→IP2 表示从源地址 IP1 到目的地址 IP2 ,两个路由器的 IP 地址并不出现在 IP 数据报的首部中。
在具体的物理网络的链路层只能看见 MAC 帧而看不见 IP 数据报。
IP层抽象的互联网屏蔽了下层很复杂的细节在抽象的网络层上讨论问题,就能够使用统一的、抽象的 IP 地址研究主机和主机或主机和路由器之间的通信。
IP地址如何转换为MAC地址?
2.4 地址解析协议 ARP
不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。
每一个主机都设有一个 ARP 高速缓存(ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。
当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址。
2.4.1 ARP 高速缓存的作用
- 为了减少网络上的通信量,主机 A 在发送其 ARP 请求分组时,就将自己的 IP 地址到硬件地址的映射写入 ARP 请求分组。
- 当主机 B 收到 A 的 ARP 请求分组时,就将主机 A 的这一地址映射写入主机 B 自己的 ARP 高速缓存中。这对主机 B 以后向 A 发送数据报时就更方便了。
应当注意:
- ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。
- 如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。
从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP 协议就会自动地将该 IP 地址解析为链路层所需要的硬件地址。
2.4.2 使用 ARP 的四种典型情况
发送方是主机,要把IP数据报发送到本网络上的另一个主机。这时用 ARP 找到目的主机的硬件地址。
发送方是主机,要把 IP 数据报发送到另一个网络上的一个主机。这时用 ARP 找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成。
发送方是路由器,要把 IP 数据报转发到本网络上的一个主机。这时用 ARP 找到目的主机的硬件地址。
发送方是路由器,要把 IP 数据报转发到另一个网络上的一个主机。这时用 ARP 找到本网络上另一个路由器的硬件地址。剩下的工作由这个路由器来完成。
2.4.3 为什么不直接使用硬件地址进行通信?
由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此几乎是不可能的事。
连接到因特网的主机都拥有统一的 IP 地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为调用 ARP 来寻找某个路由器或主机的硬件地址都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。
2.5 IP 数据报的格式
一个 IP 数据报由首部和数据两部分组成。
首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。
2.5.1 IP 数据报首部的固定部分中的各字段
2.5.1.1 版本
占 4 位,指 IP 协议的版本,目前的 IP 协议版本号为 4(即 IPv4)。
2.5.1.2 首部长度
占 4 位,可表示的最大数值是 15 个单位(一个单位为 4 字节),因此 IP 的首部长度的最大值是 60 字节。
2.5.1.3 区分服务
占 8 位,用来获得更好的服务。在旧标准中叫做服务类型,但实际上一直未被使用过。
1998 年这个字段改名为区分服务。只有在使用区分服务(DiffServe)时,这个字段才起作用。在一般的情况下都不使用这个字段。
2.5.1.4 总长度
占 16 位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节。总长度必须不超过最大传送单元 MTU。
2.5.1.5 标识
占 16 位,它是一个计数器,用来产生数据报的标识。
相同的标识字段的值使分片后的各数据报片最后能正确地重装称为原来的数据报。
2.5.1.6 标志
占 3 位,目前只有前两位有意义。
标志字段的最低位是 MF (More Fragment)。
- MF = 1 表示后面“还有分片”
- MF = 0 表示最后一个分片。
标志字段中间的一位是 DF (Don’t Fragment) ,意思是“不能分片”,只有当 DF = 0 时才允许分片。
2.5.1.7 片偏移
片偏移(13 位)指出:较长的分组在分片后某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。
IP 数据报分片
2.5.1.8 生存时间
生存时间(8 位)记为 TTL (Time To Live),即数据报在网络中可通过的路由器数的最大值。
防止无法交付的数据报无限制地在互联网中兜圈子,每经过一个路由器时,TTL减去数据报在路由器所消耗掉的一段时间,当TTL值减小到0,就丢弃这个数据报。
2.5.1.9 协议
协议(8 位)字段指出此数据报携带的数据使用何种协议,以便目的主机的 IP 层将数据部分上交给哪个处理过程。
2.5.1.10 首部校验和
首部检验和(16 位)字段只检验数据报的首部,不检验数据部分。这里不采用 CRC 检验码而采用简单的计算方法。
没经过一个路由器都要重新计算一下首部校验和,因此不检验数据部分可减少计算的工作量。
先将IP数据报首部划分为许多16位字的序列,用反码算术运算吧所有16位字相加后,将得到的和的反码写入检验和字段。
接收方收到数据报后,把首部的所有16位字再使用反码算术运算相加一次。
2.5.1.11 源地址和目的地址
源地址和目的地址都各占 4 字节。
2.5.2 IP 数据报首部的可变部分
IP 首部的可变部分就是一个选项字段,用来支持排错、测量以及安全等措施,内容很丰富。选项字段的长度可变,从 1 个字节到 40 个字节不等,取决于所选择的项目。
增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。
3 IP 层转发分组的流程
3.1 基于终点的转发
假设有四个 A 类网络,通过三个路由器连接在一起。每一个网络上都可能会有成千上万个主机。可以想像,若按目的主机号来制作路由表,则所得出的路由表就会非常庞大。
但若按主机所在的网络地址(范围)来制作路由表,那么每一个路由器中的路由表就只包含 4 个条目。这样就可使路由表大大简化。
3.1.1 查找路由表
根据目的网络地址就能确定下一跳路由器,这样做的结果是:
- P 数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。
- 只有到达最后一个路由器时,才试图向目的主机进行直接交付。
3.1.2 特定主机路由
这种路由是为特定的目的主机指明一个路由。
采用特定主机路由可使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由。
3.1.3 默认路由(default route)
路由器还可采用默认路由以减少路由表所占用的空间和搜索路由表所用的时间。这种转发方式在一个网络只有很少的对外连接时是很有用的。
默认路由在主机发送 IP 数据报时往往更能显示出它的好处。
如果一个主机连接在一个小网络上,而这个网络只用一个路由器和因特网连接,那么在这种情况下使用默认路由是非常合适的。
注意:
IP 数据报的首部中没有地方可以用来指明“下一跳路由器的 IP 地址”。
当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件。
网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的 MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器。
3.1.4 分组转发算法
从数据报的首部提取目的主机的 IP 地址 D,得出目的网络地址为 N。
若网络 N 与此路由器直接相连,则把数据报直接交付目的主机 D;否则是间接交付,执行3。
若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行4。
若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行5。
若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行6。
报告转发分组出错。
3.2 使用子网掩码的分组转发过程
在不划分子网的两级 IP 地址情况下,从 IP 地址中可直接得出其网络地址。
但在划分子网的三级 IP 地址情况下,从 IP 地址中不能直接得出其网络地址,这是因为网络地址取决于那个网络所采用的子网掩码,但数据报的首部并没有提供子网掩码的信息。因此分组转发的算法将做一些相应的改动。
3.2.1 在划分子网的情况下路由器转发分组的算法
例:已知互联网和路由器 R1 中的路由表。主机 H1 向 H2 发送分组。试讨论 R1 收到 H1 向 H2 发送的分组后查找路由表的过程。
3.3 最长前缀匹配
使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果。
应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配(longest-prefix matching)。
网络前缀越长,其地址块就越小,因而路由就越具体(more specific) 。最长前缀匹配又称为最长匹配或最佳匹配。
最长前缀匹配举例:
应选择两个匹配的地址中更具体的一个,即选择最长前缀的地址。
3.3.1 使用二叉线索查找转发表
使用CIDR之后,由于不知道目的网络的前缀,使转发表的查找过程变得更加复杂了。对于CIDR的转发表的最简单的查找算法就是对所有可能的前缀进行循环查找,从最长的前缀开始查找。
这种最简单的算法的明显缺点就是查找的次数太多,最坏的情况是转发表中没有这个路由,但是还要一直查找下去。
为了进行更加有效的查找,可以使用二叉线索来维护,二叉线索(binary trie)是一种特殊结构的树,可以快速在转发表中找到匹配的叶节点。
- 从二叉线索的根节点自顶向下的深度最多有 32 层,每一层对应于 IP 地址中的一位。
- 为简化二叉线索的结构,可以用唯一前缀 (unique prefix) 来构造二叉线索。
- 为了提高二叉线索的查找速度,广泛使用了各种压缩技术。
规则:先检查 IP 地址左边的第一位,如为 0,则第一层的节点就在根节点的左下方;如为 1,则在右下方。然后再检查地址的第二位,构造出第二层的节点。依此类推,直到唯一前缀的最后一位。每个叶节点代表一个唯一前缀。 为检查网络前缀是否匹配,必须使二叉线索中的每一个叶节点包含所对应的网络前缀和子网掩码。
4 网际控制报文协议ICMP
为了提高 IP 数据报交付成功率,在网络层使用了网际控制报文协议 ICMP (Internet Control Message Protocol)。
ICMP 允许主机或路由器报告“差错以及有关异常情况”。ICMP 报文加上IP数据报的首部,组成 IP 数据报发送出去。(注意:ICMP和IP均为网络层的协议)
4.1 ICMP 报文的种类
ICMP 报文的种类有两种,即
- ICMP 差错报告报文
- ICMP 询问报文
ICMP 报文的前 4 个字节共有三个字段:即类型、代码和检验和,接着的 4 个字节内容与 ICMP 类型有关。
4.1.1 ICMP 差错报告报文共有 5 种
- 终点不可达
- 时间超过
- 参数问题:路由器或目的主机收到的数据报的首部中有的字段的值不正确
- 改变路由(重定向)(Redirect) :找到了更好的路由
4.1.2 ICMP 询问报文有两种
- 送请求报文(及回送请求答复报文)
- 时间戳请求报文(及时间戳请求答复报文)
下面的几种 ICMP 报文不再使用:
- 信息请求报文与答复报文
- 掩码地址请求和答复报文
- 路由器询问报文和通告报文
4.2 ICMP 差错报告报文的数据字段的内容
所有的ICMP差错报告报文中的数据字段都具有相同的格式,把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。
4.3 不应发送 ICMP 差错报告报文的 4 种情况
对 ICMP 差错报告报文不再发送 ICMP 差错报告报文
对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。(IP数据报首部中“偏移量”字段)
对具有多播地址的数据报都不发送 ICMP 差错报告报文
对具有特殊地址(如127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文
5 路由选择协议
5.1 有关路由选择协议的几个基本概念
5.1.1 理想的路由算法
算法必须是正确的和完整的。
算法在计算上应简单。
算法应能适应通信量和网络拓扑的变化,这就是说,要有自适应性。
算法应具有稳定性。
算法应是公平的。
算法应是最佳的。
不存在一种绝对的最佳路由算法。所谓“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。实际的路由选择算法,应尽可能接近于理想的算法。
路由选择是个非常复杂的问题它是网络中的所有结点共同协调工作的结果。路由选择的环境往往是不断变化的,而这种变化有时无法事先知道。
从路由算法的自适应性考虑
- 静态路由选择策略——即非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。
- 动态路由选择策略——即自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。
5.1.2 分层次的路由选择协议
因特网采用分层次的路由选择协议。
因特网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使因特网的通信链路饱和。
许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到因特网上。
因此把互联网划分为许多较小的自治系统(Autonomous System) 。
自治系统是在单一的技术管理下的一组路由器,而这些路由器使用一种 AS 内部的路由选择协议和共同的度量以确定分组在该 AS 内的路由,同时还使用一种 AS 之间的路由选择协议用以确定分组在 AS之间的路由。
现在对自治系统 AS 的定义是强调下面的事实:尽管一个 AS 使用了多种内部路由选择协议和度量,但重要的是一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。
这样就把互联网的路由选择协议划分位两大类:
内部网关协议 IGP(Interior Gateway Protocol)
即在一个自治系统内部使用的路由选择协议。目前这类路由选择协议使用得最多,如 RIP 和 OSPF 协议。
外部网关协议EGP(External Gateway Protocol)
若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议 EGP。在外部网关协议中目前使用最多的是 BGP-4。
- 自治系统之间的路由选择也叫做域间路由选择(interdomain routing)
- 在自治系统内部的路由选择叫做域内路由选择(intradomain routing)
5.2 内部网关协议 RIP
路由信息协议 RIP(Routing Information Protocol)是内部网关协议 IGP中最先得到广泛使用的协议。RIP 是一种分布式的基于距离向量的路由选择协议。
RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。
“距离”的定义如下:
从一路由器到直接连接的网络的距离定义为 1。
从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加 1。
RIP 协议中的“距离”也称为“跳数”(hop count),因为每经过一个路由器,跳数就加 1。
这里的“距离”实际上指的是“最短距离”,
RIP 认为一个好的路由就是它通过的路由器的数目少,即“距离短”。RIP 允许一条路径最多只能包含 15 个路由器。
“距离”的最大值为16 时即相当于不可达。可见 RIP 只适用于小型互联网。
RIP 不能在两个网络之间同时使用多条路由。RIP 选择一个具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。
5.2.1 RIP 协议的特点
和哪些路由器交换信息?交换什么信息?在什么时候交换信息?
仅和相邻路由器交换信息,不相邻的路由器不交换信息。
交换的信息是当前本路由器所知道的全部信息,即自己的路由表。
按固定的时间间隔交换路由信息,例如,每隔 30 秒。
路由器在刚刚开始工作时,只知道到直接连接的网络的距离(此距离定义为1)。
以后,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。
RIP 协议的收敛(convergence)过程较快,即在自治系统中所有的结点都得到正确的路由选择信息的过程。
5.2.2 距离向量算法
RIP协议让互联网中的所有路由器都和自己的相邻路由器不断交换路由信息,并不断更新其路由表,使得从每一个路由器到每一个目的网络的路由都是最短的(即跳数最少)。
虽然所有的路由器最终都拥有了整个自治系统的全局路由信息,但由于每一个路由器的位置不同,它们的路由表当然也应当是不同的。
5.2.3 RIP2 协议的报文格式
现在较新的RIP版本是1998年11月公布的RIP2,新版本协议本身并无多大变化,但性能上有些改进。
RIP2可以支持无分类域间路由选择CIDR,并且还提供简单的鉴别过程支持多播。
RIP2 的报文由首部和路由部分组成。
RIP2 报文中的路由部分由若干个路由信息组成。每个路由信息需要用 20 个字节。地址族标识符(又称为地址类别)字段用来标志所使用的地址协议。
路由标记填入自治系统的号码,这是考虑使RIP 有可能收到本自治系统以外的路由选择信息。再后面指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离。
5.2.4 RIP 协议的优缺点
优点:
- RIP 协议最大的优点就是实现简单,开销较小。
缺点:
- RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)。
- 路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。
- RIP 存在的一个问题是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。(坏消息传播的慢)
5.3 内部网关协议 OSPF
开放最短路径优先OSPF(Open Shortest Path First)最主要的特征就是使用链路状态协议,特点如下:
向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法。
发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。
只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。
5.3.1 链路状态数据库
由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库。这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。
OSPF 的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。OSPF 的更新过程收敛得快是其重要优点。
RIP协议的每一个路由器虽然知道到所有网络的距离以及吓一跳路由器,但不知道全网的拓扑结构。
5.3.2 区域(area)
为了使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干个更小的范围,叫作区域。
每一个区域都有一个 32 位的区域标识符(用点分十进制表示)。区域也不能太大,在一个区域内的路由器最好不超过 200 个。
划分区域的好处就是将利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量。
在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。
OSPF 使用层次结构的区域划分。在上层的区域叫作主干区域(backbone area)。主干区域的标识符规定为0.0.0.0。主干区域的作用是用来连通其他在下层的区域。
主干路由器:
区域边界路由器:
5.3.3 OSPF 直接用 IP 数据报传送
OSPF 不用 UDP 而是直接用 IP 数据报传送。OSPF 构成的数据报很短。这样做可减少路由信息的通信量。
数据报很短的另一好处是可以不必将长的数据报分片传送。分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。
5.3.4 OSPF 的其他特点
OSPF 对不同的链路可根据 IP 分组的不同服务类型 TOS 而设置成不同的代价。因此,OSPF 对于不同类型的业务可计算出不同的路由。
如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径。这叫作多路径间的负载平衡。
所有在 OSPF 路由器之间交换的分组都具有鉴别的功能。
支持可变长度的子网划分和无分类编址 CIDR。
每一个链路状态都带上一个 32 位的序号,序号越大状态就越新。
5.3.5 OSPF 的五种分组类型
类型1,问候(Hello)分组。
类型2,数据库描述(Database Description)分组。
类型3,链路状态请求(Link State Request)分组。
类型4,链路状态更新(Link State Update)分组,用洪泛法对全网更新链路状态。
类型5,链路状态确认(Link State Acknowledgment)分组。
OSPF 使用的是可靠的洪泛法,在收到更新分组后要发送确认,图中的空心箭头表示确认分组。
OSPF 还规定每隔一段时间,如 30 分钟,要刷新一次数据库中的链路状态。
由于一个路由器的链路状态只涉及到与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此当互联网规模很大时,OSPF 协议要比距离向量协议 RIP 好得多。
OSPF 没有“坏消息传播得慢”的问题,据统计,其响应网络变化的时间小于 100 ms。
5.3.6 指定的路由器
多点接入的局域网采用了指定的路由器的方法,使广播的信息量大大减少。
指定的路由器代表该局域网上所有的链路向连接到该网络上的各路由器发送状态信息。
5.4 外部网关协议 BGP
BGP 是不同自治系统的路由器之间交换路由信息的协议。
因特网的规模太大,使得自治系统之间路由选择非常困难。对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。
当一条路径通过几个不同 AS 时,要想对这样的路径计算出有意义的代价是不太可能的。
比较合理的做法是在 AS 之间交换“可达性”信息。
自治系统之间的路由选择必须考虑有关策略。
因此,边界网关协议 BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。
5.4.1 BGP 发言人
每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“ BGP 发言人” 。
一般说来,两个 BGP 发言人都是通过一个共享网络连接在一起的,而 BGP 发言人往往就是 BGP 边界路由器,但也可以不是 BGP 边界路由器。
一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话(session),利用 BGP 会话交换路由信息。
- 用 TCP 连接能提供可靠的服务,也简化了路由选择协议。
- 使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此成为对方的邻站或对等站。
5.4.2 BGP分类
eBGP
运行与不同AS之间的BGP称为eBGP。为了防止AS间产生环路,当BGP设备接收eBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。
iBGP
AS内部的连接称为iBGP,在一个AS内部所有的iBGP必须是全连通的,即使两个路由器之间没有物理连接,但它们之间仍然有iBGP连接。
因此协议BGP不仅运行在AS之间,还要运行在AS内部。
5.4.3 BGP-4 的四种报文
打开(OPEN)报文,用来与相邻的另一个BGP发言人建立关系。
更新(UPDATE)报文,用来发送某一路由的信息,以及列出要撤消的多条路由。
保活(KEEPALIVE)报文,用来确认打开报文和周期性地证实邻站关系。
通知(NOTIFICATION)报文,用来发送检测到的差错。
在 RFC 2918 中增加了 ROUTE-REFRESH 报文,用来请求对等端重新通告。
6 路由器的构成
路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。
6.1 输入端口对线路上收到的分组的处理
数据链路层剥去帧首部和尾部后,将分组送到网络层的队列中排队等待处理。这会产生一定的时延。
输出端口将交换结构传送来的分组发送到线路
当交换结构传送过来的分组先进行缓存。数据链路层处理模块将分组加上链路层的首部和尾部,交给物理层后发送到外部线路。
若路由器处理分组的速率赶不上分组进入队列的速率,则队列的存储空间最终必定减少到零,这就使后面再进入队列的分组由于没有存储空间而只能被丢弃。
路由器中的输入或输出队列产生溢出是造成分组丢失的重要原因。