本文参考《计算机网络(第7版)》
网络层提供的两种服务
网络层主要任务:
- 通过路由选择算法,为 IP分组 (数据报) 通过通信子网从源主机到目的主机选择一条最合适的传输路径
- 网络层能向传输层提供两种类型的接口:数据报、虚电路
虚电路:
- 当两台计算机进行通信时, 也应当先建立连接(虚电路 VC Virtual Circuit), 以预留双方通信所需的一切网络资源。然后双方就必须沿着已建立的虚电路发送分组
- 这样的分组的首部不需要填写完整的目的主机地址, 而只需要填写这条虚电路的编号(一个不大的整数), 因而减少了分组的开销
- 这种通信方式如果再使用可靠传输的网络协议, 就可使所发送的分组无差错按序到达终点, 当然也不丢失、不重复
- 在通信结束后要释放建立的虚电路
- 可靠通信由网络保证
数据报:
- 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务
- 网络在发送分组时不需要先建立连接。每一个分组(也就是IP 数据报)独立发送, 与其前后的分组无关(不进行编号)。网络层不提供服务质量的承诺 (可靠传输由运输层负责 (包括差错处理、流量控制等))
- 可靠通信由用户主机保证
由于传输网络不提供端到端的可靠传输服务, 这就使网络中的路由器比较简单, 且价格低廉
TCP / IP 体系的网络层
- 向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务
- 网络层不提供服务质量的承诺, 不保证分组交付的时限, 所传送的分组可能出错、丢失、重复和失序。进程之间通信的可靠性由运输层负责
网际协议 IP
这里所讲的 IP (Internet Protocol) 是 IPv4
IPv4 协议的主要特点
- IP 协议提供的是一种 “尽力而为” 的服务
- 无连接:IP 协议并不维护 IP 分组发送后的任何状态信息。每个分组的传输过程是相互独立的
- 不可靠:IP 协议不能保证每个 IP 分组都能够正确地、不丢失和顺序地到达目的结点
- IP 协议是点-点的网络层通信协议
- 为通信的两个主机之间寻找一条路径,通常由多个路由器和点-点链路组成
- IP 协议保证数据分组通过多跳路径从源结点到达目的结点;是针对源主机-路由器、路由器-路由器、路由器-主机之间的数据传输的点-点的网络层通信协议;
- IP 协议向传输层屏蔽了物理网络的差异
虚拟互连网络
将网络互相连接起来要使用一些中间设备。根据中间设备所在的层次, 可以有以下四种不同的中间设备:
- 物理层使用的中间设备叫做转发器 (repeater),数据链路层使用的中间设备叫做网桥(bridge)
- 当中间设备是转发器或网桥时, 这仅仅是把一个网络扩大了, 而从网络层的角度看,这仍然是一个网络, 一般并不称之为网络互连
- 网络层使用的中间设备叫做路由器(router)
- 路由器其实就是一台专用计算机, 用来在互联网中进行路由选择
- 在网络层以上使用的中间设备叫做网关(gateway)。用网关连接两个不兼容的系统需要在高层进行协议的转换
- 网关由于比较复杂, 目前使用得较少。因此现在我们讨论网络互连时, 都是指用路由器进行网络互连和路由选择
- 由于历史的原因, 许多文献曾经把网络层使用的路由器称为网关
图 4-3 (a) 表示有许多计算机网络通过一些路由器进行互连
- 由于参加互连的计算机网络都使用相同的网际协议 IP, 因此可以把互连以后的计算机网络看成如图 4-3 (b) 所示的一个虚拟互连网络,即逻辑互连网络。
- 它的意思就是互连起来的各种物理网络的异构性本来是客观存在的, 但是我们利用 IP 协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络
- 这种使用 IP 协议的虚拟互连网络可简称为 IP 网。使用 IP 网的好处是: 当 IP 网上的主机进行通信时, 就好像在一个单个网络上通信一样, 它们看不见互连的各网络的具体异构细节(如具体的编址方案、路由选择协议, 等等)。如果在这种覆盖全球的 IP 网的上层使用 TCP 协议, 那么就是现在的互联网(Internet)。
- IP 层抽象的互联网屏蔽了下层网络很复杂的细节, 使我们能够使用统一的、抽象的 IP 地址处理主机之间的通信问题
当很多异构网络通过路由器互连起来时, 如果所有的网络都使用相同的IP协议, 那么在网络层讨论问题就显得很方便
在图4-4所示的互联网中的源主机 H 1 H_1 H1 要把一个IP数据报发送给目的主机 H 2 H_2 H2。
- H 1 H_1 H1 先要查找自己的路由表, 看目的主机是否就在本网络上。如是, 则不需要经过任何路由器而是直接交付, 任务就完成了
- 如不是, 则必须把IP数据报发送给某个路由器(图中的 R 1 R_1 R1 )。 R 1 R_1 R1 在查找了自己的路由表后, 知道应当把数据报转发给 R 2 R_2 R2 进行间接交付。这样一直转发下去, 最后由路由器 R 5 R_5 R5 知道自己是和 H 2 H_2 H2 接在同一个网络上, 不需要再使用别的路由器转发了, 于是就把数据报直接交付目的主机 H 2 H_2 H2。
如果我们只从网络层考虑问题, 那么 IP 数据报就可以想象是在网络层中传送, 其传送路径是:
H
1
→
R
1
→
R
2
→
R
3
→
R
4
→
R
5
→
H
2
H_1\rightarrow R_1 \rightarrow R_2\rightarrow R_3\rightarrow R_4\rightarrow R_5\rightarrow H_2
H1→R1→R2→R3→R4→R5→H2这样就不必画出许多完整的协议栈, 使问题的描述更加简单
可以注意到, R 4 R_4 R4 和 R 5 R_5 R5 之间使用了卫星链路, 而 R 5 R_5 R5 所连接的是个无线局域网
IPv4 分组的格式
- IP 分组由两个部分组成:分组头(首部) 和 数据
- 人们习惯用4字节为基本单元(每行宽度)表示分组头字段
- IPv4分组头长度是可变的的,基本长度20字节( 5行必须字段) ,最大长度60字节(可选字段最长40Byte )
- 版本(version),长度为4位,表示所使用的网络层IP协议的版本号;值为4,表示IPv4
- 首部长度字段的长度为4位,定义了以4字节为一个单位的分组头的长度;值范围5~15
- 区分服务字段用于指示路由器如何处理分组,含 4 位区分服务字段、3 位优先级字段与 1 位保留位
- 区分服务参数位有4位,分别表示:D(延迟)、 T(吞吐量)、R(可靠性)与 C(成本)
- 每个组合中,最多只能有一位的值为1,其它3个位为0;分别表示低延迟、高吞吐率、高可靠性与低成本
- 例如,要获得低服务成本(low cost),则D、T、R、C参数的组合是0001,只能牺牲延迟、通信量、可靠性等其它3方面的要求
只有在使用区分服务时, 这个字段才起作用。在一般的情况下都不使用这个字段
- 总长度字段为16位,定义以字节为单位的分组总长度,是分组头长度与数据长度之和,能表示
2
16
−
1
=
65535
2^{16}-1=65535
216−1=65535 字节
- 在 IP 层下面的每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度, 这称为最大传送单元 MTU
- 当一个 IP 数据报封装成链路层的帧时, 此数据报的总长度(即首部加上数据部分) 一定不能超过下面的数据链路层所规定的MTU值。例如, 最常用的以太网就规定其MTU值是1500字节。若所传送的数据报长度超过数据链路层的MTU值, 就必须把过长的数据报进行分片处理
- 在进行分片时, 数据报首部中的“ 总长度” 字段是指分片后的每一个分片的首部长度与该分片的数据长度的总和
- 标识字段长度为16位,最多可以分配的ID值为65535个,用于区分分组
- IP 软件在存储器中维持一个计数器, 每产生一个数据报, 计数器就加1 , 并将此值赋给标识字段。但这个“ 标识” 并不是序号,因为IP 是无连接服务, 数据报不存在按序接收的问题
- 当数据报由于长度超过网络的MTU而必须分片时, 这个标识字段的值就被复制到所有的数据报片的标识字段中
- 分组可能通过不同的传输路径到达目的结点,目的结点根据标识字段ID值,将同一标识的片挑出来重装
- 标志字段共3位,最高位为0,必须复制到所有分组中
- 不分片(DF,Don’t Fragment)值:
- DF = 1,表示接收结点不能对分组分片
- DF = 0,表示可以分片
- 分片(MF,More Fragment)值:
- MF = 1 表示接收的分片不是最后一个分片
- MF = 0 表示接收的是最后一个分片
- 不分片(DF,Don’t Fragment)值:
- 片偏移字段表示分片在整个分组中的相对位置,以 8 Byte 为单位计数
分片与标识、标志、片偏移的关系:
假设首部为 20 字节
例
- 数据报的总长度为 3820 3820 3820 字节,其数据部分为 3800 3800 3800 字节(使用固定首部), 需要分片为长度不超过 1500 1500 1500 字节的数据报片。请给出分片结果
解
- 因固定首部长度为 20 字节,因此 每个数据报片的数据部分长度不能超过 1480 字节。于是分为 3 个数据报片, 其数据部分的长度分别为 1480 1480 1480, 1480 1480 1480 和 840 840 840 字节
- 原始数据报首部被复制为各数据报片的首部, 且必须修改有关字段的值
- 生存时间(TTL Time to live)字段——用来设定分组在互联网络中被最多转发分组的路由器跳数(hop)
- TTL的意义是指明数据报在互联网中至多可经过多少个路由器。路由器在每次转发数据报之前就把TTL值减1。若TTL值减小到零,就丢弃这个数据报,不再转发
- 显然,数据报能在互联网中经过的路由器的最大数值是255。若把TTL的初始值设置为1, 就表示这个数据报只能在本局域网中传送
- 避免由于路由表错误引起数据报在网络中循环、无休止地流动
- 协议字段——是指使用 IP 协议的高层协议类型,长度为8位;以便目的主机的IP层将数据部分上交给哪个进程处理
- 首部校验和字段——16 位, IP分组头每经过一个路由器都要改变一次 (一些字段, 如生存时间、标志、片偏移等都可能发生变化),因此,数据报每经过一个路由器, 路由器都要重新计算一下首部检验和
- 这个字段只检验数据报的首部, 但不包括数据部分,可减少计算的工作量
- 地址字段包括源地址 (source address) 与目的地址(destination address),长度都是32位
- 设置 IP 报头选项的主要目的是控制与测试,由选项码、长度与选项数据等3部分组成
- 选项码: 选项码用于确定该选项的具体功能,如源路由、记录路由、时间戳 等
- 源路由是指由发送分组的源主机制定的传输路径,用以区别由路由器通过路由选择算法确定的路径
源路由分为严格源路由(SRR)与松散源路由(LRR)
严格源路由规定分组要经过的路径上每个路由器,相邻路由器之间不能插入其它路由器,并且经过的路由器顺序不能改变
松散源路由规定分组一定要经过的路由器,但不是一条完整的传输路径,中途可以经过其它路由器 - 记录路由:将分组经过的每个路由器的IP地址记录下来
- 时间戳可以记录分组经过每个路由器的本地时间,采用格林威治时间,单位是毫秒;
网络管理员可以利用它追踪路由器的运行状态,分析网络吞吐率、拥塞情况与负荷情况等
- 源路由是指由发送分组的源主机制定的传输路径,用以区别由路由器通过路由选择算法确定的路径
- 选项码: 选项码用于确定该选项的具体功能,如源路由、记录路由、时间戳 等
实际上这些选项很少被使用。最后如果可变部分长度不是4字节的整数倍, 必须利用最后的填充字段加以填充
IPv4 地址的基本概念
- 连接到每个局域网的计算机都有一个MAC地址,即物理地址;物理地址是数据链路层和物理层使用的地址,用来标识接入局域网的一台主机;
- IP地址 (32位) 是网络层和以上各层使用的地址,主要用于路由器寻址,通过软件设置,因此也称为逻辑地址
- 网络中的每一个主机或路由器至少有一个IP地址
- 在Internet中不允许有两个设备具有同样的IP地址
- 如果一台主机或路由器连接到两个或多个物理网络,那么它可以拥有两个或多个IP地址
MAC 地址 VS IP 地址
- 在 IP 层抽象的互联网上只能看到 IP 数据报
- 虽然在 IP 数据报首部有源站 IP 地址, 但路由器只根据目的站的 IP 地址的网络号进行路由选择
- 在局域网的链路层, 只能看见 MAC帧。MAC 帧在不同网络上传送时, 其 MAC 帧首部中的源地址和目的地址要发生变化。MAC 帧的首部的这种变化, 在上面的 IP 层上是看不见的
- 尽管互连在一起的网络的硬件地址体系各不相同, 但 IP 层抽象的互联网却屏蔽了下层这些很复杂的细节。只要我们在网络层上讨论问题, 就能够使用统一的、抽象的 IP 地址研究主机和主机或路由器之间的通信
IP地址的点分十进制的表示方法 (提高可读性)
IP地址结构
- IP地址采用分层结构
- IP地址是由网络号(net ID)与主机号(host ID)两部分组成的
- 网络号标志主机(或路由器)所连接到的网络。一个网络号在整个互联网范围内必须是唯一的
- 主机号标志该主机(或路由器)。一台主机号在它前面的网络号所指明的网络范围内必须是唯一的
- 由此可见, 一个IP地址在整个互联网范围内是唯一的
- 当某个单位申请到一个 IP 地址时, 实际上是获得了具有同样网络号的一块地址。其中具体的各台主机号则由该单位自行分配, 只要做到在该单位管辖的范围内无重复的主机号即可
IP 地址的一些重要特点
- IP 地址是一种分等级的地址结构,分两个等级的好处是:
- IP地址管理机构在分配 IP地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理
- 路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间
- 实际上 IP 地址是标志一个主机(或路由器)和一条链路的接口
- 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址,其网络号 net-id 必须是不同的。这种主机称为多归属主机(multi-homed host)。
- 由于一个路由器至少应当连接到两个网络(这样它才能将IP 数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的 IP地址
- 用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号 net-id。具有不同网络号的局域网必须使用路由器进行互连
- 所有分配到网络号 net-id 的网络,不论范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的
- 在同一个局域网上的主机或路由器的 IP 地址中的网络号必须是一样的
- 用网桥(它只在链路层工作)互连的网段仍然是一个局域网, 只能有一个网络号
- 路由器总是具有两个或两个以上的 IP 地址。即路由器的每一个接口都有一个不同网络号的IP地址
- 当两个路由器直接相连时, 在连线两端的接口处, 可以分配也可以不分配IP地址
- 如分配了IP地址, 则这一段连线就构成了一种只包含一段线路的特殊“ 网络"(如图中的 N 1 , N 2 N_1,N_2 N1,N2 和 N 3 N_3 N3 )。之所以叫做“ 网络” 是因为它有IP 地址
- 但为了节省 IP 地址资源, 对于这种仅由一段连线构成的特殊“ 网络“, 现在也常常不分配IP 地址。通常把这样的特殊网络叫做无编号网络(unnumbered network)或无名网络(anonymous network)
IPv4 地址技术的发展
- 分类的 IP 地址。这是最基本的编址方法
- 子网的划分。这是对最基本的编址方法的改进
- 构成超网。这是比较新的无分类编址方法
- 地址转换 (NAT)
近年来已经广泛使用无分类IP地址进行路由选择, A类、B类和C类地址的区分已成为历史
IPv4 地址的分类
- A 类、B 类和 C 类地址都是单播地址( 一对一通信), 是最常用的
- D 类地址用于多播(一对多通信)
A 类地址
- A 类地址的网络号字段占1个字节,第一位已固定为 0,只有7位可供使用, 但可指派的网络号是 126 个(即
2
7
−
2
2^7 - 2
27−2) (因为有两个保留网络地址)
- IP 地址中的 全 0 表示 本网络
- 网络号为 127(127.x.x.x) 保留作为本地软件环回测试(loopback test) 本主机的进程之间的通信之用
- 若主机发送一个目的地址为环回地址(例如 127.0.0.1) 的 IP 数据报, 则本主机中的协议软件就处理数据报中的数据, 而不会把数据报发送到任何网络
- 目的地址为环回地址的 IP 数据报永远不会出现在任何网络上, 因为网络号为127 的地址根本不是一个网络地址
- A 类地址的主机号占 3 个字节, 因此每一个 A 类网络中的最大主机数是
2
24
−
2
2^{24}-2
224−2 (因为有两个保留主机地址)
- 全 0 的主机号字段表示该 IP 地址是 “本主机” 所连接到的某个网络的地址
(例如, 一主机的 IP 地址为 5.6.7.8, 则该主机所在的网络地址就是 5.0.0.0) - 全 1 的主机号字段表示该网络上的所有主机
- 全 0 的主机号字段表示该 IP 地址是 “本主机” 所连接到的某个网络的地址
- IP 地址空间共有 2 32 2^{32} 232 个地址。整个 A A A 类地址空间共有 2 31 2^{31} 231 个地址, 占整个 IP 地址空间的 50 % 50\% 50%
- A类地址覆盖范围为: 1.0.0.0 1.0.0.0 1.0.0.0~ 127.255.255.255 127.255.255.255 127.255.255.255
B 类地址
- B 类地址的网络号字段有2个字节, 前两位(10)已经固定, 剩下 14 位可以进行分配, 但可指派的网络号是
2
14
−
1
2^{14} - 1
214−1 个
- 网络号全 0 (128.0.0.0) 是不指派的, 而可以指派的 B 类最小网络地址是128.1.0.0
- B 类地址的每一个网络上的最大主机数是 2 16 − 2 2^{16}-2 216−2 (全0 和全1 的主机号保留)
- 整个 B 类地址空间共约有 2 30 2^{30} 230 个地址, 占整个 IP 地址空间的 25 % 25\% 25%
- B 类地址覆盖范围为: 128.0.0.0 128.0.0.0 128.0.0.0 ~ 191.255.255.255 191.255.255.255 191.255.255.255
C 类地址
- C 类地址有 3 个字节的网络号字段, 最前面的 3 位是 (110), 还有 21 位可以进行分配,C 类地址可指派的网络总数是
2
21
−
1
2^{21} - 1
221−1
- C 类网络地址 192.0.0.0 192.0.0.0 192.0.0.0 也是不指派的, 可以指派的C 类最小网络地址是 192.0.1.0 192.0.1.0 192.0.1.0
- 每一个 C 类地址的最大主机数是 2 8 − 2 2^8 - 2 28−2 (全0和全1的两个地址保留)
- 整个 C 类地址空间共约有 2 29 2^{29} 229 个地址, 占整个IP 地址的 12.5 % 12.5\% 12.5%
- C 类地址覆盖范围为: 192.0.0.0 192.0.0.0 192.0.0.0~ 223.255.255.255 223.255.255.255 223.255.255.255
三种常用 IP 地址总结
D 类地址
- D 类IP地址地址覆盖范围为: 224.0.0.0 224.0.0.0 224.0.0.0~ 239.255.255.255 239.255.255.255 239.255.255.255
- D类 IP地址用于其他特殊的用途,如多播地址
E 类地址
- E 类IP地址地址覆盖范围为: 240.0.0.0 240.0.0.0 240.0.0.0~ 247.255.255.255 247.255.255.255 247.255.255.255
- E 类地址用于某些实验和将来使用
特殊的 IP 地址
直接广播地址
- 在A类、B类与C类IP地址中,主机号全1的地址为直接广播地址 (表示该网络上的所有主机)
(如 B 类地址 191.1.255.255) - 它是用来使路由器将一个分组以广播方式发送给特定网络的所有主机
(如 191.1.0.0)
受限广播地址
- 网络号与主机号32位全1的IP地址为受限广播地址
(255.255.255.255) - 它是用来将一个分组以广播方式发送给 本物理网络 中的所有主机
“这个网络上的特定主机”地址
- 在A类、B类与C类IP地址中,网络号为全0的地址为这个网络上的特定主机地址
(如 0.0.0.55) - 网络号为 0 的IP地址不能作为目的地址,只能在如主机使用DHCP或者BOOTP等协议确定本机IP地址时作为初始化过程中的源地址出现
回送地址(lookback address)
- A 类IP地址中
127.
x
.
x
.
x
127.x.x.x
127.x.x.x(非全0全1)是回送地址
(一般用 127.0.0.1 127.0.0.1 127.0.0.1) - 回送地址用于网络软件测试和本地进程间通信
- TCP/IP协议规定:
- 含网络号为 127 的分组不能出现在任何网络上
- 主机和路由器不能为该地址广播任何寻址信息
总结
例
一个主机的 IP 地址为 193.12.5.1。请写出该主机所在网络的直接广播地址,受限广播地址,特定主机地址,网络地址、回送地址
解
- 直接广播地址:193.12.5.255
- 受限广播地址:255.255.255.255
- 特定主机地址:0.0.0.1
- 网络地址:193.12.5.0
- 回送地址:127.0.0.1
专用 IP 地址、NAT
全局IP地址 与 专用IP地址 (private address)
- 全局IP地址是分组在互联网上传输时使用的IP地址
- 专用IP地址只能用于一个机构、公司的内部网络,而不能用于互联网上。在互联网中的所有路由器, 对目的地址是专用地址的数据报一律不进行转发
- 全局IP地址需要申请,而专用IP地址不需要申请
- 全局 IP 地址必须保证在互联网上是惟一的;专用IP地址在某一个网络内部是惟一的,但是在互联网中并不是惟一的
- A、B、C 三类IP地址中各保留一部分地址作为专用IP地址,用于使用TCP/IP协议但不接入互联网的内部网络,或者需要向互联网发送需要将专用地址转换成公用IP地址的内部网络
- 保留的专用地址:
网络地址转换 NAT 技术
- NAT (Network Address Translation,网络地址转换) 将 IP 数据包头中的 IP 地址转换为另一个 IP 地址 (将专用 IP 地址转换为公用 IP 地址)
- 其主要思路是:在局域网中使用专用地址,并按一定规则将专用地址映射为若干个 IP 地址。因此缓解了 IP 地址短缺问题
- 这种方法需要在专用网连接到互联网的路由器上安装 NAT 软件。装有 NAT 软件的路由器叫做 NAT 路由器, 它至少有一个有效的外部全球 IP 地址。这样, 所有使用本地地址的主机在和外界通信时, 都要在 NAT 路由器上将其本地地址转换成全球 IP 地址,才能和互联网连接
NAT 的基本工作原理示意图
- 由此可见, 当NAT路由器具有 n n n 个全球IP地址时, 专用网内最多可以同时有 n n n 台主机接入到互联网。这样就可以使专用网内较多数量的主机, 轮流使用 NAT 路由器有限数量的全球IP地址
- 显然, 通过 NAT 路由器的通信必须由专用网内的主机发起。设想互联网上的主机要发起通信, 当 IP 数据报到达NAT路由器时,NAT路由器就不知道应当把目的IP地址转换成专用网内的哪一个本地IP 地址。这就表明, 这种专用网内部的主机不能充当服务器用, 因为互联网上的客户无法请求专用网内的服务器提供服务
网络地址与端口号转换 NAPT (Network Address and Port Translation) (也可以继续叫它 NAT)
- 为了更加有效地利用 NAT 路由器上的全球 IP 地址, 现在常用的NAT转换表把运输层的端口号也利用上。这样, 就可以使多个拥有本地地址的主机, 共用一个 NAT 路由器上的全球 IP 地址, 因而可以同时和互联网上的不同主机进行通信
- NAPT 的机制有些特殊。普通路由器在转发IP 数据报时, 对源IP地址或目的IP地址都是不改变的。但NAT路由器在转发IP数据报时, 一定要更换其IP地址(转换源IP地址或目的IP地址)
- 其次, 普通路由器在转发分组时, 是工作在网络层。但NAPT路由器还要查看和转换运输层的端口号, 而这本来应当属于运输层的范畴
划分子网 (三级地址结构)
从两级 IP 地址到三级 IP 地址
- IP 地址空间的利用率有时很低
例如 A A A 类地址中可以分配的主机号过多,导致申请了一个 A A A 类地址的单位几乎不可能把所有主机号都用完 - 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏
每一个路由器都应当能够从路由表查出应怎样到达其他网络的下一跳路由器。因此,互联网中的网络数越多, 路由器的路由表的项目数也就越多。这样, 即使我们拥有足够多的IP 地址资源可以给每一个物理网络分配一个网络号, 也会导致路由器的路由表中的项目数过多 - 两级 IP 地址不够灵活
增加新的网络必须事先到互联网管理机构去申请新的网络号
为解决上述问题, IP 地址中又增加了一个 “子网号字段”, 使两级IP地址变成为三级IP地址。这种做法叫做划分子网(subnetting)
I P 地 址 : : = { < 网 络 号 > , < 子 网 号 > , < 主 机 号 > } IP地址 ::= \{<网络号>,<子网号>,<主机号>\} IP地址::={<网络号>,<子网号>,<主机号>}
- 第一级网络号 定义了网点的位置
- 第二级子网号 定义了物理子网
- 第三级主机号 定义了主机和路由器到物理网络的连接
划分子网的基本思路如下:
- 划分子网就是将一个大网分成几个较小的网络。子网之间的距离必须很近
- 分配子网是一个组织和单位内部的事,划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是由多少个子网组成,因为这个单位对外仍然表现为一个网络。既不要向ICANN(互联网名称与数字地址分配机构 )申请,也不需要改变任何外部的数据库
- 划分子网只是从主机号借用若干位作为子网号 subnet-id,而不改变 IP 地址的因特网部分
- 如上图所示,B 类网络 145.13.0.0 被划分为三个子网。在划分子网后, 整个网络对外部仍表现为一个网络。但网络 145.13.0.0 上的路由器在收到外来的数据报后, 再根据数据报的目的地址把它转发到相应的子网
如何从 IP 地址中提取出子网号? ---- 子网掩码
- 子网掩码的作用就是将某个IP地址划分成网络地址和主机地址两部分;可以帮助判断两个节点是否在同一个网络
- 一般将 网络号+子网号 取为 1,主机号取为0,因此,只要把子网掩码和 IP 地址进行逐位的” 与“ 运算(AND), 就立即得出网络地址。这样在路由器处理到来的分组时就可采用同样的算法
( I P 地 址 ) A N D ( 子 网 掩 码 ) = 网 络 地 址 ( 网 络 地 址 + 子 网 标 识 ) (IP 地址)\ \ AND\ \ (子网掩码) = 网络地址(网络地址+子网标识) (IP地址) AND (子网掩码)=网络地址(网络地址+子网标识) - 子网掩码可以用点分十进制表示,也可以用 “
/
”加上网络号+子网号的长度表示
例如,一个B类地址划分为64个子网,子网掩码为 255.255.252.0 或 /22
默认子网掩码
- 掩码的概念同样适用于没有进行子网划分的A类、B类或C类地址 (便于路由器统一处理)
例
已知 IP 地址是 141.14.72.24,子网掩码是 255.255.192.0。试求网络地址
解
- RFC950规定,划分子网后有
n
−
2
n-2
n−2 个可用的子网,子网号全为0(表示网络地址)和全为1(表示广播地址)的子网不可用
- 原因是在某些早期路由协议中不带子网掩码,会与不划分子网的网络地址和广播地址混淆;
- 此规定在RFC1878中被废止,划分子网后,可以有 n n n 个可用的子网
例
B 类地址:
156.26.0.0
156.26.0.0
156.26.0.0;需要至少 210 个子网组成,设计一个可行方案
解
- 子网号的长度为 8,即256个子网数量可供分配使用,子网掩码 255.255.255.0,或者(/24)
- 第一个子网 156.26.0.0/24
广播地址为 156.26.0.255 - 最后一个子网 156.26.255.0/24
广播地址为 156.26.255.255
变长子网掩码 VLSM
- 一个划分子网的网络中可同时使用几个不同长度的子网掩码,即使用变长子网掩码 VLSM (Variable Length Subnet Mask)。可进一步提高 IP 地址资源的利用率
例
某 ISP 有一个B类网络,网络号为145.15.0.0,该ISP下属的三所大学所需的 IP 数量为:
- A大学需要4000个IP
- B大学需要2000个IP
- C大学仅需500个IP
采用定长子网掩码的分配方案为:
- 定长子网掩码:255.255.240.0 或 /20
- 若采用变长子网掩码的分配方案:
-
第一个子网掩码:255.255.240.0
-
第二个子网掩码:255.255.240.0
-
第三个子网掩码:255.255.240.0
-
例
某个公司申请一个 C 类 202.60.31.0 的 IP 地址,该公司有100名员工在销售部门工作,50名员工在财务部门工作,50名员工在设计部门工作。要求为三个部门分别组建子网
解
- 可以通过可变长度子网掩码技术,将一个C类地址分为3个部分,其中子网1的地址空间是子网2与子网3的地址空间的两倍
无分类编址 CIDR (构造超网)
CIDR 的读音是 “sider”
- VLSM 的基础上又进一步研究出无分类编址方法,它的正式名字是无分类域间路由 CIDR (Classless Inter-Domain Routing),主要用于子网的路由聚合
CIDR 技术的特点
- CIDR 消除了传统的 A 类、B 类和 C 类地址的概念,可以更加有效地分配 IPv4 的地址空间
- CIDR 用区别于传统标准分类的IP地址与划分子网的概念的各种长度的 “网络前缀(network-prefix)”,代替“网络号+子网号”,形成新的无类别的二级地址结构,其格式为:
I P 地 址 = { < 网 络 前 缀 > , < 主 机 号 > } IP地址= \{<网络前缀>,<主机号>\} IP地址={<网络前缀>,<主机号>}
CIDR 地址
- CIDR 地址采用“斜线记法”,即 IP地址/网络前缀所占比特数( 这个数值对应于三级编址中子网掩码中 1 的个数)
- 例如:192.168.24.0/22 表示32位的地址中,前22位为网络前缀,后10位代表主机号
- CIDR 将网络前缀相同的连续的 IP 地址组成 CIDR地址块
- 为了更方便地进行路由选择, CIDR 使用32位的地址掩码(address mask) (也可以叫做子网掩码,功能与子网掩码相同)
CIDR 地址块
- 128.14.32.0/20 表示的地址块共有
2
12
2^{12}
212 个地址
- 这个地址块的 起始地址 / 最小地址 是 128.14.32.0
- 这个地址块的 最大地址 是 128.14.47.255
- 全 0 和全 1 的主机号地址一般不使用
例
如果一个校园网管理中心获得 200.24.16.0/20 的地址块。希望将它划分为8个等长的较小的地址块。可以借用CIDR地址中12位主机号的前3位,进一步划分地址块
超网 (supernet)
- 由于一个 CIDR 地址块中有很多地址, 所以在路由表中利用 CIDR 地址块来查找目的网络。这种地址的聚合常称为路由聚合(route aggregation), 它使得路由表中的一个项目可以表示原来传统分类地址的很多个(例如上千个) 路由
- 路由聚合也称为构成超网(supemetting)
- 路由聚合有利于减少路由器之间的路由选择信息的交换, 从而提高了整个互联网的性能
- CIDR 记法有多种形式
- 例如, 地址块 10.0.0.0/10 可简写为 10/10, 也就是把点分十进制中低位连续的0省略
- 另一种简化表示方法是在网络前缀的后面加一个星号
∗
*
∗, 如:
00001010 00 ∗ 00001010\ 00* 00001010 00∗意思是:在星号 ∗ * ∗ 之前是网络前缀, 而星号 ∗ * ∗ 表示 IP 地址中的主机号, 可以是任意值
- 使用 CIDR 的一个好处就是可以更加有效地分配 IPv4 的地址空间, 可根据客户的需要分配适当大小的 CIDR 地址块
从上图可以清楚地看出地址聚合的概念。这个 ISP共拥有 64 个 C 类网络。如果不采用 CIDR 技术, 则在与该 ISP 的路由器交换路由信息的每一个路由器的路由表中, 就需要有 64 个项目。但采用地址聚合后, 就只需用路由聚合后的一个项目206.0.64.0/18 就能找到该 ISP。同理, 这个大学共有4个系。在ISP内的路由器的路由表中, 也需使用206.0.68.0/22这个项目。从上图表格中的二进制地址可看出, 把四个系的路由聚合为大学的一个路由(即构成超网),是将网络前缀缩短。网络前缀越短, 其地址块所包含的地址数就越多
最长前缀匹配 / 最长匹配 / 最佳匹配
- 使用 CIDR 时,路由表中的每个项目由“网络前缀” 和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果
- 网络前缀越长,其地址块就越小,路由就越具体。因此应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)
例
假定大学下属的四系希望 ISP 把转发给四系的数据报直接发到四系而不要经过大学的路由器, 但又不愿意改变自己使用的IP地址块。因此, 在ISP 的路由器的路由表中,至少要有以下两个项目, 即
206.0.68.0
/
22
206.0.68.0/22
206.0.68.0/22 (大学) 和
206.0.71.128
/
25
206.0.71.128/25
206.0.71.128/25 (四系)。现在假定ISP收到一个数据报, 其目的IP地址为
D
=
206.0.71.130
D= 206.0.71.130
D=206.0.71.130。把D分别和路由表中这两个项目的掩码逐位相” 与"。将所得的逐位AND操作的结果按顺序写在下面
现在同一个IP地址
D
D
D 可以在路由表中找到两个目的网络(大学和四系)和该地址相匹配。根据最长前缀匹配的原理, 应当选择后者, 把收到的数据报转发到后一个目的网络(四系), 即选择两个匹配的地址中更具体的一个
IP 路由汇聚
- R G R_G RG:核心路由器
- S 0 , S 1 S_0,S_1 S0,S1:串行专线
- R E , R F R_E,R_F RE,RF:汇聚路由器
- E 0 , E 1 , E 2 E_0,E_1,E_2 E0,E1,E2:以太网接口
- R A ∼ R D R_A\sim R_D RA∼RD:接入路由器
- 8个子网加上核心、汇聚路由器的4个子网,一共12个子网
汇聚之前路由器 R G R_G RG 的路由表
地址汇聚过程
-
路由选择遵循“最长前缀匹配”的原则。
-
寻找156.26.0.0/24~156.26.3.0/24等4项的最长相同的前缀,只要观察地址中的第3个字节:
-
第3个字节的前6位都是相同的,4项中最长相同的前缀为22位;路由表中这4项可以合并成:156.26.0.0/22
-
观察156.26.56.0/24~156.26.59.0/24的第3个字节:
-
第3字节的前6位都是相同的。也就是说,4项的最长相同的前缀是22位。因此,在路由表中这4项条目可以合并成156.26.56.0/22
汇聚之后路由器 R G R_G RG 的路由表
地址解析协议 ARP
Address Resolution Protocol
- 地址解析协议 ARP :从网络层使用的 IP 地址, 解析出在数据链路层使用的硬件地址
(如前所述,MAC 帧在不同网络上传送时, 其 MAC 帧首部中的源地址和目的地址要发生变化,而我们知道的只有 IP 地址,因此要想办法在已知 IP 地址的情况下查找其对应的 MAC 地址)
反向地址解析 RARP:从已知的物理地址找出对应IP地址的映射过程
- 网络层使用的是 IP 地址, 但在实际网络的链路上传送数据帧时, 最终还是必须使用该网络的硬件地址。但 IP 地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系(例如,IP地址有32位, 而局域网的硬件地址是48位)。此外, 在一个网络上可能经常会有新的主机加入进来, 或撤走一些主机。更换网络适配器也会使主机的硬件地址改变
- 地址解析协议 ARP 解决这个问题的方法是 在主机 ARP 高速缓存中存放一个从 IP 地址到硬件地址的映射表, 并且这个映射表还经常动态更新(新增或超时删除)
ARP 分组格式
- 硬件类型
表示物理网络类型;值为1表示发送端是Ethernet - 协议类型
表示网络层协议类型;值为0x0800,表示IPv4协议 - 硬件地址长度
表示物理地址长度;值为6表示采用Ethernet地址 - 协议地址长度
表示网络层地址长度;值为4表示采用IPv4协议
ARP 报文封装在以太网帧中
ARP 高速缓存
- 每一台主机都设有一个 ARP高速缓存 (ARP cache), 里面有本局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。当主机 A A A 欲向本网上的某个主机 B B B 发送 IP 分组时,先在其 ARP 高速缓存中查看有无主机 B B B 的 IP 地址。当主机 B B B 收到 A A A 的 ARP 请求分组时,就将主机 A A A 的这一地址映射写入主机 B B B 自己的 ARP 高速缓存中
新增 映射
- 当主机 A 要向本局域网上的某台主机 B 发送 IP 数据报时, 就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如有, 就在 ARP 高速缓存中查出其对应的硬件地址, 再把这个硬件地址写入 MAC 帧, 然后通过局域网把该 MAC 帧发往此硬件地址
- 也有可能查不到主机 B 的 IP 地址的项目。这可能是主机 B 才入网, 也可能是主机 A 刚刚加电,其高速缓存还是空的。在这种情况下, 主机 A 就自动运行 ARP, 然后按以下步骤找出主机 B 的硬件地址
- ARP 进程 在本局域网上广播发送一个 ARP 请求分组,在本局域网上的所有主机上运行的 ARP 进程都收到此 ARP 请求分组
- 主机 B 的 IP 地址与 ARP 请求分组中要查询的 IP 地址一致, 就收下这个 ARP 请求分组, 并向主机 A 发送 ARP 响应分组, 同时在这个 ARP 响应分组中写入自己的硬件地址。请注意: 虽然 ARP 请求分组是广播发送的, 但 ARP 响应分组是普通的单播, 即从一个源地址发送到一个目的地址
- 主机 A 收到主机 B 的 ARP 响应分组后, 就在其 ARP 高速缓存中写入主机 B 的 IP 地址到硬件地址的映射
- 当主机 A 向 B 发送数据报时, 很可能以后不久主机 B 还要向 A 发送数据报, 因而主机 B 也可能要向 A 发送 ARP 请求分组。为了减少网络上的通信量, 主机 A 在发送其 ARP 请求分组时, 就把自己的 IP 地址到硬件地址的映射写入 ARP 请求分组。当主机 B 收到 A 的 ARP 请求分组时, 就把主机 A 的这一地址映射写入主机 B 自己的 ARP 高速缓存中
超时删除 映射
- ARP 对保存在高速缓存中的每一个映射地址项目都设置生存时间(例如, 10~ 20分钟)。凡超过生存时间的项目就从高速缓存中删除掉
- 设置这种地址映射项目的生存时间是很重要的。设想有一种情况。主机A和B通信。A的ARP高速缓存里保存有B的硬件地址。但B的网络适配器突然坏了, B立即更换了一块, 因此B的硬件地址就改变了。假定A还要和B继续通信。A 在其ARP高速缓存中查找到B原先的硬件地址, 并使用该硬件地址向B发送数据帧。但B原先的硬件地址已经失效了, 因此A无法找到主机B。但是过了一段不长的生存时间, A的ARP高速缓存中已经删除了B原先的硬件地址, 于是A重新广播发送ARP请求分组, 又找到了B
疑问:生存时间之内目的主机更换适配器怎么办???
请注意, ARP 是解决同一个局域网上的主机或路由器的IP 地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上, 例如,下图中, 主机 H 1 H_1 H1 就无法解析出另一个局域网上主机 H 2 H_2 H2 的硬件地址(实际上主机 H 1 H_1 H1 也不需要知道远程主机 H 2 H_2 H2 的硬件地址)。主机 H 1 H_1 H1 发送给 H 2 H_2 H2 的 IP 数据报首先需要通过与主机 H 1 H_1 H1 连接在同一个局域网上的路由器 R 1 R_1 R1 来转发。因此主机 H 1 H_1 H1 这时需要把路由器 R 1 R_1 R1 的 IP 地址 I P 3 IP_3 IP3 解析为硬件地址 H A 3 HA_3 HA3 , 以便能够把 IP 数据报传送到路由器 R 1 R_1 R1。以后, R 1 R_1 R1 从转发表找出了下一跳路由器 R 2 R_2 R2, 同时使用 ARP 解析出 R 2 R_2 R2 的硬件地址 H A 5 HA_5 HA5。于是 IP 数据报按照硬件地址 H A 5 HA_5 HA5 转发到路由器 R 2 R_2 R2 。路由器 R 2 R_2 R2 在转发这个IP数据报时用类似方法解析出目的主机 H 2 H_2 H2 的硬件地址 H A 2 HA_2 HA2 , 使 IP 数据报最终交付主机 H 2 H_2 H2
- 从 IP 地址到硬件地址的解析是自动进行的, 主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知IP地址的主机或路由器进行通信, ARP 协议就会自动地把这个IP地址解析为链路层所需要的硬件地址
- 下面我们归纳出使用 ARP 的四种典型情况
(1) 发送方是主机(如 H 1 H_1 H1), 要把 IP 数据报发送到同一个网络上的另一台主机(如 H 2 H_2 H2 )。这时 H 1 H_1 H1 发送 ARP 请求分组(在网1上广播), 找到目的主机 H 2 H_2 H2 的硬件地址
(2) 发送方是主机(如 H 1 H_1 H1 ), 要把 IP 数据报发送到另一个网络上的一台主机(如 H 3 H_3 H3 或 H 4 H_4 H4)。这时 H 1 H_1 H1 发送 ARP 请求分组(在网1上广播), 找到网1上的一个路由器 R 1 R_1 R1 的硬件地址。剩下的工作由路由器 R 1 R_1 R1 来完成。 R 1 R_1 R1 要做的事情是下面的(3) 或(4)
(3) 发送方是路由器(如 R 1 R_1 R1 ), 要把 IP 数据报转发到与 R 1 R_1 R1 连接在同一个网络(网2) 上的主机(如 H 3 H_3 H3 )。这时 R 1 R_1 R1 发送 ARP 请求分组(在网2上广播), 找到目的主机 H 3 H_3 H3 的硬件地址
(4) 发送方是路由器(如 R 1 R_1 R1 ), 要把 IP 数据报转发到网3 上的一台主机(如 H 4 H_4 H4 )。 H 4 H_4 H4 与 R 1 R_1 R1 不是连接在同一个网络上。这时 R 1 R_1 R1 发送ARP请求分组(在网2上广播), 找到连接在网2上的一个路由器 R 2 R_2 R2 的硬件地址。剩下的工作由这个路由器 R 2 R_2 R2 来完成
有的读者可能会产生这样的问题: 既然在网络链路上传送的帧最终是按照硬件地址找到目的主机的, 那么为什么我们还要使用抽象的IP地址, 而不直接使用硬件地址进行通信? 这样似乎可以免除使用ARP
答:
- 由于全世界存在着各式各样的网络, 它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作, 因此由用户或用户主机来完成这项工作几乎是不可能的事。但IP编址把这个复杂问题解决了。连接到互联网的主机只需各自拥有一个唯一的IP地址, 它们之间的通信就像连接在同一个网络上那样简单方便, 因为上述的调用ARP 的复杂过程都是由计算机软件自动进行的, 对用户来说是透明的
一个ARP请求报文的实例
- MAC帧中:目的MAC为广播地址(全 1),源MAC为请求者的MAC地址,协议的类型是0x0806
- ARP请求报文中:Hardware type 位0x0001位以太帧;Protocal type 为0x0800; Hardware size 为6字节;Protocal size 为4 字节;请求类型为0x0001,ARP请求报文;目的MAC为空
对应的ARP应答报文实例
- MAC帧的地址,变成了单播的地址
- ARP应答报文中:请求类型变成了0x0002,为ARP响应报文。
- 源IP为应答节点的IP地址,源MAC为应答节点的MAC
- 目的IP ,MAC为请求者的IP和MAC
分组交付
- 路由:选择一条用于发送分组的路径的过程
- 路由器从路由表中找到下一个路由器的IP地址,然后将分组传给下一个路由器
- 路由选择的核心是路由选择算法,为生成路由表提供算法依据
路由选择算法
- 互联网中每一台路由器都保存一个路由表,存储可能的目的地址与如何到达目的地址的信息
- 路由器采用表驱动的路由选择算法,路由选择通过查表的方式进行
- 分组交付(forwarding):也成分组转发,互联网中主机、路由器转发IP分组的过程,即将分组从一个输入链路接口转移到正确的输出链路端口 (通过查 路由表)
- 直接交付:在一个物理网络上把数据报从一台主机直接传输到另一台主机
- 间接交付:当源主机和目的主机分别处于不同的物理网络上时,数据报由源主机通过中间的路由器把数据报间接地传输到目的主机
- 路由器根据分组的目的地址与源地址是否属于同一个网络,判断是直接交付还是间接交付
如图所示,有四个 A 类网络通过三个路由器连接在一起。 每一个网络上都可能有成千上万台主机
- 如果路由表指出到每一台主机应怎样转发,则所得出的路由表就会过于庞大
- 但若路由表指出到某个网络应如何转发, 则每个路由器中的路由表就只包含4个项目 (每个项目都对应一个网络)
- 总之, 在路由表中, 对每一条路由最主要的是以下两个信息
( 目 的 网 络 地 址 , 下 一 跳 地 址 ) (目的网络地址, 下一跳地址) (目的网络地址,下一跳地址)
一个实际的路由表还会有其他的一些信息。例如, 标志、参考计数、使用情况以及接口等
”标志” 可以设置多个字符以说明不同的意思。如 U U U 表示该路由是可用的, G G G 表示下一跳地址是一个路由器, 因而是间接交付(如不设置 G G G,则表示直接交付), H H H 表示该路由是到一台主机(如不设置 H H H,则表示该路由是到一个网络)
”参考计数” 是给出正在使用该路由的TCP连接数
”使用情况“ 显示出通过该路由的分组数
”接口” 是本地接口的名字, 指出分组应当从哪一个接口转发
于是, 我们就根据目的网络地址来确定下一跳路由器, 这样做可得出以下的结果
- IP 数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)
- 只有到达最后一个路由器时, 才试图向目的主机进行直接交付
虽然互联网所有的分组转发都是基于目的主机所在的网络, 但在大多数情况下都允许有这样的特例, 即对特定的目的主机指明一个路由。这种路由叫做特定主机路由
- 采用特定主机路由可使网络管理人员更方便地控制网络和测试网络, 同时也可在需要考虑某种安全问题时采用这种特定主机路由
- 在对网络的连接或路由表进行排错时, 指明到某一台主机的特殊路由就十分有用
路由器还可采用默认路由(default route)以减小路由表所占用的空间和搜索路由表所用的时间。主机在发送每一个IP 数据报时都要查找自己的路由表。如果一台主机连接在一个小网络上, 而这个网络只用一个路由器和互联网连接, 那么在这种情况下使用默认路由是非常合适的
- 例如, 在图4-17的互联网中, 连接在网络 N 1 N_1 N1 上的任何一台主机中的路由表只需要三个项目即可。第一个项目就是到本网络主机的路由, 其目的网络就是本网络 N 1 N_1 N1 , 因而不需要路由器转发,而是直接交付。第二个项目是到网络 N 2 N_2 N2 的路由, 对应的下一跳路由器是 R 2 R_2 R2。第三个项目就是默认路由。只要目的网络是其他网络(不是 N 1 N_1 N1 或 N 2 N_2 N2), 就一律选择默认路由, 把数据报先间接交付路由器 R 1 R_1 R1 , 让 R 1 R_1 R1 再转发给互联网中的下一个路由器, 一直转发到目的网络上的路由器, 最后进行直接交付
- 在实际上的路由器中, 像图4-17 路由表中所示的“直接” 和“ 其他” 的几个字符并没有出现在路由表中, 而是被记为 0.0.0.0 0.0.0.0 0.0.0.0
在 IP 数据报的首部写上的 IP 地址是源 IP 地址和目的 IP 地址, 而没有下一跳路由器的IP地址 。既然IP数据报中没有下一跳路由器的IP地址, 那么待转发的数据报又怎样能够找到下一跳路由器呢?
- 当路由器收到一个待转发的数据报, 在从路由表得出下一跳路由器的 IP 地址后, 不是把这个地址填入 IP 数据报, 而是送交数据链路层的网络接口软件。网络接口软件负责把下一跳路由器的 IP 地址转换成硬件地址(必须使用ARP), 并将此硬件地址放在链路层的 MAC 帧的首部, 然后根据这个硬件地址找到下一跳路由器。由此可见, 当发送一连串的数据报时, 上述的这种查找路由表、用ARP 得到硬件地址、把硬件地址写入 MAC 帧的首部等过程, 将不断地重复进行, 造成了一定的开销
根据以上所述, 可归纳出分组转发算法如下:
(1) 从数据报的首部提取目的主机的 IP 地址
D
D
D,得出目的网络地址为
N
N
N
(2) 若
N
N
N 就是与此路由器直接相连的某个网络地址, 则进行直接交付, 直接把数据报交付目的主机(这里包括把目的主机地址
D
D
D 转换为具体的硬件地址, 把数据报封装为MAC帧, 再发送此帧);否则就是间接交付, 执行(3)
(3) 若路由表中有目的地址为
D
D
D 的特定主机路由, 则把数据报传送给路由表中所指明的下一跳路由器;否则, 执行(4)
(4) 若路由表中有到达网络
N
N
N 的路由, 则把数据报传送给路由表中所指明的下一跳路由器;否则, 执行(5)
(5) 若路由表中有一个默认路由, 则把数据报传送给路由表中所指明的默认路由器;否则, 执行(6)
(6) 报告转发分组出错
路由表并没有给分组指明到某个网络的完整路径,而是指出, 到某个网络应当先到某个路由器(即下一跳路由器), 在到达下一跳路由器后, 再继续查找其路由表, 知道再下一步应当到哪一个路由器。这样一步一步地查找下去, 直到最后到达目的网络
使用子网划分后, 路由表必须包含以下三项内容: 目的网络地址、子网掩码和下一跳地址。路由器转发分组的算法如下:
(1) 从收到的数据报的首部提取目的 IP 地址
D
D
D
(2) 先判断是否为直接交付。对路由器直接相连的网络逐个进行检查: 用各网络的子网掩码和
D
D
D 逐位相” 与", 看结果是否和相应的网络地址匹配。若匹配, 则把分组进行直接交付(当然还需要把
D
D
D 转换成物理地址, 把数据报封装成帧发送出去), 转发任务结束。否则就是间接交付, 执行(3)
(3) 若路由表中有目的地址为
D
D
D 的特定主机路由, 则把数据报传送给路由表中所指明的下一跳路由器;否则, 执行(4)
(4) 对路由表中的每一行(目的网络地址, 子网掩码, 下一跳地址), 用其中的子网掩码和
D
D
D 逐位相” 与", 其结果为
N
N
N。若
N
N
N 与该行的目的网络地址匹配, 则把数据报传送给该行指明的下一跳路由器;否则, 执行(5)
(5) 若路由表中有一个默认路由, 则把数据报传送给路由表中所指明的默认路由器;否则, 执行(6)
(6) 报告转发分组出错
例
如下图所示,源主机
H
1
H_1
H1 向目的主机
H
2
H_2
H2 发送分组。试讨论
R
1
R_1
R1 收到
H
1
H_1
H1 向
H
2
H_2
H2 发送的分组后查找路由表的过程
解
源主机
H
1
H_1
H1 向目的主机
H
2
H_2
H2 发送的分组的目的地址是
H
2
H_2
H2 的 IP 地址 128.30.33.138。源主机
H
1
H_1
H1 首先要判断: 发送的这个分组, 是在本子网上进行直接交付还是要通过本子网上的路由器进行间接交付?源主机
H
1
H_1
H1 把本子网的 子网掩码 255.255.255.128 与目的主机
H
2
H_2
H2 的 IP 地址128.30.33.138 逐位相”与“ ,得出128.30.33.128, 它不等于
H
1
H_1
H1 的网络地址 128.30.33.0。这说明
H
2
H_2
H2 与
H
1
H_1
H1 不在同一个子网上。因此
H
1
H_1
H1 不能把分组直接交付
H
2
H_2
H2 , 而必须交给子网上的默认路由器
R
1
R_1
R1 , 由
R
1
R_1
R1 来转发。路由器
R
1
R_1
R1 在收到一个分组后,就在其路由表中逐行寻找有无匹配的网络地址。先看
R
1
R_1
R1 路由表中的第一行。用这一行的“子网掩码255.255.255.128"和收到的分组的“ 目的地址128.30.33.138"逐位相” 与“, 得出128.30.33.128。然后和这一行给出的目的网络地址128.30.33.0进行比较。但比较的结果不一致。用同样方法继续往下找第二行。用第二行的“子网掩码255.255.255.128 “和该分组的“目的地址128.30.33.138” 逐位相” 与“ , 结果也是128.30.33.128。这个结果和第二行的目的网络地址128.30.33.128相匹配, 说明这个网络(子网2)就是收到的分组所要寻找的目的网络。于是
R
1
R_1
R1 把分组从接口1 直接交付主机
H
2
H_2
H2
显示本地计算机上的路由表
route print
# 或
netstat -r
通常情况下,网络目的地址范围包含以下四种:
- 主机地址:某个特定主机的网络地址,网络掩码为255.255.255.255,如上表中的6、7、9;
- 子网地址:某个特定子网的网络地址,如上表中的4、5;
- 网络地址:某个特定网络的网络地址,如上表中的2、3、8;
- 默认路由:所有未在路由表中指定的网络地址,如上表中的1。
网际控制报文协议 ICMP
为了更有效地转发IP数据报和提高交付成功的机会, 在网际层使用了网际控制报文协议 ICMP (Internet Control Message Protocol)
- ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告
- ICMP 设计的初衷是IP协议在执行过程中的出错报告。它不能纠正差错,只是报告差错,差错处理需要由高层协议完成
- ICMP 是互联网的标准协议。但 ICMP 不是高层协议(看起来好像是高层协议, 因为ICMP 报文是装在 IP 数据报中, 作为其中的数据部分),而是IP层的协议。ICMP报文作为IP 层数据报的数据, 加上数据报的首部, 组成IP数据报发送出去
- ICMP 差错报告采用路由器—源主机的模式,路由器在发现数据报传输出现错误时只向源主机报告差错原因
ICMP 报文的种类
ICMP报文的种类有两种, 即 ICMP 差错报告报文 和 ICMP 询问报文
ICMP差错报告报文
- 终点不可达:当路由器或主机不能交付数据报时就向源点发送终点不可达报文
- 时间超过:当路由器收到生存时间为零的数据报 或者 出现死锁(接收的分片不能组装成分组(还有一些分片始终没有送达),占用了大量缓冲区,分片计时器超时) 时, 除丢弃该数据报外, 还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时, 就把已收到的数据报片都丢弃, 并向源点发送时间超过报文
- 参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报, 并向源点发送参数问题报文
- 改变路由(重定向):路由器把改变路由报文发送给主机, 让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)
- 在互联网的主机中也要有一个路由表。当主机要发送数据报时, 首先是查找主机自己的路由表, 看应当从哪一个接口把数据报发送出去。在互联网中主机的数量远大于路由器的数量, 出于效率的考虑, 这些主机不和连接在网络上的路由器定期交换路由信息。在主机刚开始工作时, 一般都在路由表中设置一个默认路由器的IP地址。不管数据报要发送到哪个目的地址, 都一律先把数据报传送给这个默认路由器, 而这个默认路由器知道到每一个目的网络的最佳路由(通过和其他路由器交换路由信息)。如果默认路由器发现主机发往某个目的地址的数据报的最佳路由应当经过网络上的另一个路由器 R R R 时, 就用改变路由报文把这情况告诉主机。于是, 该主机就在其路由表中增加一个项目: 到某某目的地址应经过路由器 R R R (而不是默认路由器)
下面是不应发送 ICMP 差错报告报文的几种情况:
- 对ICMP 差错报告报文, 不再发送 ICMP 差错报告报文
- 对第一个分片的数据报片的所有后续数据报片, 都不发送 ICMP 差错报告报文 (出错时只发送一个分片的错误)
- 对具有多播地址的数据报, 都不发送 ICMP 差错报告报文
- 对具有特殊地址(如 127.0.0.0 或 0.0.0.0 ) 的数据报, 不发送 ICMP 差错报告报文
ICMP 询问报文:设计 ICMP 查询报文的目的是实现对网络的故障诊断与控制;在 ICMP 查询报文中,一个结点发送出信息请求报文,由目的结点用特定的格式进行应答;
- 回送请求和回答:ICMP 回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态
- 时间戳请求和回答:ICMP时间戳请求报文是请某台主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段, 其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用于时钟同步和时间测量
ICMP差错报告报文是单向的,ICMP查询报文是双向的、成对出现
- 代码字段是为了进一步区分某种类型中的几种不同情况
- 检验和字段用来检验整个ICMP 报文 (IP数据报首部的检验和并不检验IP数据报的内容, 因此不能保证经过传输的ICMP报文不产生差错)
- 数据部分:
- 如下图所示,所有的 ICMP 差错报告报文中的数据字段都具有同样的格式。把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来, 作为ICMP报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节, 就构成了ICMP差错报告报文。提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(对于TCP和UDP) 以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的。整个ICMP报文作为IP数据报的数据字段发送给源点
- 如下图所示,所有的 ICMP 差错报告报文中的数据字段都具有同样的格式。把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来, 作为ICMP报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节, 就构成了ICMP差错报告报文。提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(对于TCP和UDP) 以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的。整个ICMP报文作为IP数据报的数据字段发送给源点
分组网间探测 ping
Packet lnterNet Groper
- PING使用了ICMP回送请求与回送回答报文来测试两台主机之间的连通性
- PING是应用层直接使用网络层ICMP的一个例子。它没有通过运输层的TCP或UDP
如图所示:
- PC一连发出四个 ICMP 回送请求报文
- 如果目标网站正常工作而且响应这个 ICMP 回送请求报文(有的主机为了防止恶意攻击就不理睬外界发送过来的这种报文), 那么它就发回 ICMP 回送回答报文
- 由于往返的 ICMP 报文上都有时间戳, 因此很容易得出往返时间。最后显示出的是统计结果: 发送到哪个机器 (ip地址), 发送的、收到的和丢失的分组数(但不给出分组丢失的原因), 以及往返时间的最小值、最大值和平均值
traceroute
(Unix) / tracert
(Win)
- Traceroute 从源主机向目的主机发送一连串的 IP 数据报, 数据报中封装的是无法交付的 UDP 用户数据报(使用了非法的端口号)
- 第一个数据报 P 1 P_1 P1 的生存时间 TTL 设置为 1。当 P 1 P_1 P1 到达路径上的第一个路由器 R 1 R_1 R1 时, 路由器 R 1 R_1 R1 先收下它, 接着把 TTL 的值减 1。由于 TTL 等于零了, R 1 R_1 R1 就把 P 1 P_1 P1 丢弃了, 并向源主机发送一个 ICMP 时间超过差错报告报文
- 源主机接着发送第二个数据报 P 2 P_2 P2, 并把 TTL 设置为 2。 P 2 P_2 P2 先到达路由器 R 1 R_1 R1 , R 1 R_1 R1 收下后把 TTL 减 1 再转发给路由器 R 2 R_2 R2。 R 2 R_2 R2 收到 P 2 P_2 P2 时 TTL 为 1 , 但减 1 后 TTL 变为零了。 R 2 R_2 R2 就丢弃 P 2 P_2 P2, 并向源主机发送一个 ICMP 时间超过差错报告报文。这样一直继续下去
- 当最后一个数据报刚刚到达目的主机时, 数据报的 TTL 是 1。主机不转发数据报, 也不把 TTL 值减 1。但因 IP 数据报中封装的是无法交付的运输层的UDP用户数据报, 因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文
- 这样, 源主机达到了自己的目的, 因为这些路由器和最后目的主机发来的ICMP 报文正好给出了源主机想知道的路由信息到达目的主机所经过的路由器的 IP 地址, 以及到达其中的每一个路由器的往返时间
如下图所示,
- 每一行有三个时间出现, 是因为对应每一个 TTL 值, 源主机要发送三次同样的 IP 数据报
- 我们还应注意到, 从原则上讲, IP 数据报经过的路由器越多, 所花费的时间也会越多。但从图中可看出, 有时正好相反。这是因为互联网的拥塞程度随时都在变化, 也很难预料到。因此, 完全有这样的可能:经过更多的路由器反而花费更少的时间
- 第一行中的 10.6.0.1 正是我现在主机的默认路由地址
路由选择协议
路由选择是个非常复杂的问题:
- 因为它是网络中的所有结点共同协调工作的结果
- 其次, 路由选择的环境往往是不断变化的, 而这种变化有时无法事先知道
- 例如,网络中出了某些故障。此外, 当网络发生拥塞时, 就特别需要有能缓解这种拥塞的路由选择策略,但恰好在这种条件下, 很难从网络中的各结点获得所需的路由选择信息
- 路由选择算法,确定一条从源结点到目的结点的传输路径的方法。目标是产生一个路由表 (表驱动的路由选择算法),为路由器转发IP分组找出适当的下一跳路由器
- 路由选择协议 ,是通信协议,是对路由选择算法的实现。目标是实现路由表中路由信息的动态更新
- 路由选择算法是路由选择协议的核心,特定的路由选择协议总与特定路由选择算法相关联
静态路由选择算法 (非自适应路由选择算法)
- 简单且开销较小,但不能及时适应网络状态的变化 (网络结构发生变化时,路由表无法自动更新)
- 路由表由人工建立,网管人员将每个目的地址的路径输入;一般只用在小型的、结构不会经常改变的局域网系统中,或者是故障查找的试验网络中
动态路由选择算法 (自适应路由选择算法)
- 能较好地适应网络状态的变化,但实现起来较为复杂, 开销也比较大
- 大型互联网络通常采用动态路由表;在网络系统运行时,系统自动运行动态路由选择协议,建立路由表;当互联网结构变化时,动态路由选择协议就会自动更新所有路由器中的路由表
- 不同规模的网络需选择不同的动态路由选择协议
- 全局路由算法:用完整的、全局性的网络知识来计算从源节点到目的节点之间的“最佳”路径。算法以所有节点之间的连通性及所有链路的信息为输入
- 分布式路由算法:以迭代的、分布式的方式计算出“最佳” 路径。没有节点拥有关于所有网络链路的完整信息,每个节点仅有与其直接相连链路的信息就可工作
分层次的路由选择协议
互联网采用的路由选择协议主要是自适应的(即动态的)、分布式路由选择协议。由于以下两个原因, 互联网采用分层次的路由选择协议:
- 互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达, 则这种路由表将非常大, 处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使互联网的通信链路饱和
- 许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议, 但同时还希望连接到互联网上
为此, 可以把整个互联网划分为许多较小的 自治系统 A S AS AS (autonomous system )
- A S AS AS 是在单一技术管理下的一组路由器, 而这些路由器使用一种自治系统内部的路由选择协议和共同的度量。一个 A S AS AS 对其他 A S AS AS 表现出的是一个单一的和一致的路由选择策略
- 在目前的互联网中, 一个大的 ISP 就是一个自治系统。这样, 互联网就把路由选择协议划分为两大类, 即:
- 内部网关协议 IGP (Interior Gateway Protocol) 即在一个自治系统内部使用的路由选择协议。目前这类路由选择协议使用得最多, 如 RIP 和 OSPF 协议
- 外部网关协议 EGP (External Gateway Protocol) 若源主机和目的主机处在不同的自治系统中(这两个自治系统可能使用不同的内部网关协议), 当数据报传到一个自治系统的边界时, 就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议 EGP。目前使用最多的外部网关协议是 BGP 的版本4 (BGP-4)
- 自治系统之间的路由选择也叫做域间路由选择(interdomain routing), 而在自治系统内部的路由选择叫做域内路由选择(intradomain routing)
- 每个自治系统自己决定在本自治系统内部运行哪一个内部路由选择协议(RIP / OSPF)
- 每个自治系统都有一个或多个路由器(图中的路由器 R 1 R_1 R1 和 R 2 R_2 R2) 除运行本系统的内部路由选择协议外, 还要运行自治系统间的路由选择协议 (BGP-4)
路由信息协议 RIP
Routing Information Protocol
最短路由
- RIP 是一种分布式的基于距离向量的路由选择协议, 其最大优点就是简单。路由信息协议在向量-距离(V-D) 路由选择算法的基础上,规定了路由信息交互格式、错误处理方式,设置了周期更新定时器、延迟定时器、超时定时器与清除定时器等 (定时器用来定期交换路由信息)
- RIP 要求网络中的每一个路由器都要维护从它自已到其他每一个目的网络的距离记录(因此, 这是一组距离, 即“ 距离向量" )
- RIP 将 “距离” 定义如下:
- 从一路由器到直接连接的网络的距离定义为 1
- 从一路由器到非直接连接的网络的距离定义为所经过的路由器数加 1
- RIP 的 “距离” 也称为 “跳数" (hop count), 因为每经过一个路由器, 跳数就加 1。RIP 认为好的路由就是它通过的路由器的数目少, 即“ 距离短"。RIP 最终会选择一条具有最少路由器的路由(即最短路由), 哪怕还存在另一条高速(低时延)但路由器较多的路由
- RIP 允许一条路径最多只能包含 15 个路由器。因此 “ 距离” 等于 16 时即相当于不可达。可见 RIP 只适用于小型互联网
分布式路由选择协议
- 分布式路由选择协议的共同特点就是每一个路由器都要不断地和其他一些路由器交换路由信息
RIP 协议的特点是:
- 仅和相邻路由器交换信息。如果两个路由器之间的通信不需要经过另一个路由器,那么这两个路由器就是相邻的
- 路由器交换的信息是当前本路由器的路由表。路由表中的信息为:到本自治系统中所有网络的(最短) 距离, 以及到每个网络应经过的下一跳路由器
- 按固定的时间间隔交换路由信息, 然后路由器根据收到的路由信息更新路由表。当网络拓扑发生变化时, 路由器也及时向相邻路由器通告拓扑变化后的路由信息
路由表的建立 (距离向量算法)
- 路由器在刚刚开始工作时, 它的路由表是空的。然后路由器就得出到直接相连的几个网络的距离(这些距离定义为1)。接着, 每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。但经过若干次的更新后, 所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址
- 事实证明, 通过这样的方式,最后在自治系统中所有的结点都得到了正确的路由选择信息。在一般情况下, RIP 协议可以较快地收敛
距离向量算法
- 路由表中最主要的信息就是:到某个网络的距离(即最短距离), 以及应经过的下一跳地址。路由表更新的原则是找出到每个目的网络的最短距离。这种更新算法又称为距离向量算法
(主要思想:设 X X X 是结点 A A A 到 B B B 的最短路径上的一个结点。若把路径 A − B A-B A−B 拆成两段路径 A − X A-X A−X 和 X − B X-B X−B, 则每一段路径 A − X A-X A−X 和 X − B X-B X−B 也都分别是结点 A A A 到 X X X 和结点 X X X 到 B B B 的最短路径)
具体操作如下: 对每一个相邻路由器发送过来的 RIP 报文, 进行以下步骤:
- 对地址为
X
X
X 的相邻路由器发来的 RIP 报文,报文中的每一个项目都有三个关键数据, 即:到目的网络
N
N
N, 距离是
d
d
d, 下一跳路由器是
Y
Y
Y。先修改此报文中的所有项目:把 “下一跳” 字段中的地址都改为
X
X
X, 并把所有的 距离 字段的值加 1
(这样做是为了便于进行本路由表的更新。假设从位于地址 X X X 的相邻路由器发来的 RIP 报文的某一个项目是:" N e t 2 , 3 , Y Net\ 2,3,Y Net 2,3,Y", 表示“ 我经过路由器 Y Y Y 到网络 N e t 2 Net2 Net2 的距离是 3" 。那么本路由器就可推断出:“ 我经过 X X X 到网络 N e t 2 Net2 Net2 的距离应为 3 + 1 = 4 3+ 1 = 4 3+1=4"。于是, 本路由器就把收到的 RIP 报文的这一个项目修改为 “ N e t 2 , 4 , X Net\ 2,4, X Net 2,4,X”, 作为下一步和路由表中原有项目进行比较时使用 - 对修改后的 RIP 报文中的每一个项目, 进行以下步骤:
- 若原来的路由表中没有目的网络 N N N, 则把该项目添加到路由表中(表明这是新的目的网络, 应当加入到路由表中)
- 否则就再查看下一跳路由器地址
- 若下一跳路由器地址是 X X X, 则把收到的项目替换原路由表中的项目(这是最新的消息, 要以最新的消息为准,因此需要替换。到目的网络的距离有可能增大或减小, 但也可能没有改变。例如, 不管原来路由表中的项目是 “ N e t 2 , 3 , X Net\ 2,3,X Net 2,3,X” 还是 “ N e t 2 , 5 , X Net\ 2 , 5,X Net 2,5,X”, 都要更新为现在的 “ N e t 2 , 4 , X Net\ 2, 4, X Net 2,4,X”)
- 否则(即这个项目是:到目的网络
N
N
N, 但下一跳路由器不是
X
X
X)
- 若收到的项目中的距离 d d d 小于路由表中的距离, 则进行更新(例如, 若路由表中已有项目 “ N e t 2 , 5 , P Net\ 2, 5, P Net 2,5,P”, 就要更新为 “ N e t 2 , 4 , X Net\ 2 ,4, X Net 2,4,X”。因为到网络 N e t 2 Net2 Net2 的距离原来是5, 现在减到4, 更短了), 否则什么也不做
- 若 3 分钟还没有收到相邻路由器的更新路由表, 则把此相邻路由器记为不可达的路由器, 即把距离置为 16
- 返回
RIP 路由表建立实例
RIP 协议的报文格式
- RIP 协议使用运输层的用户数据报 UDP 进行传送(使用 UDP 的端口 520)。因此 RIP 是一个应用层协议
- RIP 报文由 首部 和 路由部分 组成。
- RIP 的首部占 4 个字节
- 命令字段指出报文的意义。例如,1 表示请求路由信息(路由器刚连入网络时发送请求路由信息,这样相邻的路由器就会发给它路由表), 2 表示对请求路由信息的响应或未被请求而发出的路由更新报文 (定时更新)
- 首部后面的 “必为0" 是为了4字节字的对齐
- 路由部分由若干个路由信息组成。每个路由信息需要用 20 个字节
- 地址族标识符(又称为地址类别) 字段用来标志所使用的地址协议 (2表示IP协议)
- 路由标记填入自治系统号 ASN (Autonomous System Number) , 这是考虑使 RIP 有可能收到本自治系统以外的路由选择信息
- 再后面指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离
- 一个 RIP 报文最多可包括 25 个路由, 因而 RIP 报文的最大长度是 4 + 20 × 25 = 504 4 + 20 \times 25 = 504 4+20×25=504 字节。如超过, 必须再用一个 RIP 报文来传送
RIP 协议的优缺点
- RIP 协议最大的优点就是实现简单,开销较小
- RIP 限制了网络的规模,它能使用的最大距离为 15 (16 表示不可达)
- 路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加
- RIP 存在的一个问题是当网络出现故障时,要经过较长时间才能将此信息传送到所有路由器。下面举例进行说明
现在假设定 R 1 R_1 R1 到网1的链路出了故障,于是 R 1 R_1 R1 把到网1的距离改为16 (表示到网1不可达)
但是, 很可能要经过30秒钟后 R 1 R_1 R1 把更新信息发送给 R 2 R_2 R2 。然而 R 2 R_2 R2 可能已经先把自己的路由表发送给了 R 1 R_1 R1 , 其中有 1 , 2 , R 1 1,2,R_1 1,2,R1 这一项。 R 1 R_1 R1 收到 R 2 R_2 R2 的更新报文后, 误认为可经过 R 2 R_2 R2 到达网1,于是更新自己的路由信息为: 1 , 3 , R 2 1, 3, R_2 1,3,R2 ,并把更新后的信息发送给 R 2 R_2 R2。同理, R 2 R_2 R2 接着又更新自己的路由表。这样的更新一直继续下去, 直到 R 1 R_1 R1 和 R 2 R_2 R2 到网1的距离都增大到16时, R 1 R_1 R1 和 R 2 R_2 R2 才知道网1是不可达的。RIP 协议的这一特点叫做:好消息传得快, 而坏消息传得慢
开放最短路径优先(OSPF)协议
Open Shortest Path First
- “最短路径优先” :使用了 Dijkstra 算法
- 基于链路状态路由算法,分布式的路由选择协议,能够适应较大规模的自治系统
OSPF协议的三个要点
- 使用洪泛法(Flooding)向本自治系统中所有路由器发送信息
- 要求接收到信息的路由器转发至所有相邻路由器,这样,最终整个区域中所有的路由器都得到了这个信息的一个副本
- 发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息
- “链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric) (费用、距离、时延、带宽…)
- 只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息
对比一下,RIP 协议是向部分路由器发送本路由器知道的全部信息,且在固定时间间隔更新路由信息;而 OSPF 协议则是向全部路由器发送本路由器知道的部分信息,且只有当链路状态变化时才更新路由信息
链路状态数据库 (link-state database)
- 由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库
- 这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)
- 每个路由器使用链路状态数据库中的数据构造自己的路由表 (例如,使用 Dijkstra 算法计算单源最短路径,当有两条相同代价的路径时,还能将通信量分配给这几条路径)
- OSPF 的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表,且更新过程收敛快
OSPF 的区域 (area)
- 为了使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干个更小的范围,叫作区域
- 每一个区域都有一个 32 位的区域标识符(用点分十进制表示)
- 区域也不能太大,在一个区域内的路由器最好不超过200 个
上图中的主干区域中其实没有网络,只有路由器
- 划分区域的好处就是将利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量
- 在一个区域内部的路由器只知道本区域的完整网络拓扑
- 为了使每一个区域能够和本区域以外的区域进行通信, OSPF 使用层次结构的区域划分。在上层的区域叫做主干区域(backbone area)。主干区域的标识符规定为 0.0.0.0 0.0.0.0 0.0.0.0。主干区域的作用是用来连通其他在下层的区域
- 从其他区域来的信息都由区域边界路由器(area border router)进行概括 (图中的 R 3 ∼ R 7 R_3\sim R_7 R3∼R7), 而显然, 每一个区域至少应当有一个区域边界路由器
- 在主干区域内的路由器叫做主干路由器(backbone router) (图中的 R 3 , R 4 , R 7 R_3,R_4,R_7 R3,R4,R7)。一个主干路由器可以同时是区域边界路由器
- 在主干区域内还要有一个路由器专门和本自治系统外的其他自治系统交换路由信息。这样的路由器叫做自治系统边界路由器 (图中的 R 6 R_6 R6)
- OSPF 直接用 IP 数据报传送。因此 OSPF 的位置在网络层,是一个网络层协议
- OSPF 构成的数据报很短。这样做可减少路由信息的通信量
- 所有在 OSPF 路由器之间交换的分组都具有鉴别的功能(支持各种不同鉴别机制,如简单口令验证,MD5加密验证等)
- 支持可变长度的子网划分和无分类编址 CIDR
- 每一个链路状态都带上一个 32 位的序号,序号越大状态就越新
OSPF 报文格式
- 路由器标识符:发送该报文的路由器接口的 IP 地址
- 类型:
- 类型1, 问候(Hello)分组, 用来发现和维持邻站的可达性
OSPF规定, 每两个相邻路由器每隔10秒钟要交换一次问候分组。这样就能确知哪些邻站是可达的 - 类型2, 数据库描述(Database Description)分组, 路由器用数据库描述分组和相邻路由器交换本数据库中已有的链路状态摘要信息
- 类型3, 链路状态请求(Link State Request)分组,经过与相邻路由器交换数据库描述分组后, 路由器就使用链路状态请求分组, 向对方请求发送自己所缺少的某些链路状态项目的详细信息,通过一系列这样的交换分组,全网同步的链路数据库就建立了
- 类型4, 链路状态更新(Link State Update)分组,网络运行过程中,只要一个路由器的链路状态发生变化,该路由器就使用链路状态更新分组, 用洪泛法对全网更新链路状态
- 类型5, 链路状态确认(Link State Acknowledgment)分组, 对链路更新分组的确认
- 类型1, 问候(Hello)分组, 用来发现和维持邻站的可达性
可靠的洪泛法
- 转发时排除上游路由器
- 收到更新分组后要发送确认
- 重复分组只需确认一次
OSPF 的其他特点
- OSPF 规定每隔一段时间,如 30 分钟,要刷新一次数据库中的链路状态
- 由于一个路由器的链路状态只涉及到与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此当互联网规模很大时,OSPF 协议要比距离向量协议 RIP 好得多
- OSPF 没有“坏消息传播得慢”的问题,据统计,其响应网络变化的时间小于 100 ms
边界网关协议 (BGP)
- 边界网关协议 BGP 是不同自治系统的路由器之间交换路由信息的协议
- BGP采用了基于路径-向量(path vector)的路由选择协议,不寻求最佳路由,只关注“可达性”:
- 因特网的规模太大,使得自治系统之间路由选择非常困难
- 自治系统之间的路由选择必须考虑有关策略。如政治、安全、经济
- 各自治系统标准不一致
BGP 发言人
- 每一个自治系统的管理员要选择至少一个路由器(一般是BGP 边界路由器)作为该自治系统的 “BGP 发言人”
- 一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息
- 交换路由信息的两个 BGP 发言人,彼此成为对方的邻站或对等站
- BGP发言人既要运行自治系统的内部网关协议,又要运行BGP协议
- BGP 所交换的网络可达性的信息就是到达某个网络所要经过的自治系统的序列
- 当 BGP 发言人互相交换了网络可达性的信息后,各 BGP 发言人就根据所采用的策略从收到的路由信息中找出到达各 AS 的较好路由 (树形结构,不存在回路)
- 在BGP 刚刚运行时,BGP 的邻站是交换整个的 BGP 路由表。但以后只需要在发生变化时更新有变化的部分,不必周期性更新
- BGP 支持 CIDR,因此 BGP 路由表的内容:网络前缀、下一跳路由器、到达该网络所要经过的自治系统序列
- BGP 协议交换路由信息的结点数量级是自治系统数的量级,这要比这些自治系统中的网络数少很多
- 每一个自治系统中 BGP 发言人(或边界路由器)的数目是很少的。这样就使得自治系统之间的路由选择不致过分复杂
- BGP 用 TCP 协议交换路由信息,因此是应用层协议
BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话(session),利用 BGP 会话交换路由信息 - 使用 TCP 连接能提供可靠的服务,也简化了路由选择协议
BGP-4 共使用四种报文
- 打开(Open)报文,用来与相邻的另一个BGP发言人建立关系
- 更新(Update)报文,用来发送某一路由的信息,以及列出要撤消的多条路由
- 保活(Keepalive)报文,用来确认打开报文和周期性地证实邻站关系
- 通知(Notificaton)报文,用来发送检测到的差错
路由器功能、结构与工作原理
路由器功能
- 建立并维护路由表
• 内部有路由表数据库与网络路由状态数据库
• 路由器定期更新路由表 - 提供网络间的分组转发功能
• 当分组进入时,检查其源地址与目的地址
• 根据路由表数据库的相关信息,决定分组传送路径
路由器的结构与工作原理
- 路由器由“路由选择部分” 和“分组转发部分” 构成。
- 路由选择部分是控制部分,其核心构件是路由选择处理机
路由选择处理机的任务是根据所选定的路由选择算法构造路由表,同时与相邻路由器交换路由信息,更新和维护路由表 - 分组处理与交换部分主要包括:交换结构、一组输入端口和一组输出端口;
- 交换结构根据 转发表(根据路由表形成)对分组进行处理,将输入端口进入的分组从合适的输出端口转发出去(如果接收的分组是交换的路由信息的RIP或OSPF分组,则将其送交路由选择处理器)
- 路由器每个输入和输出端口中各有三个模块,对应于物理层、数据链路层和网络层,进行数据的拆包、封装
转发表与路由表
- 转发即路由器根据转发表把收到的IP数据报从路由器合适的端口转发出去,仅仅涉及到一个路由器
- 路由选择涉及到很多路由器,路由表是许多路由器协同工作的结果
- 转发表直接作用于数据包,通过路由表生成,用来描述主机方面的信息,在主机内部将一个数据包从一个端口导向另一端口;因此,转发表的每一行必须包含从要到达的目的网络到输出端口和某些MAC 地址信息(如下一跳的以太网地址) 的映射
- 而路由表描述网络信息,将数据包从一个机器导向另一机器
转发分组的速率
- 最理想的状况是路由器分组处理速率等于输入端口的线路传送速率,称为线速 (单位:Mpps 百万分组每秒)
排队队列
- 当一个分组到达一个输入端口时需要在输入队列中排队等待处理
- 路由器输出端口设有缓存,存储等待转发的输出分组队列
- 只要路由器的接收分组速率、处理分组速率、输出分组速率小于线速,无论是输入端口、处理分组过程与输出端口都会出现排队等待,产生分组转发延时,严重时会由于队列长度不够而溢出,造成分组丢失
交换结构
- 负责把分组从一个输入端口转移到某个合适的输出端口
- 存储器方式通过软件进行交换传输,速度较慢
- 总线方式则会产生冲突,因此还需要额外的协议
- 互连网络有 2 N 2N 2N 条总线,可以使 N N N 个输入端口和 N N N 个输出端口相连
IP 多播 (multicast)
也可叫做 组播
基本概念
- 有许多应用需要由一个源点发送到多个终点, 即一对多的通信
- 例如, 实时信息的交付(如新闻、股市行情等), 交互式会议等
- 与单播相比, 在一对多的通信中, 多播可大大节约网络资源
- 视频服务器用单播方式向90台主机传送同样的视频节目。为此, 需要发送90个单播, 即同一个视频分组要发送90个副本
- 视频服务器用多播方式向属于同一个多播组的90 个成员传送节目。这时, 视频服务器只需把视频分组当作多播数据报来发送, 并且只需发送一次。路由器 R 1 R_1 R1 在转发分组时, 需要把收到的分组复制成3个副本, 分别向 R 2 , R 3 R_2,R_3 R2,R3 和 R 4 R_4 R4 各转发1个副本。当分组到达目的局域网时, 由于局域网具有硬件多播功能, 因此不需要复制分组,在局域网上的多播组成员都能收到这个视频分组
- 当多播组的主机数很大时(如成千上万个), 采用多播方式就可明显地减轻网络中各种资源的消耗
- 在互联网上进行多播就叫做IP多播。IP多播可以分为两种:
- 一种是只在本局域网上进行硬件多播 (Hardware/Ethernet multicast) (使用 MAC 地址进行多播)
- 另一种则是在互联网的范围进行多播 (IP Multicast) (使用多播数据报进行多播)
- 在互联网上进行多播的最后阶段, 还是要把多播数据报在局域网上用硬件多播交付多播组的所有成员,因此就要涉及到 “Mapping IP Multicast to Ethernet Multicast”
在互联网的范围进行多播
IP Multicast
在互联网中每一台主机必须有一个全球唯一的 IP 地址。如果某台主机现在想接收某个特定多播组的分组, 那么怎样才能使这个多播数据报传送到这台主机?
- 使用多播 IP 地址
- 显然, 这个多播数据报的目的地址一定不能写入这台主机的 IP 地址。这是因为在同一时间可能有成千上万台主机加入到同一个多播组。多播数据报不可能在其首部写入这样多的主机的IP地址。在多播数据报的目的地址写入的是多播组的标识符, 然后设法让加入到这个多播组的主机的 IP 地址与多播组的标识符关联起来
- 其实多播组的标识符就是 IP 地址中的 D 类地址。我们用每一个 D 类地址标志一个多播组 (组地址)。这样, D 类地址共可标志 2 28 2^{28} 228 个多播组
- 多播数据报和一般的 IP 数据报的区别就是它使用 D 类 IP 地址作为目的地址, 并且首部中的协议字段值是 2, 表明使用网际组管理协议 IGMP
- 显然, 多播地址只能用于目的地址, 而不能用于源地址。此外, 对多播数据报不产生 ICMP 差错报文。 因此, 若在 PING 命令后面键入多播地址, 将永远不会收到响应
在局域网上进行硬件多播
Hardware/Ethernet multicast
IEEE 规定的 MAC 多播地址范围
- 类似 IP 多播地址,MAC 多播地址也不是直接指定所有目的主机的 MAC 地址,而是使用一个特定的地址范围
- 互联网号码指派管理局 IANA 拥有的以太网地址块的高24位为 00 00 00- 00 00 00- 5 E 5E 5E (这部分MAC地址是保留的), 即 00 00 00- 00 00 00- 5 E 5E 5E- 00 00 00- 00 00 00- 00 00 00 到 00 00 00- 00 00 00- 5 E 5E 5E- F F FF FF- F F FF FF- F F FF FF
- 又因为以太网硬件地址字段中的第 1 字节的最低位为 1 时即为多播地址, 并且 IAAN 分配一半地址空间用于多播。 因此以太网多播地址的范围是
- 01 01 01- 00 00 00- 5 E 5E 5E- 00 00 00- 00 00 00- 00 00 00 到 01 01 01- 00 00 00- 5 E 5E 5E- 7 F 7F 7F- F F FF FF- F F FF FF
- 有了规定的多播 MAC 地址范围,网卡在接收到目的地址为该范围的数据帧时,就能识别出该数据帧用于多播,进而交由网络层进行处理
- 不难看出, 在每一个地址中, 只有 23 位可用作多播。这只能和 D 类 IP 地址中的 23 位有一一对应的关系。 D 类 IP 地址可供分配的有28位,可见在这28位中的前5位不能用来构成以太网硬件地址
- 例如,IP 多播地址 224.128.64.32 (即 E0-80-40-20 )和另一个 IP 多播地址 224.0.64.32 (即 E0-00-40-20 )转换成以太网的硬件多播地址都是 01-00-5E-00-40-20
- 由于多播 IP 地址与以太网硬件地址的映射关系不是唯一的, 因此收到多播数据报的主机, 还要在 IP 层利用软件进行过滤, 把不是本主机要接收的数据报丢弃
IGMP
IGMP: Internet Group Management Protocol
- IGMP 使用 IP 数据报传递其报文,但它属于 IP 层协议 (它向 IP 提供服务)
- IGMP 协议并不能对全网范围内的所有多播组成员进行管理,多播路由器与直接连接的成员主机的通信中使用 IGMP 协议获取成员的动态信息
IGMP 的工作可分为两个阶段
- 第一阶段: 当某台主机加入新的多播组时, 该主机应向多播组的多播地址发送一个 IGMP 报文, 声明自己要成为该组的成员。本地的多播路由器收到 IGMP 报文后, 还要利用多播路由选择协议把这种组成员关系转发给互联网上的其他多播路由器
- 第二阶段: 组成员关系是动态的。本地多播路由器要周期性地探询本地局域网上的主机,以便知道这些主机是否还继续是组的成员
- 只要有一台主机对某个组响应, 那么多播路由器就认为这个组是活跃的。不需要保留组关系的准确记录,因为使用了局域网硬件多播。多播路由器只需要知道网络上是否至少还有一台主机是本组成员即可
- 因此, 多播数据报的发送者和接收者都不知道(也无法找出) 一个多播组的成员有多少, 以及这些成员是哪些主机
- 但一个组在经过几次的探询后仍然没有一台主机响应, 多播路由器就认为本网络上的主机已经都离开了这个组, 因此也就不再把这个组的成员关系转发给其他的多播路由器
- 只要有一台主机对某个组响应, 那么多播路由器就认为这个组是活跃的。不需要保留组关系的准确记录,因为使用了局域网硬件多播。多播路由器只需要知道网络上是否至少还有一台主机是本组成员即可
IGMP协议包含3种类型的报文
- 成员关系询问报文
本地多播路由器询问网络中是否有属于某个多播组的成员 - 成员关系报告报文
主机申请加入到某个多播组时通知本地多播路由器;或回答“成员关系询问报文” - 成员离开报文
主机准备离开某个多播组
多播路由选择协议
- 在互联网范围的多播要靠路由器来实现, 这些路由器必须增加一些能够识别多播数据报的软件。能够运行多播协议的路由器称为多播路由器(multicast router)
多播路由选择要解决的问题
- 仅有 IGMP 协议是不能完成多播任务的。连接在局域网上的多播路由器还必须和互联网上的其他多播路由器协同工作, 以便把多播数据报用最小代价传送给所有的组成员。这就需要使用多播路由选择协议
- 多播转发必须动态地适应多播组成员的变化(这时网络拓扑并未发生变化)。请注意, 单播路由选择通常是在网络拓扑发生变化时才需要更新路由
- 例如 N 3 N_3 N3 里原本没有多播组 1 的成员,路由器 R R R 也就不需要向该网络发送多播组1的分组;但如果该 G G G 加入了多播组1,则此时 R R R 需要向 N 3 N_3 N3 发送多播组1的分组
- 多播路由器在转发多播数据报时, 不能仅仅根据多播数据报中的目的地址, 而是还要考虑这个多播数据报从什么地方来和要到什么地方去
- 例如 E 向 F 发送多播数据报时, 路由器 R R R 把这个多播数据报转发到 N 3 N_3 N3。但当 F 向 E 发送多播数据报时, 路由器 R R R 则把多播数据报转发到 N 2 N_2 N2
- 多播数据报可以由没有加入多播组的主机发出, 也可以通过没有组成员接入的网络
多播路由的基本思路
- 构造连接所有多播组成员所在网络的多播转发树 (没有回路)。根据构造方法分为
- 源分布树——以发送多播分组的源节点为根,连接所有多播组成员所在网络的转发多播树
- 共享分布树——以某个指定的(核心)路由器为根,连接所有多播组成员所在网络的转发多播树
建议使用的多播路由选择协议
- 密集模式的路由协议包括
- 距离向量多播路由协议(DVMRP:Distance Vector Multicast Routing Protocol)
- 多播开放最短路径优先协议(MOSPF:Multicast Open Shortest Path First)
- 密集模式独立多播协议(PIM-DM:Protocol-Independent Multicast-Dense Mode)
- 稀疏模式的路由协议包括
- 基于核心树的多播协议(CBT:Core Based Tree)
- 稀疏模式独立协议多播(PIM-SM:Protocol-Independent Multicast-Sparse Mode)
下面介绍在多播路由选择协议中,转发多播数据报时使用的一些方法:
IP多播中的隧道技术
- 当 IP 多播分组在传输的过程中遇到有不支持多播协议的路由器或网络时,就要采用隧道技术
- R 1 R_1 R1 对多播分组进行再次封装,加上普通IP分组头,使它成为向单一目的站发送的单播分组。然后通过隧道使 R 1 R_1 R1 发送到 R 2 R_2 R2 ,到达后除去普通IP分组头,恢复为原来的多播分组,继续向多个目的结点转发
书上还介绍了 泛洪与剪除、基于核心的发现技术
多协议标记交换 MPLS
MultiProtocol Label Switching
MPLS 支持多协议
- 可以使用多种数据链路层协议,如 PPP、 Ethernet、 ATM、帧中继 等
- 面向连接的 QoS 服务 (Quality of Service)
MPLS 的工作原理
路由 VS 交换:
- “路由”属于网络层,路由器软件根据路由表和分组的目的地址、源地址,为每个进入的分组,确定转发路径上的下一跳结点地址与输出端口
- 当网络很大时,查找含有大量项目的路由表要花费很多的时间。在出现突发性的通信量时, 往往还会使缓存溢出, 这就会引起分组丢失、传输时延增大和服务质量下降
- “交换”属于数据链路层,指在一个网络内部一个结点与相邻结点分组转发的过程
- 交换只需使用数据链路层的地址,利用硬件进行转发,速度更快
标记交换
- 在传统的 IP 网络中,分组每到达一个路由器, 都必须查找路由表, 并按照 “最长前缀匹配” 的原则找到下一跳的 IP 地址
- 而 “标记交换” 就是采用硬件技术对打上标记的 IP 数据报进行转发。它的意义就在于:利用 IP 分组的 “标记”,在数据链路层通过硬件实现快速转发
- MPLS 将数据链路层的第二层交换技术引入网络层,实现快速 IP 分组交换;属于第三层交换技术,实际是一种出现在OSI 2.5层的连接机制
MPLS 域 (MPLS domain)
- MPLS 域 是指该域中有许多彼此相邻的路由器, 并且所有的路由器都是支持 MPLS 技术的标记交换路由器 LSR (Label Switching Router)
- LSR 同时具有 标记交换 和 路由选择 两种功能, 标记交换功能是为了快速转发, 但在这之前 LSR 需要使用路由选择功能构造转发表
- 在 MPLS 域边缘连接其它子网的路由器是 边界标记交换路由器 E-LSR
MPLS 的基本工作过程如下:
- MPLS 域中的各 LSR 使用专门的标记分配协议 LDP (Label Distribution Protocol) 交换报文, 并找出和特定标记相对应的路径, 即 标记交换路径 LSP (Label Switched Path)
- 标记交换路径 LSP 的建立
- 请求驱动方式:请求驱动是在数据传输之前,由控制信令发出请求,各 LSR 接收到标记请求后动态进行标记分配和分发来建立 LSP,并根据 LSP 来构造出转发表
- 标记是预分配的,即各 LSR 对标记请求给予响应,当数据到达之前已经建立好 LSP,所以转发数据时不存在 LSP 建立时延 (提供 QoS 特性)
- 标记交换路径 LSP 的建立
- 当一个 IP 数据报进入到 MPLS 域时, MPLS 入口结点 (ingress node) 就给它打上标记(这实际上是插入一个 MPLS 首部), 并按照转发表把它转发给下一个 LSR (硬件转发)
- 应注意的是, MPLS 是面向连接的, 因为在标记交换路径 LSP 上的第一个 LSR 就根据 IP 数据报的初始标记确定了整个的标记交换路径, 就像一条虚连接一样,是从入口到出口的一个单向路径。以后的所有 LSR 都按照标记进行转发
- 这种 “由入口LSR确定进入MPLS域以后的转发路径” 称为显式路由选择 (explicit routing), 它和互联网中通常使用的 “每一个路由器逐跳进行路由选择“ 有着很大的区别
- 由于在全网内统一分配全局标记数值是非常困难的, 因此一个标记仅仅在两个标记交换路由器 LSR 之间才有意义。分组每经过一个 LSR, LSR 就要做两件事: 一是转发, 二是更换新的标记, 即把入标记更换成为出标记。这就叫做 标记对换 (label swapping)。做这两件事所需的数据都已清楚地写在转发表中。例如, 上图中的标记交换路由器
B
B
B 从入接口 0 收到一个入标记为 3 的 IP 数据报, 查找了如下的转发表:
标记交换路由器 B B B 就知道应当把该 IP 数据报从出接口 1 转发出去, 同时把标记对换为 1 - 当 IP 数据报离开 MPLS 域时, MPLS 出口结点(egress node)就把 MPLS 的标记去除, 把 IP 数据报交付非MPLS的主机或路由器, 以后就按照普通的转发方法进行转发
MPLS 的 核心思想:边缘的路由、核心的交换
- MPLS 把网络层的路由和数据链路层的交换有机结合起来,实现一次路由多次交换,即
- 由 E-LSR 执行路由查找 (IP 识别),分类,并封装上标记
- 给 IP 数据报打标记的过程叫做分类,即将具有相同转发处理方式的 IP 分组归为一类。严格的第三层(网络层)分类只使用了IP首部中的字段, 如源IP地址和目的IP地址等。大多数运营商实现了第四层(运输层)分类(除了要检查IP首部外, 运输层还要检查TCP或UDP首部中的协议端口号)
- LSR 只根据标记进行交换,从而加快了交换的速度
- 由 E-LSR 执行路由查找 (IP 识别),分类,并封装上标记
有关标记分配的一些补充 (详情还要学习一下 LDP)
- 下游为上游分配出标记
- 入标记是我分给别人的,出标记是别人分给我的
- 我分配的标记是给别人用的,我不会添加到报文中
MPLS 头部结构
- MPLS 并不要求下层的网络都使用面向连接的技术。因此一对 MPLS 路由器之间的物理连接, 既可以由一个专用电路组成,也可以使用像以太网这样的网络。但是这些网络并不提供打标记的手段, 而 IPv4 数据报首部也没有多余的位置存放 MPLS 标记。这就需要使用一种封装技术:
- 在把 IP 数据报封装成以太网帧之前, 先要插入一个 MPLS 首部。从层次的角度看, MPLS首部就处在第二层和第三层之间。在把加上 MPLS 首部的 IP 数据报封装成以太网帧时, 以太网的类型字段在单播的情况下设置为
884
7
16
8847_{16}
884716 而在多播的情况下为
884
8
16
8848_{16}
884816。这样, 接收方可以用帧的类型来判决这个帧是携带了 MPLS 标记还是一个常规的 IP 数据报
- 在把 IP 数据报封装成以太网帧之前, 先要插入一个 MPLS 首部。从层次的角度看, MPLS首部就处在第二层和第三层之间。在把加上 MPLS 首部的 IP 数据报封装成以太网帧时, 以太网的类型字段在单播的情况下设置为
884
7
16
8847_{16}
884716 而在多播的情况下为
884
8
16
8848_{16}
884816。这样, 接收方可以用帧的类型来判决这个帧是携带了 MPLS 标记还是一个常规的 IP 数据报
- 标记值 (20位)
- 试验 (3位,目前保留)
- S (1位) :表明当前标记是否是栈底 (1 表示该 MPLS 首部为栈底),这样就允许多个标记被编码到同一个数据包中 (标记的嵌套),形成标记栈
- 当 MPLS 首部加到 IP 数据报首部的前面时,我们就可以把这个 MPLS 首部看成是 MPLS 的标记栈,不过这时的标记栈里只有一个标记。如果再产生一个 MPLS 标记,那么就要把它加入到标记栈中,也就是放置在原来老的标记的前方(离IP数据报首部更远的位置)。MPLS协议规定,标记栈的栈顶(最后进入栈的标记)最靠近以太网帧的帧首部,而栈底(最先入栈的标记)最靠近 IP 首部
- MPLS 的标记栈用于当 MPLS 域出现嵌套的情况。如下图所示,工厂有两个厂区,每个厂区又有多个厂房。每个厂房内的网络使用普通的路由器,而各厂房之间 IP 数据报的传输则使用 MPLS,我们可以构建两个 MPLS 域。MPLS域1 用于厂房之间的通信;MPLS域2 用于厂区之间的通信(例如,在厂房
B
B
B 和
C
C
C 之间通信)。如果 IP 数据报是在某厂区的两个厂房之间进行传输,那么这个 IP 数据报就只携带一个标记(到达目的厂房后该标记就被去除)。如果 IP 数据报必须在厂区之间传输,然后再到达目的厂区中的某个厂房,那么这个 IP 数据报就要携带两个标记。假定 IP 数据报进入MPLS域1 的 LSR A,并且还要再经过 LSR B 和 LSR C 到达 LSR D。在 MPLS域1 中的标记交换路径 LSP 是 “A—B—C—D” 。lP 数据报在到达入口结点 LSR A 时被压入一个标记。当到达 LSR B 时就进入了 MPLS域2。在域2中的标记交换路径 LSP 是 “B—C”,因此 LSR B 要压入另一个标记。当 IP 数据报到达 LSR C 时就弹出栈顶的标记。最后当IP数据报到达 LSR D 时弹出标记栈剩下的标记
- 生存时间 TTL (8位):用来防止 MPLS 分组在 MPLS 域中兜圈子
转发等价类 FEC
Forwarding Equivalence Class
- FEC 就是用来描述一系列有相似或相同特征的分组,以同样的方式被运送,使用相同的 MPLS 标记,例如:
- 同样的目的地址前缀
- 所有源地址与目的地址都相同的 IP 数据报
- 具有同样服务质量需求的 IP 数据报
- 总之, 划分 FEC 的方法不受什么限制, 这都由网络管理员来控制, 因此非常灵活
- 入口结点并不是给每一个 IP 数据报指派一个不同的标记, 而是 将属于同样 FEC 的 IP 数据报都指派同样的标记。FEC 和 标记 是一一对应的关系
例:FEC 用于 负载均衡 (属于 流量工程)
- 主机 H 1 H_1 H1 和 H 2 H_2 H2 分别向 H 3 H_3 H3 和 H 4 H_4 H4 发送大量数据
- 路由器 A A A 和 C C C 是数据传输必须经过的。但传统的路由选择协议只能选择最短路径 A A A一 B B B 一 C C C, 这就可能导致这段最短路径过载
- 但在 MPLS 的情况下, 入口结点
A
A
A 可设置两种 FEC:
- "源地址为 H 1 H_1 H1 而目的地址为 H 3 H_3 H3" 和 “源地址为 H 2 H_2 H2 而目的地址为 H 4 H_4 H4“ ,把两种 FEC 设置不同的路径。这样可使网络的负载较为平衡
虚拟专用网 VPN
Vitural Private Network
有时一个很大的机构的许多部门分布的范围很广, 这些部门经常要互相交换信息。这可以有两种方法
- 租用电信公司的通信线路为本机构专用。这种方法简单方便, 但线路的租金太高
- 利用公用的 IP / MPLS 网络 建立专用数据传输通道,作为本机构各专用网之间的通信载体,即 虚拟专用网 VPN
专用网
- 专用网指使用专用 IP 地址的本地互联网,用于本机构主机的内部通信
- 如果专用网不同网点之间的通信必须经过公用的互联网,但又有保密的要求,那么所有通过互联网传送的数据都必须加密
下图以两个场所为例说明如何使用 IP 隧道技术 实现虚拟专用网
- 假定某个机构在两个相隔较远的场所建立了专用网 A A A 和 B B B, 其网络地址分别为专用地址 10.1.0.0 10.1.0.0 10.1.0.0 和 10.2.0.0 10.2.0.0 10.2.0.0。现在这两个场所需要通过公用的互联网构成一个 VPN
- 显然,每一个场所至少要有一个路由器具有合法的全球 IP 地址 ( R 1 R_1 R1 和 R 2 R_2 R2)
- 假设场所 A A A 的主机 X X X 要和另一个场所 B B B 的主机 Y Y Y 通信, X X X 向 Y Y Y 发送的 IP 数据报的源地址是 10.1.0.1 10.1.0.1 10.1.0.1, 而目的地址是 10.2.0.3 10.2.0.3 10.2.0.3。这个数据报先从 X X X 发送到与 R 1 R_1 R1。路由器 R 1 R_1 R1 收到内部数据报后,发现其目的网络必须通过互联网才能到达,就把整个内部数据报进行加密,然后重新加上数据报的首部,封装成为在互联网上发送的外部数据报,其源地址是路由器 R 1 R_1 R1 的全球地址 125.1.2.3 125.1.2.3 125.1.2.3 , 而目的地址是路由器 R 2 R_2 R2 的全球地址 194.4.5.6 194.4.5.6 194.4.5.6。路由器 R 2 R_2 R2 收到数据报后将其数据部分取出进行解密,恢复出原来的内部数据报(目的地址是 10.2.0.3 10.2.0.3 10.2.0.3), 交付主机 Y Y Y
- 可见,虽然 X X X 向 Y Y Y 发送的数据报是通过了公用的互联网,但在效果上就好像是在本部门的专用网上传送一样
- 数据报从 R 1 R_1 R1 传送到 R 2 R_2 R2 可能要经过互联网中的很多个网络和路由器。但从逻辑上看, 在 R 1 R_1 R1 到 R 2 R_2 R2 之间好像是一条直通的 点对点链路 (隧道)
隧道协议
- IPSec(Internet Protocol Security)即 Intenet 安全协议:第三层的隧道协议
- 基本目的是把密码学的安全机制引入 IP 协议
- IPSec 用于向 IPv4 与 IPv6 提供互操作、高质量与基于密码的安全性
- MPLS VPN:介于第二层和第三层之间的隧道协议
- 在入口边缘路由器为每个包加上 MPLS 标签 (为每个 VPN 分配 MPLS 网络内唯一的路由标识符),核心路由器根据标签值进行转发,出口边缘路由器再去掉标签,恢复原来的 IP 包
3. L2TP (Layer Two Tunneling Protocol):第二层隧道协议
- 内联网 VPN:如上例中的 A A A 和 B B B,由内部网络所构成的虚拟专用网
- 外联网 VPN:有外部机构参加的虚拟专用网
- 远程接入 VPN (remote access VPN):在外地工作的员工通过拨号接入互联网, 而员工个人电脑中的VPN软件可以在员工的个人电脑和公司的主机之间建立 VPN 隧道, 因而外地员工与公司通信的内容也是保密的, 员工们感到好像就是使用公司内部的本地网络