在前一篇文章一篇文章带你搞懂网络层(网际层)-- 地址篇我们已经详细讨论了地址以及IP协议的内容,但是仅仅知道地址完成主机到主机之间的数据传输还是不够的,路由到底如何选择转发接口?路由表怎么建立?多播是撒?他是怎么工作的?下面我们就讨论这些问题。
在前一篇文章中一篇文章带你搞懂网络层(网际层)-- 协议篇我们已经详细的讨论了IP地址及其IPv4、IPv6及其IP协议,接下来我们就来讨论与路由转发、路由选择相关的协议。
为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP (Internet Control Message Protocol)。ICMP 是互联网的标准协议。ICMP 允许主机或路由器报告差错情况和提供有关异常情况报告。但 ICMP 不是高层协议(看起来好像是高层协议,因为 ICMP 报文是装在 IP 数据报中,作为其中的数据部分),而是 IP 层的协议。
图 ICMP报文格式
ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文。 ICMP 报文的前 4 个字节是统一的格式,共有三个字段:即类型、代码和检验和。ICMP 报文接着的 4 个字节的内容与 ICMP 的类型有关。
图 ICMP 差错报告报文的数据字段的内容
对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。对具有多播地址的数据报都不发送 ICMP 差错报告报文。对具有特殊地址(如127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文。
回送请求和回送回答报文:用于测试是否可达,及了解有关状态。时间戳请求和时间戳回答报文:用于时钟同步和时间测量。下面的几种 ICMP 报文不再使用:
但是实际上不存在一种绝对的最佳路由算法。所谓“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已 。实际的路由选择算法,应尽可能接近于理想的算法。 路由选择是个非常复杂的问题它是网络中的所有结点共同协调工作的结果。路由选择的环境往往是不断变化的,而这种变化有时无法事先知道。 于是常见的路由协议分为两种:
当前互联网采用分层次的路由选择协议。这是因为:
自治系统 AS 的定义:在单一的技术管理下的一组路由器,而这些路由器使用一种 AS 内部的路由选择协议和共同的度量以确定分组在该 AS 内的路由,同时还使用一种 AS 之间的路由选择协议用以确定分组在 AS之间的路由。
现在对自治系统 AS 的定义是强调下面的事实:尽管一个 AS 使用了多种内部路由选择协议和度量,但重要的是一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。
图 ICMP 差错报告报文的数据字段的内容
基于自治系统,我们就能够将常见的路由协议划分为如下两种:
内部网关协议 IGP (Interior Gateway Protocol)
在一个自治系统内部使用的路由选择协议。目前这类路由选择协议使用得最多,如 RIP 和 OSPF 协议。
外部网关协议 EGP (External Gateway Protocol)
若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议 EGP。在外部网关协议中目前使用最多的是 BGP-4。
说明:互联网的早期 RFC 文档中未使用“路由器”而是使用“网关”这一名词。但是在新的 RFC 文档中又使用了“路由器”这一名词。应当把这两个术语当作同义词。
IGP 和 EGP 是协议类别的名称。但 RFC 在使用 EGP 这个名词时出现了一点混乱,因为最早的一个外部网关协议的协议名字正好也是 EGP。因此在遇到名词 EGP 时,应弄清它是指旧的协议 EGP 还是指外部网关协议 EGP 这个类别。
接下来我们将逐一了解这些协议: 内部网关协议RIP、OSPF、 外部网关协议BGP.
RIP 是一种分布式的、基于距离向量的路由选择协议.RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。 其理论依据是Bellman-Ford 算法(或 Ford-Fulkerson 算法)
从一个路由器到直接连接的网络的距离定义为 1。
从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加 1。
RIP 协议中的“距离”也称为“跳数”(hop count),因为每经过一个路由器,跳数就加 1。这里的“距离”实际上指的是“最短距离”。
RIP 认为一个好的路由就是它通过的路由器的数目少,即“距离短”。
RIP 允许一条路径只能包含最多15 个路由器。
“距离”的最大值为 16 时即相当于不可达。可见 RIP 只适用于小型互联网。
RIP 不能在两个网络之间同时使用多条路由。RIP 选择一个经过最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。
RIP 协议的收敛 (convergence) 过程较快。“收敛”就是在自治系统中所有的结点都得到正确的路由选择信息的过程。 在交换过程中需要注意以下几点:
图 交换得到的路由表
在此之后转发信息就能够查询路由表得到,而且每次的转发都是经过路由数量最少的路径。
路由器收到相邻路由器(其地址为 X)的一个 RIP 报文:
先修改此 RIP 报文中的所有项目:把“下一跳”字段中的地址都改为 X,并把所有的“距离”字段的值加 1。
对修改后的 RIP 报文中的每一个项目,重复以下步骤:
若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达路由器,即将距离置为 16(表示不可达)。
返回。
图 路由更新
图 RIP 协议的报文格式
RIP2 报文由首部和路由部分组成。RIP2 报文中的路由部分由若干个路由信息组成。每个路由信息需要用 20 个字节。地址族标识符(又称为地址类别)字段用来标志所使用的地址协议。路由标记填入自治系统的号码,这是考虑使 RIP 有可能收到本自治系统以外的路由选择信息。再后面指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离。
一个 RIP 报文最多可包括 25 个路由,因而 RIP 报文的最大长度是 4 + 20 * 25 = 504 字节。如超过,必须再用一个 RIP 报文来传送。
RIP2 具有简单的鉴别功能。若使用鉴别功能,则将原来写入第一个路由信息的位置(20 个字节)用作鉴别。在鉴别数据之后才写入路由信息,但这时最多只能再放入 24 个路由信息。
RIP 协议特点:好消息传播得快,坏消息传播得慢。RIP 存在的一个问题:当网络出现故障时,要经过比较长的时间 (例如数分钟) 才能将此信息传送到所有的路由器。
图 正常情况
图 网1出现故障,演示坏消息传递慢
开放最短路径优先 OSPF (Open Shortest Path First)是为克服 RIP 的缺点在 1989 年开发出来的。OSPF 的原理很简单,但实现起来却较复杂。
“开放”表明 OSPF 协议不是受某一家厂商控制,而是公开发表的。“最短路径优先”是因为使用了 Dijkstra 提出的最短路径算法 SPF。采用分布式的链路状态协议 (link state protocol)。 注意:OSPF 只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”。
向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法。发送的信息是本路由器所有相邻路由器的链路状态,但这只是路由器所知道的部分路由信息。
“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。 只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。 由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库。这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。OSPF 的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。
OSPF 的更新过程收敛得快是其重要优点。为了使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干个更小的范围,叫做区域。每一个区域都有一个 32 位的区域标识符(用点分十进制表示)。区域也不能太大,在一个区域内的路由器最好不超过 200 个。
图 OSPF 划分为两种不同的区域
划分区域的好处:将利用洪泛法所交换的链路状态信息的范围,局限于一个区域而不是整个的自治系统,这就减少了整个网络上的通信量。在一个区域内部的路由器中,其路由表中只包含本区域的完整网络拓扑,而不知道其他区域的网络拓扑情况。OSPF 使用层次结构的区域划分。在上层的区域叫做主干区域 (backbone area)。主干区域的作用是用来连通其他在下层的区域。 主干区域的标识符规定为:0.0.0.0。
OSPF 不用 UDP 而是直接用 IP 数据报传送。OSPF 构成的数据报很短。这样做可减少路由信息的通信量。
数据报很短的另一好处是可以不必将长的数据报分片传送。但分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。 OSPF 对不同的链路可根据 IP 分组的不同服务类型 TOS 而设置成不同的代价。因此,OSPF 对于不同类型的业务可计算出不同的路由。如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径。这叫做多路径间的负载平衡。
所有在 OSPF 路由器之间交换的分组都具有鉴别的功能。支持可变长度的子网划分和无分类编址 CIDR。每一个链路状态都带上一个 32 位的序号,序号越大状态就越新。
图 OSPF 数据报格式
简单介绍一下各个字段的含义:
当一个路由器刚开始工作时,它只能通过问候分组得知它有哪些相邻的路由器在工作,以及将数据发往相邻路由器所需的“代价”。如果所有的路由器都把自己的本地链路状态信息对全网进行广播,那么各路由器只要将这些链路状态信息综合起来就可得出链路状态数据库。但这样做开销太大,因此OSPF采用下面的办法。
OSPF让每一个路由器用数据库描述分组和相邻路由器交换本数据库中已有的链路状态摘要信息。
摘要信息主要就是指出有哪些路由器的链路状态信息(以及其序号)已经写入了数据库。经过与相邻路由器交换数据库描述分组后,路由器就使用链路状态请求分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。通过一系列的这种分组交换, 全网同步的链路数据库就建立了。在转换过程中使用到的各种类型的分组如下:
交换过程如下,在相邻路由的情况下不断的交换信息,就能够完成全局数据网络的构建。
图 OSPF 数据报格式
OSPF协议我们就简单介绍到这里,不过回顾一下,OSPF有哪几种减少发送信息,减少带宽消耗的操作?
- 划分区域,只在区域内交换信息。
- 交换链路摘要信息而不是交换整个数据。
- 只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。而不是定时交换信息。
在了解BGP协议之前,我们脑海中应该有这样的网络结构:一个大网络被划分为小的网络,这样的小的网络我们能够进行数据的传输(重点是解决路由表过大的问题,网络较小 就不存在这个问题,所以说可以进行数据传输),在这样的小的网络中进行数据传输,构建路由表就能够使用RIP(理解为点对点,实际是点对点交换信息的方式)或者OFPS(理解为广播,实际是洪范交换信息方式),但是非常明显的就是两个小的网络之间怎么交换信息呢?BGP 是不同自治系统的路由器之间交换路由信息的协议。 在又来上述的概念之后我们继续看BGP协议。
互联网的规模太大,使得自治系统之间路由选择非常困难。对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。当一条路径通过几个不同 AS 时,要想对这样的路径计算出有意义的代价是不太可能的。比较合理的做法是在 AS 之间交换“可达性”信息。自治系统之间的路由选择必须考虑有关策略。因此,边界网关协议 BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。
图 BGP 发言人和自治系统 AS 的关系
每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“ BGP 发言人” (BGP speaker) 。一般说来,两个 BGP 发言人都是通过一个共享网络连接在一起的,而 BGP 发言人往往就是 BGP 边界路由器,但也可以不是 BGP 边界路由器。 (实例见上图)
一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话(session),利用 BGP 会话交换路由信息。
图 BGP 发言人和自治系统 AS 的关系
字段的见简单解释:
图 在BGP的角度看到网络结构
看到上图我们因该可以很快的联想到路由器的分组转发,我们做如下的对比:
路由转发 | BGP转发 | |
---|---|---|
转发 | 路由器 | AS自治系统 |
转发的出口 | 路由器的接口 | BGP发言人(类似与路由器的接口) |
转发算法 | RIP相邻转发构建路由表,OSPF洪范转发构建路由表 | 相邻AS间转发构建路由表 |
看到这不知道是不是有这种感觉:同样的问题,反复出现,面向的场景不一样使用协议就不一样。比如RIP与OSPF就与数据链路层中的PPP协议与以太网协议类似,一个是点对点(相邻的)交换信息,一个是多点之间的交换信息;又比如RIP与BGP类似,都是相邻间传播信息,构建路由,都能完成数据的转发但是面向的网络大小不一样。
IP 多播 (multicast,以前曾译为组播) 已成为互联网的一个热门课题。其目的是为了更好地支持一对多通信。也就是一对多通信:一个源点发送到许多个终点。
应用场景:
图 单2播通信的情况
图 多播通信的情况
从上面两个图中我们就能明显的看出多播的好处:节省网络带宽。
在互联网上进行多播就叫做 IP 多播。互联网范围的多播要靠路由器来实现。能够运行多播协议的路由器称为多播路由器(multicast router)。当然它也可以转发普通的单播IP数据报。从 1992 年起,在互联网上开始试验虚拟的多播主干网 BONE (Multicast Backbone On the InterNEt)。 现在多播主干网已经有了相当大的规模。
每个多播组都有一个多播标识符用于进行唯一定位。多播数据报将多播标识符作为目标地址。多播组的标识符就是 IP 地址中的 D 类地址(多播地址)。每一个 D 类地址标志一个多播组。多播地址只能用于目的地址,不能用于源地址。
多播数据报和一般的 IP 数据报的区别是:它使用 D 类 IP 地址作为目的地址
首部中的协议字段值是 2,表明使用网际组管理协议 IGMP。多播数据报也是“尽最大努力交付”,不保证一定能够交付多播组内的所有成员。对多播数据报不产生 ICMP 差错报文。
多播分为局域网范围的多播和互联网范围的多播。后者要用到前者。
图 多播通信的情况
和 ICMP 相似,IGMP 使用 IP 数据报传递其报文(即以IGMP作为数据部分,加上 IP 首部,构成 IP 数据报),但它也向 IP 提供服务。因此,我们不把 IGMP 看成是一个单独的协议,而是属于整个网际协议 IP 的一个组成部分。
IP多播的实现需要两种协议,一个是对组员进行管理、了解组员信息的网际组管理协议(IGMP)。显然,仅有IGMP协议是不能完成多播任务的。连接在局域网上的多播路由器还必须和互联网上的其他多播路由器协同工作,以便把多播数据报用最小代价传送给所有的组成员。这就需要使用多播路由选择协议。
在主机和多播路由器之间的所有通信都是使用 IP 多播。当同一个网络上连接有几个多播路由器时,它们能够迅速和有效地选择其中一个来探询主机的成员关系。 多播路由器在探询组成员关系时,只需要对所有多播组发送一个请求信息的询问报文,而不需要对每一个组发送一个询问报文。默认的询问速率是每 125 秒发送一次。
每次询问,同一组内,只有一个成员响应:在 IGMP 的询问报文中有一个数值 N,它指明一个最长响应时间(默认值为 10 秒)。每个收到询问的组成员等待一个0 到 N 之间的随机时间,对应于最小多播组响应时延的主机发出响应。同一个组内的每一个主机都要监听响应,只要有本组的某个主机发送了响应,自己就可以不再发送响应了。
一个多播组中的成员是动态变化的,随时会有主机动态加入或离开这个多播组。
路由选择实际上就是要找出以源主机为根结点的转发树。在多播转发树上的路由器不会收到重复的多播数据报。不同多播组,有不同的多播转发树。同一多播组,不同源点,也会有不同的播转发树。
多播路由选择协议尚未标准化。多播路由选择协议在转发多播数据报时使用了三种方法:
这种方法适合于较小多播组、所有组成员接入的局域网相邻接的情况。一开始,路由器使用洪泛的方法(就是一种广播方式)转发多播数据报。为了避免兜圈子,采用了叫做反向路径广播 RPB (Reverse Path Broadcasting) 的策略。
RPB 的要点
路由器收到多播数据报时,先检查它是否是从源点经最短路径传送来的:
这种方法避免了多播数据报兜圈子,并避免了路由器收到重复的多播数据报。如果在多播转发树上的某个路由器发现它的下游树枝(即叶节点方向)已没有该多播组的成员,就应把它和下游的树枝一起剪除。当某个树枝有新增加的组成员时,可以再接入到多播转发树上。
图 BMP协议实例
隧道技术(tunneling)
隧道技术适用于多播组的位置在地理上很分散的情况。例如下图中网1和网2都支持多播。现在网1中的主机向网2中的一些主机进行多播。但路由器R1和R2之间的网络并不支持多播,因而R1和R2不能按多播地址转发数据报。为此,路由器R1就对多播数据报进行再次封装,即再加上普通数据报首部,使之成为向单一
目的站发送的单播(unicast)数据报,然后通过“隧道”(tunnel)从R1发送到R2。单播数据报到达路由器R2后,再由路由器R2剥去其首部,使它又恢复成原来的多播数据报,继续向多个目的站转发。
图 隧道技术实例
适用于多播组的大小在较大范围内变化的情况。
方法:对每一个多播组指定一个核心(core) 路由器,给出它的 IP 单播地址。按照前面讲过的方法,创建出核心路由器对应于该多播组的转发树。多播路由器在收到加入组的请求分组后,将该信息加入到路由中, 从而将多播转发树的覆盖范围由核心路由器不断向外扩大。
由于 IP 地址的紧缺,一个机构能够申请到的IP地址数往往远小于本机构所拥有的主机数。考虑到互联网并不很安全,一个机构内也并不需要把所有的主机接入到外部的互联网。假定在一个机构内部的计算机通信也是采用 TCP/IP 协议,那么从原则上讲,对于这些仅在机构内部使用的计算机就可以由本机构自行分配其 IP 地址。
采用这样的专用 IP 地址的互连网络称为专用互联网或本地互联网,或更简单些,就叫做专用网。因为这些专用地址仅在本机构内部使用。专用IP地址也叫做可重用地址 (reusable address)。
在专用网上使用专用地址的主机如何与互联网上的主机通信?
需要在专用网连接到互联网的路由器上安装 NAT 软件。装有 NAT 软件的路由器叫做 NAT路由器,它至少有一个有效的外部全球IP地址。所有使用本地地址的主机在和外界通信时,都要在 NAT 路由器上将其本地地址转换成全球 IP 地址,才能和互联网连接。
图 NAT 路由器的工作原理
内部主机 A 用本地地址 IPA 和互联网上主机 B 通信所发送的数据报必须经过 NAT 路由器。NAT 路由器将数据报的源地址 IPA 转换成全球地址 IPG,并把转换结果记录到NAT地址转换表中,目的地址 IPB 保持不变,然后发送到互联网。NAT 路由器收到主机 B 发回的数据报时,知道数据报中的源地址是 IPB 而目的地址是 IPG。根据 NAT地址转换表,NAT 路由器将目的地址 IPG 转换为 IPA,转发给最终的内部主机 A。 可以看出,在内部主机与外部主机通信时,在NAT路由器上发生了两次地址转换:
当 NAT 路由器具有 n 个全球 IP 地址时,专用网内最多可以同时有 n 台主机接入到互联网。这样就可以使专用网内较多数量的主机,轮流使用 NAT 路由器有限数量的全球 IP 地址。专用网内部主机不能充当服务器,因为互联网上的客户无法请求专用网内的服务器提供服务。通过 NAT 路由器的通信必须由专用网内的主机发起。
为了更加有效地利用 NAT 路由器上的全球IP地址,现在常用的 NAT 转换表把运输层的端口号也利用上。这样,就可以使多个拥有本地地址的主机,共用一个 NAT 路由器上的全球 IP 地址,因而可以同时和互联网上的不同主机进行通信。使用端口号的 NAT 叫做网络地址与端口号转换NAPT (Network Address and Port Translation),而不使用端口号的 NAT 就叫做传统 NAT (traditional NAT)。
NAPT把专用网内不同的源 IP 地址,都转换为相同的全球 IP 地址。但对源主机所采用的 TCP 端口号(不管相同或不同),则转换为不同的新端口号。因此,当 NAPT 路由器收到从互联网发来的应答时,就可以从 IP 数据报的数据部分找出运输层的端口号,然后根据不同的目的端口号,从 NAPT 转换表中找到正确的目的主机。