为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP (Internet Control Message Protocol) 。ICMP是 IP 层的协议,允许主机或路由器报告差错情况和提供有关异常情况的报告。 ICMP 报文格式如下图所示。
ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文。ICMP 报文的前 4 个字节是统一的格式,共有三个字段:类型、代码和检验和。接着的 4 个字节的内容与 ICMP 的类型有关。最后面是数据字段,其长度取决于 ICMP 的类型。下表出了几种目前常用的 ICMP 报文类型。
代码字段是为了进一步区分某种类型中的几种不同情况。检验和字段用来检验整个 ICMP 报文。
(一)常用的 ICMP 差错报告报文共有四种,即:
(1) 终点不可达 当路由器或主机不能交付数据报时就向源点发送终点不可达报文。
(2) 时间超过 当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把己收到的数据报片都丢弃,并向源点发送时间超过报文。
(3) 参数问题 当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
(4) 改变路由(重定向) 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(更好的路由)。
主机内的转发表中设置了默认路由器,如果默认路由器发现主机发往某个目的地址的数据报的最佳路由应当经过网络上的另一个路由器B时,就用改变路由报文把这情况告诉主机。于是,该主机就在其转发表中增加一个项目:到某某目的地址应经过路由器B。
所有的 ICMP 差错报告报文中的数据字段都具有同样的格式(如下图) 。把收到的需要进行差错报告的 IP 数据报的首部和数据字段的前 8 个字节提取出来,作为 ICMP 报文的数据字段。再加上相应的 ICMP 差错报告报文的前 8 个字节,就构成了 ICMP 差错报告报文。
提取收到的数据报的数据字段前 8 个字节是为了得到运输层的端口号(对于 TCP与UDP) 以及运输层报文的发送序号(对于 TCP) 。这些信息对源点通知高层协议是有用的
下面是不应发送 ICMP 差错报告报文的几种情况。
(二)常用的 ICMP 询问报文有两种,即:
(1)回送请求或回送回答 ICMP 回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
(2) 时间戳请求或时间戳回答 在 ICMP 时间戳请求报文发出后,就能收到对方响应的 ICMP 时间戳回答报文。利用在报文中记录的时间戳,发送方很容易计算出当前网络的往返时间。
ICMP 的一个重要应用就是分组网间探测 PING (Packet InterNet Groper) ,使用了 ICMP 回送请求与回送回答报文,用来测试两台主机之间的连通性。 PING 是应用层直接使用网络层 ICMP 的一个例子,没有通过运输层的 TCP 或 UDP。
下图是展示用法,只需要在命令提示符中输入 ping xxx(域名或ip地址)
,即可进行本主机与xxx
的连通性的测试。由图结果分析,本PC 一连发出四个 ICMP 回送请求报文,新浪网的邮件服务器 mail la.com.cn 也发回了四个 ICMP 回送回答报文的具体情况。最后显示出的是统计结果:发送到哪个机器(IP 地址),已发送、已接收的和丢失的分组数(但不给出分组丢失的原因),以及往返时间(往返的 ICMP 报文上都有时间戳)的最小值、最大值和平均值。最后可以判断,本主机可以和邮件服务器进行通信。
另一个非常有用的应用是路由跟踪在Windows中叫tracert (在 UNIX中叫traceroute )
工作原理:tracert 从源主机向目的主机发送一连串的 IP 数据报,数据报中封装的是无法交付的 UDP 用户数据报(使用了非法的端口号)。第一个数据报的生存时间 TTL 设置为 1 。当到达路径上的第一个 路由器 R1时,路由器 R1 先收下它,接着把 TTL 的值减 1 ,但由于 TTL 等于 0了,也就丢弃了,并向源主机发送一个 ICMP 时间超过差错报告报文。 源主机接着发送第二个数据报 ,并把 TTL 设置为 2 , 先到达路由器 R1 ,将 TTL 减 1 ,再转发给路由器R2,R2 收到时 TTL 为1,但减 1 后 TTL 变为0了。 就丢弃了并向源主机发送一个 ICMP 时间超过差错报告报文。这样一直继续下去。当最后一个数据报刚刚到达目的主机时,数据报的 TTL 为 1。主机不转发数据报,也不把 TTL 值减 1。因为IP 数据报中封装的是无法交付的运输层的 UDP 用户数据报,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。 就这样,源主机达到了自己的目的,因为这些路由器和最后目的主机发来的 ICMP 报文正好给出了源主机想知道的路由信息一一到达目的主机所经过的路由器的 IP 地址,以及到达其中的每一个路由器的往返时间。
由上图可以看到经过15个路由跳转即可。*号可能是由于一些路由器的安全防范问题,或者丢失。
路由选择协议规定了互联网中有关的路由器应如何相互交换信息并生成出路由表。一般认为属于网络层,但具体的某个路由选择协议如RIP,BGP等却属于应用层,因为他们使用了运输层提供的服务。事实上,不必在意路由选择协议所在的层级。
路由选择协议的核心就是路由算法,即需要何种算法来获得路由表中的各项目。理想的路由选择算法应有以下特点:
应当知道,路由选择是非常复杂的,是网络中的所有结点共同协调工作的结果。并且,路由选择的环境是不断发生无法预知的变化的。从路由算法能否随网络的通信量或拓扑自适应地进行调整变化来划分,可分成静态路由选择策略(非自适应路由选择),与动态路由选择策略(自适应路由选择)。
互联网由于规模大,并且一些单位不愿暴露内部网络的细节,故采用分层次的路由选择协议。首先划分许多较小的自治系统AS(autonomous system) , AS 是在单一技术管理下的使用同种路由选择协议和度量一组路由器。一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。由此,互联网可以把路由选择协议划分为两大类型:
RIP 是一种分布式的基于距离向量的路由选择协议,只适用于小型互联网,因为规定了一条路径最多只能包含 15 个路由器。最大优点就是简单。
距离:也称“跳数(hop count)”,路由器到直接连接的网络的距离定义为 1。到非直接连接的网络的距离定义为所经过的路由器数加 1。
分布式路由选择协议:每一个路由器都要不断地和其他一些路由器交换路由信息
RIP2 协议的报文格式如下图所示:
路由部分:地址族标识符字段用来标志所使用的地址协议,如IP地址的值为2;路由标记填入自治系统号 ASN, RIP 判断收到的路由选择信息是否为本自治系统发送的;还指出目的网络地址(包括子网掩码)、下一跳路由器地址以及到此网络的距离。
RIP 协议让一个自治系统中的所有路由器都和相邻路由器定期交换自己的全部路由信息,并不断更新其路由表,使得从每一个路由器到每一个目的网络的路由器都是最少的(即跳数最少)
路由表主要的信息是:到本自治系统中某个网络的最短距离,经过的下一跳地址。
路由表更新的算法是距离向量算法(Bellman-Ford Algorithm),即找出到每个目的网络的最短距离和路径。
距离向量算法的要点:设 X 是结点 A到B 的最短路径上的一个结点。若把路径 A到B 拆成两段路径 A到X 和 B到X ,则每一段路径 A到X 和 B到X 也都分别是结点 A到 X 和结点 X到B 的最短路径。
距离向量算法对每一个相邻路由器发送过来的 RIP 报文,进行以下步骤:
通过上面步骤可以知道,当一个路由器发现了更短的路由,会迅速更新完毕。但RIP存在的一个问题是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。RIP 协议的这一特点叫做:好消息传播得快,而坏消息传播得慢。
开放最短路径优先 OSPF (Open Shortest Path First)隶属内部网关协议,用于在单一自治系统 AS 内决策路由。OSPF 是链路状态(Link-state)的路由协议,而不是RIP那样的距离向量协议。
"开放"表明 OSPF 协议不是受某一家厂商控制,而是公开发表的。
"最短路径优先"是因为使用了 Dijkstra 提出的最短路径算法 SPF。
"链路状态"就是说明本路由器都和哪些路由器相邻,以及该链路的 “度量(代价)”。代价为无量纲数,可代表费用、距离、时延、带宽,等。
OSPF规定当链路状态发生变化或每隔一段时间(30min),每个路由器都利用泛洪法向本自治系统中所有路由器发送本路由器所知道的部分信息(与本路由器相邻的所有路由器的链路状态)。通过各路由器之间频繁地交换链路状态信息,最后所有的路由器最终都能建立一个链路状态数据库,即全网的拓扑结构图。每一个路由器及时使用链路状态数据库中的数据,构造出自己的路由表,更新过程收敛得快。
“泛洪法”就是路由器通过所有输出端口向所有相邻的路由器发送数据,而每个相邻的路由器发往其所有的相邻路由器(除源路由器),最中整个区域都收到该信息。
“收敛”就是在自治系统中所有节点都得到正确路由选择信息的过程。
OSPF可用于规模很大的网络,因为使用层次结构的区域划分,将本AS再划分为若干个更小的区域,使用了主干区域(标识符规定为 0.0.0.0)来连通其他区域,如下图所示。在主干区域内应有一个路由器专门和其他自治系统交换路由信息,称为自治系统边界路由器,如图中的R6。
OSPF 的特点如下:
OSPF分组是作为IP数据报的数据部分来传送的,如下图所示。OSPF 不用 UDP 而是直接用 IP 数据报传送(其 IP 数据报首部的协议字段值为 89),构成的数据报很短。
OSPF 共有以下五种分组类型:
OSPF 规定,每两个相邻路由器每隔 10 秒钟要交换一次问候分组,。若有 40 秒没有收到某个相邻路由器发来的问候分组,则可认为该相邻路由器是不可达的,应立即修改链路状态数据库,并重 新计算路由表。其他的四种类型分组都是用来进行链路状态数据库的同步,即将不同路由器的链路状态数据库的内容更新成一样的。
两个同步的路由器叫做"完全邻接的" (fully adjacent) 路由器。不是完全邻接的路由器表明它们虽然在物理上是相邻的,但其链路状态数据库并没有达到一致。
在不同自治系统 AS 之间的路由选择使用外部网关协议(或边界网关协议)BGP,目前使用最多的版本 BGP-4 ,但目前 BGP-4 仍然是草案标准,在下面简写成BGP。
因为互联网的规模太大了,使得自治系统 AS 之间路由选择非常困难,路由表的项目数过多,且不同自治系统AS中代价定义不同;并且自治系统 AS 之间的路由选择必须考虑有关策略,必须考虑政治、安全或经济方面,如,我国国内的站点在互相传送数据报时不应经过国外兜圈子,特别是,不要经过某些对我国的安全有威胁的国家。这些策略都是由网络管理人员对每一个路由器进行设置的,但这些策略并不是自治系统之间的路由选择协议本身。
由于上述情况,边界网关协议 BGP 只能是力求选择出一条能够到达目的网络且比较好的路由(不能兜圈子),而井非要计算出一条最佳路由。 这里所说的BGP路由是指经过哪些自治系统AS可以到达目的网络。BGP 采用了路径向量(path vector)路由选择协议。
我们知道,在一个自治系统AS中有两种不同功能的路由器,边界路由器(或边界网关)和内部路由器。通过边界路由器,AS之间才能利用BGP交换可达性路由信息。当两个边界路由器如下图中的R1和R2进行通信时,必须先建立TCP连接(端口号为179),这种连接又称为半永久连接(即双方交换完信息后仍然保持连接状态)。
像R1和R2之间的连接称为eBGP,e代表外部external。AS内部,两个路由器之间的BGP连接称为iBGP,i表示内部internal,逻辑上的连接。
BGP路由"X,AS1,R1"则表示从R1经过AS1可到达X。
边界路由器根据本AS管理员所规定的策略,可以拒绝某些路由,而在iBGP的连接上仅转发符合规定策略的BGP路由。若对于R3到X,必须借助R2才能到达R1。通过下图可以形象的理解eBGP和iBGP的作用,及内部协议网关的区别。
然后介绍BGP路由的一般格式,如下:
BGP路由 = “ 目的网络(前缀),BGP属性 ” = “ 目的网络(前缀),AS-PATH,NEXT-HOP ” |
---|
目的网络(前缀)就是通告的BGP路由终点,BGP属性有好几种,其中最重要的有AS-PATH(自治系统路径)是通告的BGP路由所经过的自治系统,将他们的ASN加入到AS-PATH中,不允许出现重复的ASN。NEXT-HOP(下一跳)是通告的BGP路由起点。总的来分析即,从NEXT-HOP经过所有AS-PATH可到达目的网络。
在互联网中的自治系统AS可大概分为下图中所示的三类,即末梢AS、对等AS和穿越AS,链路旁边的人民币符号¥表示需要对转发分组付费(下面使用上面提供的服务,故需付费)。
假如从一个AS到另一个AS中的网络 X 有多条BGP路由可供选择时,路由选择就需要按以下的原则来选择:
BGP的报文是作为TCP报文的数据部分来传送的,BGP有以下四种报文。
在两个路由器建立了TCP连接后,发送OPEN报文,收到后就发回KEEPALIVE表示接受建立BGP连接。
本文参考 计算机网络(第8版) / 谢希仁编著. ----北京:电子工业出版社,2021.6
若能对你有所帮助,请点个赞,欢迎交流。