网际控制报文协议ICMP

为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议(Internet Control Message Protocol,ICMP)。ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP 报文作为IP层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。但通常我们把ICMP作为IP层的协议,而不是高层协议,因为它配合IP协议一起完成网络层功能。ICMP报文格式如下图所示:

image-20210728111936202

ICMP 报文的种类

ICMP报文的种类有两种,即ICMP差错报告报文ICMP询问报文

ICMP 报文的前 4 个字节是统一的格式,共有三个字段,即类型、代码和检验和。接着的 4个字节的内容与ICMP的类型有关。最后面是数据字段,其长度取决于ICMP的类型。下表给出了几种常用的ICMP报文类型:

image-20210728112008302

ICMP 报文的代码字段是为了进一步区分某种类型中的几种不同的情况。检验和字段用来检验整个ICMP报文。

1.ICMP差错报告报文

ICMP差错报告报文共有5种:

  1. 终点不可达:当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等。
  2. 源点抑制:当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点放慢发送速率。
  3. 超时:当路由器收到一个TTL为1的IP数据报,若无路由匹配,除丢弃该数据报外,还向源点发送超时差错报告报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,丢弃报片,向源点发送超时差错报告报文。
  4. 参数问题:当路由器或目的主机收到的数据报首部中有的字段值不正确时,丢弃该数据报,向源点发送参数问题报文。
  5. 改变路由(重定向): 路由器把改变路由报文发送给主机,主机知道下次将数据报发送给另其它路由器。优化主机路由。

所有的 ICMP 差错报告报文中的数据字段都具有同样的格式(见下图):

image-20210728112030611

把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段,再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段的前8个字节是为了得到运输层的端口号(对于TCP和UDP),以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的;整个ICMP报文作为IP数据报的数据字段发送给源点。

下面是不应发送ICMP差错报告报文的几种情况:

  • 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
  • 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
  • 对具有多播地址的数据报都不发送 ICMP 差错报告报文。
  • 对具有特殊地址(如 127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文。

2.ICMP询问报文

常用的ICMP询问报文有两种:

(1)回送请求和回答ICMP:回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。这种询问报文用来测试目的站是否可达及了解其有关状态。

(2)时间戳请求和回答ICMP:时间戳请求报文是请某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用来进行时钟同步和测量时间。

ICMP 的应用举例

ping

ICMP 的一个重要应用就是分组网间探测(Packet InterNet Groper,PING)。PING使用了ICMP回送请求与回送回答报文。PING是应用层直接使用网络层ICMP的一个例子。它没有通过运输层的TCP或UDP。

traceroute

另一个应用是 traceroute(UNIX系统),用来跟踪一个分组从源点到终点的路径。在Windows系统中是tracert。原理如下:

traceroute从源主机向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报。第一个数据报P1的生存时间TTL设置为1。当P1到达路径上的第一个路由器R1时,路由器R1先收下它,接着把TTL的值减1。由于TTL等于零了,R1就把P1丢弃了,并向源主机发送一个ICMP超时差错报告报文。

源主机接着发送第二个数据报P2,并把TTL设置为2。P2先到达路由器R1,R1收下后把TTL减1再转发给路由器R2。R2收到P2时TTL为1,但减1后TTL变为零了,R2就丢弃P2,并向源主机发送一个ICMP超时差错报告报文。这样一直继续下去。当最后一个数据报刚刚到达目的主机时,数据报的TTL是1。主机不转发数据报,也不把TTL值减1。但因IP数据报中封装的是无法交付的运输层的UDP用户数据报,因此目的主机要向源主机发送ICMP终点不可达差错报告报文。源主机此时就知道数据报已到达目的主机,并停止继续发送。

下图是一个示例:图中每一行有3个时间出现,是因为对应于每一个TTL值,源主机要发送3次同样的IP数据报。从原则上讲,IP数据报经过的路由器越多,所花费的时间也会越多。下图数据却否定了这个逻辑;这是因为因特网的拥塞程度随时都在变化,也很难预料到。

image-20210728192050741

因特网的路由选择协议

因特网将整个互联网划分为许多较小的自治系统 (autonomous system),一般都记为AS。一个大的ISP就是一个自治系统。这样,因特网就把路由选择协议划分为两大类。

(1)内部网关协议(Interior Gateway Protocol,IGP) 即在一个自治系统内部使用的路由选择协议,而这与在互联网中的其他自治系统选用什么路由选择协议无关。目前这类路由选择协议很多,如RIP和OSPF协议。

(2)外部网关协议(External Gateway Protocol,EGP) 若源主机和目的主机处在不同的自治系统中,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议EGP。目前因特网使用的外部网关协议就是BGP的版本4(BGP-4)。

下图是两个自治系统互连在一起的示意图:

image-20210729100238907

路由器的工作原理

路由器的构成

路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。从路由器某个输入端口收到的分组,按照分组要去的目的地(即目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器。以此类推,直到该分组到达终点为止。下图是一种典型的路由器的构成框图。

image-20210729100958172

路由选择部分也叫作控制部分,其核心是路由选择处理机。路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,同时经常或定期和相邻路由器交换路由信息而不断地更新和维护路由表。

分组转发部分由3部分组成:交换结构、一组输入端口和一组输出端口。

1.输入端口

路由表(网络层)一般仅包含从目的网络到下一跳(IP地址)的映射,而转发表(链路层)是依据路由表计算出来的输出端口和某些 MAC 地址信息(如下一跳的以太网地址)的映射。路由表总是用软件实现,但转发表则甚至可用特殊的硬件来实现。

上图路由器的输入和输出端口里面都各有3个框,分别代表物理层、数据链路层和网络层的处理模块。物理层进行比特的接收。数据链路层则按照链路层协议接收传送分组的帧。在把帧的首部和尾部剥去后,分组就被送入网络层的处理模块。接着分组要么交给路由器自己接收,要么经过交换结构到达合适的输出端口。

路由器必须以很高的速率转发分组。现在常用 Mpps(million packet per second,百万分组每秒)为单位来说明一个路由器对收到的分组的处理速率有多高。

当一个分组正在查找转发表时,后面又紧跟着从这个输入端口收到另一个分组,这个后到的分组就必须在队列中排队等待,因而产生了一定的时延。下图是在输入端口的队列中排队的分组示意图。

image-20210729101316814

2.交换结构

交换结构(switching fabric)又称为交换组织,是路由器的关键构件,它将某个输入端口进入的分组根据查表的结果从一个合适的输出端口转发出去。如果交换结构的速率跟不上所有输入端口分组的到达速率时,分组会因为等待交换而在输入队列中排队。下图给出了实现交换结构的三种基本方式的示意图。

image-20210729105145245

3.输出端口

输出端口从交换结构接收分组,然后把它们发送到路由器外面的线路上。在网络层的处理模块中设有一个缓冲区,实际上它就是一个队列;来不及发送的分组就必须暂时存放在这个队列中。数据链路层处理模块把分组加上链路层的首部和尾部,交给物理层后发送到外部线路。如下图:

image-20210729105222995

总结

分组在路由器的输入端口和输出端口都可能会在队列中排队等候处理,若分组处理的速率赶不上分组进入队列的速率,存储空间最终必定减少到零,使后面再进入队列的分组被丢弃。设备或线路出故障也可能使分组丢失,但这种情况比较少见。

传输带宽的不断增长对路由器的性能要求也在不断提高。路由器现在大量使用专用器件,体系结构的发展也已经过了4次大的变化:单机集中式总线结构、单机分布式共享总线结构、单机分布式纵横交换结构和多机互连的集群结构。

路由器与交换机的比较

现在我们已经学习了两种基于存储转发的分组交换设备,一种是工作在网络层,利用网络层地址转发分组的路由器;另一种工作在数据链路层,利用 MAC 地址转发分组的交换机。他们的工作原理完全不同,各有优缺点,应用场合有明显的不同。

交换机的最大优点是即插即用,并具有相对高的分组过滤和转发速度。缺点是一个大型交换机网络要求交换机维护大的转发表,也将要求在主机中维护大的ARP表,并会产生和处理大量的ARP广播。交换机对于广播风暴不提供任何保护措施,会导致整个以太网的崩溃。另外,交换机网络的逻辑拓扑结构被限制为一棵生成树,即使在物理上存在冗余链路,也不可能为每对主机提供最佳路径。

路由器的优缺点正好与交换机相反。能提供更加智能的路由选择,并能隔离广播域。通过路由选择协议为源和目的之间在多条冗余路径中选择一条最佳的路径。缺点:不是即插即用,网络管理员要为路由器的每个接口小心地配置IP地址,用户需要在他们的主机中配置默认路由器的IP地址。对每个分组处理时间通常比交换机更长,要进行从第一层到第三层的各种处理,其中包括比较复杂的最长前缀匹配,以及将IP数据报从一个数据链路层帧中取出再放入到另一个数据链路层帧中这些繁琐的处理。

如何选用:包含几百台主机的小网络,交换机就足够了。几千台主机的更大的网络,通常使用路由器。

三层交换机

现在常说的“三层交换机”的设备在逻辑上就是一个路由器和支持VLAN的二层交换机的集成体(如下图)。三层交换机可以很方便地直接将多个VLAN在IP层(第三层)进行互连。三层交换机通常不具有广域网接口,主要用于在局域网环境中互连同构的以太网,并起到隔离广播域的作用。

image-20210729140656358

当一台主机通过三层交换机与另一个VLAN中的主机进行通信时,三层交换机在处理它们之间的第一个IP数据报时,完全与一个普通路由器一样,要根据目的IP地址使用最长前缀匹配算法查找路由表,获得下一跳IP地址,并使用ARP获取下一跳IP地址对应的MAC地址,然后将IP数据报转发出去。

但三层交换机会将目的IP地址与下一跳MAC地址的映射关系记录在高速缓存中,当后续IP数据报到达时就不再通过最长匹配查找路由表了,而是根据目的IP地址直接从缓存中查找相应的下一跳MAC地址,并用自己的出口MAC地址和查找到的下一跳MAC地址直接替换包含该IP数据报的以太网帧的源和目的MAC地址(三层交换机连接的都是以太网),直接在第二层将帧转发出去。查找缓存、替换MAC地址全部由硬件完成,因此速度非常快,几乎没有第三层的处理。这就是所谓的“一次路由,多次转发/交换”。

虽然三层交换机的转发性能比普通路由器要高,但通常接口类型单一(一般就是以太网接口),支持的路由选择协议也较少。而路由器则不同,它的设计初衷就是为了互连不同类型的异构网络,如局域网与广域网之间的连接、不同协议的网络之间的连接等。因此路由器的接口类型非常丰富。

实际应用中:处于同一个局域网中的各个子网的互连及局域网中VLAN间的路由,用三层交换机来代替普通路由器,实现广播域的隔离。而只有局域网与广域网互连,或广域网之间互连时才使用普通路由器。

在逻辑上三层交换机就是路由器,“三层交换机”只不过是一类路由器产品的商业名称。

VPN 与 NAT

虚拟专用网VPN

由于IP地址的紧缺,一个机构能够申请到的IP地址数往往远小于本机构所拥有的主机数。考虑到因特网并不很安全,一个机构内也并不需要把所有的主机接入到外部的因特网。这就是说,让这些计算机使用仅在本机构有效的IP地址(本地地址),而不需要向因特网的管理机构申请全球唯一的IP地址(全球地址)。大大节约全球IP地址资源。

RFC 1918 指明了一些专用地址(private address)。这些地址只能用于一个机构的内部通信,而不能用于和因特网上的主机通信。在因特网中的所有路由器,对目的地址是专用地址的数据报一律不进行转发:

  1. 10.0.0.0 到 10.255.255.255 (或记为 10/8,它又称为 24 位块);
  2. 172.16.0.0 到 172.31.255.255 (或记为 172.16/12,它又称为 20 位块);
  3. 192.168.0.0 到 192.168.255.255 (或记为 192.168/16,它又称为 16 位块)。

采用这样的专用IP地址的互连网络称为专用互联网或本地互联网,就叫作专用网。

大机构有多个不同的专用网,如何互相通信呢?两种方法:第一种方法是租用电信公司的通信线路为本机构专用;这种方法的好处是简单方便,但线路的租金太高。第二种方法是利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网(Virtual Private Network,VPN);因为借助公网,因此VPN网络所有通过因特网传送的数据都必须加密。

下图示例说明如何使用IP隧道技术实现虚拟专用网。路由器R1和R2在和专用网内部网络的接口地址是专用网的本地地址。

image-20210729142859434

网络地址转换 NAT

1994年提出了一种网络地址转换(Network Address Translation,NAT)的方法再次缓解了 IP 地址空间耗尽的问题。这种方法需要在专用网络连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫作NAT路由器,它至少有一个有效的外部全球IP地址。

下图是一个简单的NAT路由器中有地址映射的示例:

image-20210729143111824

但以上方法存在一个问题:如果NAT路由器具有N个全球IP地址,那么至多只能有N个内网主机能够同时和因特网上的主机进行通信。为此有些 NAT路由器利用报文中的其他字段来区分使用同一外部地址的多对通信。这些字段包括:协议字段、目的地址,甚至运输层的端口号等。

例如NAT转发表中记录[内网IP,外网IP,目的IP],目的IP发回的数据报就可以经过NAT路由器转发表精准投递了。但显然此时多个内网主机不可同时访问同一个目的IP。还可以利用传输层的端口号来区分不同的报文,这种将端口号和IP地址一起进行转换的技术叫作网络地址与端口号转换(Network Address and Port Translation,NAPT),人们仍习惯将其称为NAT。

下图说明了NAPT的工作原理。当 NAPT 路由器收到来自内网主机 10.65.19.3 源端口号为3356的传输层分组时,不仅将内部IP地址转换为外部IP地址210.24.46.5,而且还将源端口号也转换为一个新的端口号5001(由NAPT路由器动态分配)。由于端口号字段有16比特,因此一个外部IP地址可支持60000多对内部主机与外部主机的通信。

image-20210729143231175

实际应用的 NAT 路由器基本上都具有 NAPT 功能。通常家用小型路由器就是一个NAPT路由器,这种设备往往集成了NAT、以太网交换机、无线接入点等多种功能。

NAT的一个重要特点就是通信必须由内部发起,因此拥有内部专用地址的主机不能直接充当因特网服务器。另外,由于NAT对外网屏蔽了内部主机的网络地址,能为专用网络的主机提供一定的安全保护。

IP多播

1988年,Steve Deering 首次提出 IP 多播的概念。1992年3月,IETF 在因特网范围首次试验IETF会议声音的多播,当时有20个网点可同时听到会议的声音。下面是单播和多播的示意图:

image-20210804111406172

因特网范围的多播要靠路由器来实现,能够运行多播协议的路由器称为多播路由器(multicast router)。多播路由器当然也可以转发普通的单播IP数据报。

在因特网的网络层进行的多播就叫作IP多播。多播数据报不可能在其首部写入所有多播组内主机的IP地址;写入的是多播组的标识符,然后设法让加入到这个多播组的主机的IP地址与多播组的标识符关联起来。

多播组的标识符用D类地址,范围是224.0.0.0到239.255.255.255。D类地址共可标志2的28次方个多播组。多播数据报和一般的IP数据报的区别就是它使用D类IP地址作为目的地址。多播地址只能用于目的地址。对多播数据报不产生 ICMP差错报文。因此,若在PING命令后面键入多播地址,将永远不会收到响应。

D类地址中有一些是不能随意使用的,因为有的地址已经被IANA指派为永久组地址。例如:

  • 224.0.0.0 基地址(保留)
  • 224.0.0.1 在本子网上的所有参加多播的主机和路由器
  • 224.0.0.2 在本子网上的所有参加多播的路由器
  • 224.0.0.3 未指派
  • 224.0.0.4 DVMRP 路由器
  • 224.0.1.0 至 238.255.255.255 全球范围都可使用的多播地址
  • 239.0.0.0 至 239.255.255.255 限制在一个组织的范围

IP多播分为两种。一种是只在本局域网上进行的硬件多播,另一种则是在因特网的范围进行的多播。

在局域网上进行硬件多播

由于局域网支持硬件多播(以太网链路层广播),只要把IP多播的地址映射成局域网的硬件多播地址,将IP多播数据报封装在局域网硬件MAC帧中,则可以很方便地利用硬件多播来实现局域网内的IP多播。

因特网号码指派管理局 IANA 将自己拥有的以太网地址块中从 01-00-5E-00-00-00 到01-00-5E-7F-FF-FF的多播地址块用于映射IP多播的地址。该地址块只能和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层利用软件进行过滤,把不是本主机要接收的数据报丢弃。

image-20210804124903427

广域网IP多播需要两种协议

多播路由器必须根据IP多播地址将IP多播数据报转发到有该多播组成员的局域网,怎样知道多播组的成员信息呢?这就需要使用:网际组管理协议(Internet Group Management Protocol,IGMP)。这能实现如下图所示多播数据报只转发给R1、R2、R3,而不转发给R4。

image-20210804200316054

IGMP 协议是让连接在本地局域网上的多播路由器知道本局域网上是否有主机(严格讲,是主机上的某个进程)参加或退出了某个多播组。IGMP使用IP数据报传递其报文(即IGMP报文加上IP首部构成IP数据报),但它也向IP提供服务。因此,我们不把IGMP看成是一个单独的协议,而是属于整个网际协议IP的一个组成部分。

还要多播路由选择协议,它的基本任务就是在多播路由器之间为每个多播组建立一个连接源和所有拥有该组成员的路由器的多播转发树(下图)。IP 多播数据报沿着多播转发树进行洪泛转发到相关多播路由器,然后在局域网内走硬件多播。

image-20210804201631783

网际组管理协议 IGMP

IGMP 已有了 3 个版本。2002年10月公布了 RFC3376(IGMPv3,建议标准)。

IGMP有3种类型的报文:成员查询报文、成员报告报文和离开组报文。

与ICMP类似,IGMP报文也是封装在一个IP数据报中传输的,其IP协议号为2。IGMP报文本身使用IP多播进行传送。多播IP数据报中的TTL被设置为1。因此,IGMP仅在本网络中有效。

1.加入多播组

当一个主机要加入某个多播组(即该主机上一个应用程序要加入该多播组),会向本网络中的路由器发送一个IGMP成员报告报文,报文包含多播组的地址。多播路由器会维护一个多播组列表,该表记录了该路由器所知的在本网络中有多播组成员的多播组地址。

2.监视成员变化

为了监视多播组成员的动态变化,多播路由器会周期性地(默认每隔125s)发送一个成员查询报文。这个报文被封装到目的地址为224.0.0.1(本网络的所有系统)的IP多播数据报中,在本网络上的所有参加多播的主机和路由器都会接收该报文。

3.离开多播组

当主机要退出一个多播组时,可主动发送一个离开组报文而不必等待路由器的查询。

多播路由选择协议

多播路由选择的基本任务就是在多播路由器之间为每个多播组建立一个连接所有成员路由器的多播转发树(上图)。

● 基于源树(source-based tree)多播路由选择。为一个多播组内的每个源构建一棵多播转发树。

● 组共享树(group-shared tree)多播路由选择。在每个多播组中指定一个中心路由器,在中心路由器构建多播转发树。组内所有源共享这个转发树,源将多播分组通过单播IP隧道发送到中心路由器,再由中心路由器将多播分组在共享树上进行洪泛。

1.基于源树多播路由选择

image-20210805110455184

2.共享树多播路由选择

image-20210805110556609

3.因特网的多播路由选择协议

目前还没有在整个因特网范围使用的多播路由选择协议。下面是一些建议使用的多播路由选择协议,其中前三个是基于源树的路由选择协议,而后两个是基于中心共享树的路由选择协议。

  • 距离向量多播路由选择协议(Distance Vector Multicast Routing Protocol,DVMRP)[RFC1075];
  • 开放最短通路优先的多播扩展(Multicast extensions to OSPF,MOSPF)[RFC 1585];
  • 协议无关多播-稀疏方式(Protocol Independent Multicast-Sparse Mode,PIM-SM)[RFC 2362];
  • 基于核心的转发树(Core Based Tree,CBT)[RFC 2189, 2201];
  • 协议无关多播-密集方式(Protocol Independent Multicast-Dense Mode,PIM-DM)[RFC 3973]。

至今IP多播在因特网上还没有得到大规模的应用。这是因为改变一个部署广泛并成功运行的网络层协议是一件极为困难的事情。目前IP多播还主要只应用在一些局部的园区网络、专用网络或者虚拟专用网络中。

而在另一方面,P2P 技术的广泛应用推动了应用层多播技术的发展,许多视频流公司和内容分发公司通过构建自己的应用层多播覆盖网络来分发它们的内容。不过以上多播路由选择的算法思想在应用层多播中依然适用。

(完)