(★★)代表非常重要的知识点,(★)代表重要的知识点。
一、地址解析协议(ARP)(★★)
在局域网中,由于硬件地址已固化在网卡上的 ROM 中,因此常常将硬件地址称为物理地址。因为在局域网的 MAC 帧中的源地址和目的地址都是硬件地址,因此硬件地址又称为 MAC 地址。即物理地址、硬件地址和 MAC 地址常常作为同义词出现。
1. IP 地址与 MAC 地址
从层次的角度看,MAC 地址是数据链路层和物理层使用的地址,而 IP 地址是网络层和以上各层使用的地址,是一种逻辑地址(称 IP 地址为逻辑地址是因为 IP 地址是用软件实现的)。下图说明了这两种地址的区别。
在发送数据时,数据从高层下到低层,然后才到通信链路上传输。使用 IP 地址的 IP 数据报一旦交给了数据链路层,就被封装成 MAC 帧了。MAC 帧在传送时使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在 MAC 帧的首部中。
连接在通信链路上的设备(主机或路由器)在收到 MAC 帧时,根据 MAC 帧首部中的硬件地址决定收下或丢弃。只有在剥去 MAC 帧的首部和尾部后把 MAC 层的数据上交给网络层后,网络层才能在 IP 数据报的首部中找到源 IP 地址和目的 IP 地址。
总之, IP 地址放在 IP 数据报的首部,而硬件地址则放在 MAC 帧的首部。在网络层和网络层以上使用的是 IP 地址,而数据链路层及以下使用的是 MAC 地址。在上图中,当 IP 数据报放入数据链路层的 MAC 帧中以后,整个的 IP 数据报就成为 MAC 帧的数据,因而在数据链路层看不见数据报的 IP 地址。
IP 地址是分层式的,硬件地址(MAC 地址)是平面式的。因为路由器的隔离,IP 网络中无法通过广播 MAC 地址来完成跨网络的寻址,所以在网络层只使用 IP 地址来完成寻址。寻址时,每个路由器依据其路由表(依路由协议生成)选择到目标网络(即主机号全为 0 的网络地址)需要转发到的下一跳(路由器的物理端口号或下一网络地址),而 IP 数据报通过多次路由转发到达目标网络后,改为在目标局域网中通过数据链路层的 MAC 地址以广播方式寻址。这样可以提高路由选择的效率。
下图画的是三个局域网用两个路由器 R~1~ 和 R~2~ 互连起来。现在主机 H~1~ 要和主机 H~2~ 通信。这两台主机的 IP 地址分别是 IP~1~ 和 IP~2~ ,而它们的硬件地址分别为 HA~1~ 和 HA~2~(HA 表示 Hardware Address) 。通信的路径是: H~1~ → 经过 R~1~ 转发 → 再经过 R~2~ 转发 → H~2~ 。路由器 R~1~ 因同时连接到两个局域网上,因此它有两个硬件地址,即 HA~3~ 和 HA~4~ 。同理,路由器 R~2~ 也有两个硬件地址 HA~5~ 和 HA~6~ 。
上图特别强调了 IP 地址与 MAC 地址的区别。下图归纳了这种区别。
这里要强调指出以下几点:
-
在 IP 层抽象的互联网上只能看到 IP 数据报。虽然 IP 数据报要经过路由器 R~1~ 和 R~2~ 的两次转发,但在它的首部中的源地址和目的地址始终分别是 IP~1~ 和 IP~2~ 。图中的数据报上写的"从 IP~1~ 到 IP~2~ "就表示前者是源地址而后者是目的地址。数据报中间经过的两个路由器的 IP 地址并不出现在 IP 数据报的首部中。
-
虽然在 IP 数据报首部有源站 IP 地址,但路由器只根据目的站的 IP 地址的网络号进行路由选择。
-
在局域网的链路层,只能看见 MAC 帧。IP 数据报被封装在 MAC 帧中。MAC 帧在不同网络上传送时,其 MAC 帧首部中的源地址和目的地址要发生变化。这也决定了无法使用 MAC 地址跨网络通信。
开始在 H~1~ 到 R~1~ 间传送时, MAC 帧首部中写的是从硬件地址 HA~1~ 发送到硬件地址 HA~3~,路由器 R~1~ 收到此 MAC 帧后,在数据链路层,要丢弃原来的 MAC 帧的首部和尾部。在转发时,在数据链路层,要重新添加上 MAC 帧的首部和尾部。这时首部中的源地址和目的地址分别便成为 HA~4~ 和 HA~5~ 。路由器 R~2~ 收到此帧后,再次更换 MAC 帧的首部和尾部,首部中的源地址和目的地址分别变成为 HA~6~ 和 HA~2~ 。MAC 帧的首部的这种变化,在上面的 IP 层上是看不见的。
- 尽管互连在一起的网络的硬件地址体系各不相同,但 IP 层抽象的互联网却屏蔽了下层这些很复杂的细节。只要我们在网络层上讨论问题,就能够使用统一的、抽象的 IP 地址研究主机和主机或路由器之间的通信。
上述的这种"屏蔽"概念是一个很有用、很普遍的基本概念。例如,计算机中广泛使用的图形用户界面使得用户只需简单地点击几下鼠标就能让计算机完成很多任务。实际上计算机要完成这些任务必须执行很多条指令。但这些复杂的过程全都被设计良好的图形用户界面屏蔽掉了,使用户看不见这些复杂过程。
路由器因为互连多个网络,所以它不仅有多个 IP 地址,而且有多个硬件地址。
那么主机或路由器怎样知道应当在 MAC 帧的首部填入什么样的硬件地址?这就是我们接下来要讨论的问题了。
2. 地址解析协议的概念
无论网络层(使用的是 IP 地址)使用什么协议,在实际网络的链路上传送数据帧时,最终必须使用网络的硬件地址。所以需要一种方法来完成 IP 地址到 MAC 地址的映射,这就是地址解析协议(Address Resolution Protocol,ARP)。下图展示了 ARP 协议的作用。
但 IP 地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系(例如, IP 地址有 32 位,而局域网的硬件地址是 48 位)。此外,在一个网络上可能经常会有新的主机加入进来,或撤走一些主机。更换网络适配器也会使主机的硬件地址改变。地址解析协议 ARP 解决这个问题的方法是在主机 ARP 高速缓存中存放一个从 IP 地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)。
每台主机都设有一个 ARP 高速缓存(ARP cache),用来存放本局域网上各主机和路由器的 IP 地址到 MAC 地址的映射表,称 ARP 表。使用 ARP 来动态维护 ARP 表。
3. 地址解析协议的工作原理
举一个例子:
当主机 A 要向本局域网上的某台主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如有,就在 ARP 高速缓存中查出其对应的硬件地址,再把这个硬件地址写入 MAC 帧,然后通过局域网把该 MAC 帧发往此硬件地址。
也有可能查不到主机 B 的 IP 地址的项目。这可能是主机 B 才入网,也可能是主机 A 刚刚加电,其高速缓存还是空的。在这种情况下,主机 A 就自动运行 ARP,然后按以下步骤找出主机 B 的硬件地址。
-
ARP 进程在本局域网上广播发送一个 ARP 请求分组(目的 MAC 地址为 FF-FF-FF-FF-FF-FF 的帧)。下图(a)是主机 A 广播发送 ARP 请求分组的示意图。ARP 请求分组的主要内容是:"我的 IP 地址是 209.0.0.5 , 硬件地址是 00-00-C0-15-AD-18 。我想知道 IP 地址为 209.0.0.6 的主机的硬件地址。"
-
在本局域网上的所有主机上运行的 ARP 进程都收到此 ARP 请求分组。
-
主机 B 的 IP 地址与 ARP 请求分组中要查询的 IP 地址一致,就收下这个 ARP 请求分组,并向主机 A 发送 ARP 响应分组(单播发送),同时在这个 ARP 响应分组中写入自己的硬件地址。由于其余的所有主机的 IP 地址都与 ARP 请求分组中要查询的 IP 地址不一致,因此都不理睬这个 ARP 请求分组,见下图(b)。ARP 响应分组的主要内容是:"我的 IP 地址是 209.0.0.6 , 我的硬件地址是 08-00-2B-00-EE-0A 。"
请注意:虽然 ARP 请求分组是广播发送的,但 ARP 响应分组是普通的单播,即从一个源地址发送到一个目的地址。
下图是 ARP 的工作原理示意图:
- 主机 A 收到主机 B 的 ARP 响应分组后,就在其 ARP 高速缓存中写入主机 B 的 IP 地址到硬件地址的映射。然后按查询到的硬件地址发送 MAC 帧。
ARP 因为"看到了" IP 地址,所以它工作在网络层,而 NAT 路由器因为"看到了"端口,所以它工作在传输层。
ARP 用于解决同一局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。若目的主机和源主机不在同一个局域网上,则要通过 ARP 找到本局域网上的某个路由器的硬件地址然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络,剩下的工作就由下个网络来做。
4. 地址解析协议的拓展知识
当主机 A 向 B 发送数据报时,很可能以后不久主机 B 还要向 A 发送数据报,因而主机 B 也可能要向 A 发送 ARP 请求分组。为了减少网络上的通信量,主机 A 在发送其 ARP 请求分组时,就把自己的 IP 地址到硬件地址的映射写入 ARP 请求分组。当主机 B 收到 A 的 ARP 请求分组时,就把主机 A 的这一地址映射写入主机 B 自己的 ARP 高速缓存中。以后主机 B 向 A 发送数据报时就很方便了。
可见 ARP 高速缓存非常有用。如果不使用 ARP 高速缓存,那么任何一台主机只要进行一次通信,就必须在网络上用广播方式发送 ARP 请求分组,这就使网络上的通信量大大增加。ARP 把已经得到的地址映射保存在高速缓存中,这样就使得该主机下次再和具有同样目的地址的主机通信时,可以直接从高速缓存中找到所需的硬件地址而不必再用广播方式发送 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~2~ 的硬件地址(实际上主机 H~1~ 也不需要知道远程主机 H~2~ 的硬件地址)。主机 H~1~ 发送给 H~2~ 的 IP 数据报首先需要通过与主机 H~1~ 连接在同一个局域网上的路由器 R~1~ 来转发。因此主机 H~1~ 这时需要把路由器 R~2~ 的 IP 地址 IP~3~ 解析为硬件地址 HA~3~ ,以便能够把 IP 数据报传送到路由器 R~1~ 。以后, R~1~ 从转发表找出了下一跳路由器 R~2~ ,同时使用 ARP 解析出 R~2~ 的硬件地址 HA~5~ 。于是 IP 数据报按照硬件地址 HA~5~ 转发到路由器 R~2~ 。路由器 R~2~ 在转发这个 IP 数据报时用类似方法解析出目的主机压的硬件地 HA~2~ ,使 IP 数据报最终交付主机 H~2~ 。
从 IP 地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信, ARP 协议就会自动地把这个 IP 地址解析为链路层所需要的硬件地址。
5. 使用 ARP 的 4 种典型情况
下面我们归纳出使用 ARP 的四种典型情况,如下图所示:
-
发送方是主机(如 H~1~) ,要把 IP 数据报发送到同一个网络上的另一台主机(如 H~2~) 。这时 H~1~ 发送 ARP 请求分组(在网 1 上广播),找到目的主机 H~2~ 的硬件地址。
-
发送方是主机(如 H~1~) ,要把 IP 数据报发送到另一个网络上的一台主机(如 H~3~ 或 H~4~)。这时 H~1~ 发送 ARP 请求分组(在网 1 上广播),找到网 1 上的一个路由器 R~1~ 的硬件地址(默认网关)。剩下的工作由路由器 R~1~ 来完成。R~1~ 要做的事情是下面的两个步骤之一。
开始在 H~1~ 和 R~1~ 之间传送时,MAC 帧首部中的源地址是 H~1~ 的 MAC 地址,目的地址是 L~1~ 的硬件地址,路由器 R~1~ 收到此 MAC 帧后,在数据链路层,要丢弃原 MAC 的首部和尾部。这时首部中的源地址和目的地址分别为 L~2~ 和 L~3~ 的 MAC 地址。路由器 R~2~ 收到此帧后,再次更换 MAC 帧的首部和尾部,首部中的源地址和目的地址分别变为 L~4~ 和 H~4~ 的 MAC 地址。MAC 帧首部的这种变化,在上面的 IP 层中是看不见的。
-
发送方是路由器(如 R~1~) ,要把 IP 数据报转发到与 R~1~ 连接在同一个网络(网 2)上的主机(如 H~3~) 。这时 R~1~ 发送 ARP 请求分组(在网 2 上广播),找到目的主机 H~3~ 的硬件地址。
-
发送方是路由器(如 R~1~) ,要把 IP 数据报转发到网 3 上的一台主机(如 H~4~)。H~4~ 与 R~1~ 不是连接在同一个网络上。这时 R~1~ 发送 ARP 请求分组(在网 2 上广播),找到连接在网 2 上的一个路由器 R~2~ 的硬件地址。剩下的工作由这个路由器 R~2~ 来完成。
在许多情况下需要多次使用 ARP 。但这只是以上几种情况的反复使用而已。
【思考】大家可能会产生这样的问题:既然在网络链路上传送的帧最终是按照硬件地址找到目的主机的,那么为什么我们还要使用抽象的 IP 地址,而不直接使用硬件地址进行通信? 这样似乎可以免除使用 ARP 。
【答】由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此由用户或用户主机来完成这项工作几乎是不可能的事。但 IP 编址把这个复杂问题解决了。连接到互联网的主机只需各自拥有一个唯一的 IP 地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为上述的调用 ARP 的复杂过程都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。
因此,在虚拟的 IP 网络上用 IP 地址进行通信给广大的计算机用户带来很大的方便。
二、动态主机配置协议(DHCP)(★★)
1. 动态主机配置协议的概念
动态主机配置协议(Dynamic Host Configuration Protocol, DHCP)常用于给主机动态地分配 IP 地址,它提供了即插即用的联网(plug-and-play networking)机制,这种机制允许一台计算机加入新的网络和自动获取地址而不用手工参与。DHCP 是应用层协议,它是基于 UDP 的。
现在的 DHCP 协议已经包含了 RARP 协议的功能。RARP 的作用是使只知道自己硬件地址的主机能够通过 RARP 协议找出其 IP 地址。
2. 动态主机配置协议的工作原理
DHCP 使用客户 / 服务器方式。需要 IP 地址的主机在启动时就向 DHCP 服务器广播发送发现报文(DHCPDISCOVER)(将目的 IP 地址置为全 1 ,即 255.255.255.255 ),这时该主机就成为 DHCP 客户。
发送广播报文是因为现在还不知道 DHCP 服务器在什么地方,因此要发现(DISCOVER)DHCP 服务器的 IP 地址。这台主机目前还没有自己的 IP 地址,因此它将 IP 数据报的源 IP 地址设为全 0,即 0.0.0.0 。
这样,本地网络上的所有主机都能收到这个广播报文,但只有 DHCP 服务器才能回答此广播报文。DHCP服务器先在其数据库中查找该计算机的配置信息。若找到,则返回找到的信息;若找不到,则从服务器的 IP 地址池(address pool)中取一个地址分配给该计算机。DHCP 服务器的回答报文称为提供报文(DHCPOFFER),表示"提供"了 IP 地址等配置信息。
DHCP 服务器和 DHCP 客户的交换过程如下:
-
DHCP 客户广播" DHCP 发现"消息,试图找到网络中的 DHCP 服务器,以便从 DHCP 服务器获得一个 IP 地址。源地址为 0.0.0.0,目的地址为 255.255.255.255 。
-
DHCP 服务器收到" DHCP 发现"消息后,广播" DHCP 提供"消息,其中包括提供给 DHCP 客户机的 IP 地址。源地址为 DHCP 服务器地址,目的地址为 255.255.255.255 。
-
DHCP 客户收到" DHCP 提供"消息,若接受该 IP 地址,则广播" DHCP 请求"消息向 DHCP 服务器请求提供 IP 地址。源地址为 0.0.0.0 ,目的地址为 255.255.255.255 。
-
DHCP 服务器广播" DHCP 确认"消息,将 IP 地址分配给 DHCP 客户。源地址为 DHCP 服务器地址,目的地址为 255.255.255.255 。
3. 动态主机配置协议的拓展知识
但是我们并不愿意在每一个网络上都设置一个 DHCP 服务器,因为这样会使 DHCP 服务器的数量太多。因此现在是使每一个网络至少有一个 DHCP 中继代理(relay agent)(通常是一台路由器,见下图),它配置了 DHCP 服务器的 IP 地址信息。当 DHCP 中继代理收到主机 A 以广播形式发送的发现报文后,就以单播方式向 DHCP 服务器转发此报文,并等待其回答。收到 DHCP 服务器回答的提供报文后, DHCP 中继代理再把此提供报文发回给主机 A 。需要注意的是,下图只是个 DHCP 中继代理以单播方式转发发现报文的示意图。实际上, DHCP 报文只是 UDP 用户数据报的数据,它还要加上 UDP 首部、IP 数据报首部,以及以太网的 MAC 帧的首部和尾部后,才能在链路上传送。
DHCP 服务器分配给 DHCP 客户的 IP 地址是临时的,因此 DHCP 客户只能在一段有限的时间内使用这个分配到的 IP 地址。DHCP 协议称这段时间为租用期(lease period),但并没有具体规定租用期应取为多长或至少为多长,这个数值应由 DHCP 服务器自己决定。
例如,一个校园网的 DHCP 服务器可将租用期设定为 1 小时。DHCP 服务器在给 DHCP 发送的提供报文的选项中给出租用期的数值。按照 RFC 2132 的规定,租用期用 4 字节的二进制数字表示,单位是秒。因此可供选择的租用期范围从 1 秒到 136 年。DHCP 客户也可在自己发送的报文中(例如,发现报文)提出对租用期的要求。
DHCP 是应用层协议,因为它是通过客户 / 服务器模式工作的,DHCP 客户向 DHCP 服务器请求服务,而其他层次的协议是没有这两种工作方式的。
【问】DHCP 客户和服务器端为什么需要通过广播方式来进行交互?
【答】原因是在 DHCP 执行初期,客户机不知道服务器端的 IP 地址,而在执行中间,客户机并未被分配 IP 地址,从而导致两者之间的通信必须采用广播的方式。
【问】为什么采用 UDP 而不采用 TCP ?
【答】原因也很明显:TCP 需要建立连接,若连对方的 IP 地址都不知道,则更不可能通过双方的套接字建立连接。
4. 动态主机配置协议的工作过程
DHCP 协议的详细工作过程如下图所示。DHCP 客户使用的 UDP 端口是 68 ,而 DHCP 服务器使用的 UDP 端口是 67 。这两个 UDP 端口都是熟知端口。
下面按照图中的注释编号(① 至 ⑨)进行简单的解释:
-
① DHCP 服务器被动打开 UDP 端口 67 ,等待客户端发来的报文。
-
② DHCP 客户从 UDP 端口 68 发送 DHCP 发现报文。
-
③ 凡收到 DHCP 发现报文的 DHCP 服务器都发出 DHCP 提供报文,因此 DHCP 客户可能收到多个 DHCP 提供报文。
DHCP 允许网络上配置多台 DHCP 服务器,当 DHCP 客户发出" DHCP 发现"消息时,有可能收到多个应答消息。这时,DHCP 客户只会挑选其中的一个,通常挑选最先到达的。
-
④ DHCP 客户从几个 DHCP 服务器中选择其中的一个,并向所选择的 DHCP 服务器发送 DHCP 请求报文。
-
⑤ 被选择的 DHCP 服务器发送确认报文 DHCPACK 。从这时起, DHCP 客户就可以使用这个 IP 地址了。这种状态叫做已绑定状态,因为在 DHCP 客户端的 IP 地址和硬件地址已经完成绑定,并且可以开始使用得到的临时 IP 地址了。
DHCP 客户现在要根据服务器提供的租用期 T 设置两个计时器 T~1~ 和 T~2~ ,它们的超时时间分别是 0.5 倍 T 和 0.875 倍 T 。当超时时间到了就要请求更新租用期。
-
⑥ 租用期过了一半(T~1~ 时间到), DHCP 发送请求报文 DHCPREQUEST 要求更新租用期。
-
⑦ DHCP 服务器若同意,则发回确认报文 DHCPACK 。DHCP 客户得到了新的租用期,重新设置计时器。
-
⑧ DHCP 服务器若不同意,则发回否认报文 DHCPNACK 。这时 DHCP 客户必须立即停止使用原来的 IP 地址,而必须重新申请 IP 地址(回到步骤②)。
-
若 DHCP 服务器不响应步骤 ⑥ 的请求报文 DHCPREQUEST ,则在租用期过了 87.5% 时(T~2~ 时间到),DHCP 客户必须重新发送请求报文 DHCPREQUEST(重复步骤⑥),然后又继续后面的步骤。
-
⑨ DHCP 客户可以随时提前终止服务器所提供的租用期,这时只需向 DHCP 服务器发送释放报文 DHCPRELEASE 即可。
【拓展】:DHCP 很适合于经常移动位置的计算机。当计算机使用 Windows 操作系统时,点击"控制面板"的"网络"图标就可以找到某个连接中的"网络"下面的菜单,找到 TCP/IP 协议后点击其"属性"按钮,若选择"自动获得 IP 地址"和"自动获得 DNS 服务器地址",就表示是使用 DHCP 协议。
三、网际控制报文协议(ICMP)(★★)
1. 网际控制报文协议的概念
为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议(Internet Control Message Protocol, ICMP)。ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。
ICMP 是互联网的标准协议。但 ICMP 不是高层协议(看起来好像是高层协议,因为 ICMP 报文是装在 IP 数据报中,作为其中的数据部分),而是 IP 层的协议。ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。ICMP 报文格式如下图所示。
2. ICMP 报文的种类
ICMP 报文的种类有两种:即 ICMP 差错报告报文和 ICMP 询问报文。
ICMP 报文的前 4 个字节是统一的格式,共有三个字段:类型、代码和检验和。接着的 4 个字节的内容与 ICMP 的类型有关。最后面是数据字段,其长度取决于 ICMP 的类型。下图给出了几种常用的 ICMP 报文类型。
ICMP 标准在不断更新。已不再使用的 ICMP 报文有:"信息请求与回答报文"、"地址掩码请求与回答报文"、"路由器请求与通告报文"以及"源点抑制报文"。现在不再把这几种报文列入。
① ICMP 报文的代码字段是为了进一步区分某种类型中的几种不同情况。
② 检验和字段用来检验整个ICMP 报文。
我们应当还记得, IP 数据报首部的检验和并不检验 IP 数据报的内容,因此不能保证经过传输的 ICMP 报文不产生差错。
上图给出的 ICMP 差错报告报文用于目标主机或到目标主机路径上的路由器,向源主机报告差错和异常情况。共有以下四种常用的类型,即:
-
终点不可达:当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。
-
时间超过:当路由器收到生存时间(TTL)为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
-
参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
-
改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。
-
源点抑制:当路由器或主机因为拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。【已不再使用,了解即可】
下面对改变路由报文进行简短的解释。我们知道,在互联网的主机中也要有一个路由表。当主机要发送数据报时,首先是查找主机自己的路由表,看应当从哪一个接口把数据报发送出去。在互联网中主机的数量远大于路由器的数量,出于效率的考虑,这些主机不和连接在网络上的路由器定期交换路由信息。在主机刚开始工作时,一般都在路由表中设置一个默认路由器的 IP 地址。不管数据报要发送到哪个目的地址,都一律先把数据报传送给这个默认路由器,而这个默认路由器知道到每一个目的网络的最佳路由(通过和其他路由器交换路由信息)。如果默认路由器发现主机发往某个目的地址的数据报的最佳路由应当经过网络上的另一个路由器 R 时,就用改变路由报文把这情况告诉主机。于是,该主机就在其路由表中增加一个项目:到某某目的地址应经过路由器 R (而不是默认路由器)。
所有的 ICMP 差错报告报文中的数据字段都具有同样的格式(如下图所示为 ICMP 差错报告报文的数据字段的内容) 。把收到的需要进行差错报告的 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 差错报告报文。
ICMP 询问报文有 4 种类型:回送请求和回答报文、时间请求和回答报文、地址掩码请求和回答报文、路由器询问和通告报文,最常用的是前两类。即:
-
回送请求和回答:ICMP 回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
-
时间戳请求和回答:ICMP 时间戳请求报文是请某台主机或路由器回答当前的日期和时间。在 ICMP 时间戳回答报文中有一个 32 位的字段,其中写入的整数代表从 1900 年 1 月 1 日起到当前时刻一共有多少秒。时间戳请求与回答可用于时钟同步和时间测量。
3. ICMP 的应用举例
1)PING
ICMP 的一个重要应用就是分组网间探测 PING(Packet lnterNet Groper),用来测试两台主机之间的连通性。PING 使用了 ICMP 回送请求与回送回答报文。PING 是应用层直接使用网络层 ICMP 的一个例子。它没有通过传输层的 TCP 或 UDP 。
Windows 操作系统的用户可在接入互联网后转入 MS DOS(点击"开始",点击"运行",再键"cmd") 。看见屏幕上的提示符后,就键入"ping hostname"(这里的 hostname 是要测试连通性的主机名或它的 IP 地址),按回车键后就可看到结果。
2)Traceroute / Tracert
另一个非常有用的应用是 traceroute(这是 UNIX 操作系统中名字),它用来跟踪一个分组从源点到终点的路径。在 Windows 操作系统中这个命令是 tracert 。下面简单介绍这个程序的工作原理:
-
Traceroute 从源主机向目的主机发送一连串的 IP 数据报,数据报中封装的是无法交付的 UDP 用户数据报。第一个数据报 P~1~ 的生存时间 TTL 设置为 1 。当 P~1~ 到达路径上的第一个路由器 R~1~ 时,路由器 R~1~ 先收下它,接着把 TTL 的值减 1 。由于 TTL 等于零了,R~1~ 就把 P~1~ 丢弃了,并向源主机发送一个 ICMP 时间超过差错报告报文。
-
源主机接着发送第二个数据报 P~2~ ,并把 TTL 设置为 2 。P~2~ 先到达路由器 R~1~ ,R~1~ 收下后把 TTL 减 1 再转发给路由器 R~2~ 。R~2~ 收到 P~2~ 时TTL 为 1 ,但减 1 后 TTL 变为零了。R~2~ 就丢弃 P~2~ ,并向源主机发送一个 ICMP 时间超过差错报告报文。
-
这样一直继续下去。当最后一个数据报刚刚到达目的主机时,数据报的 TTL 是 1 。主机不转发数据报,也不把 TTL 值减 1 。但因 IP 数据报中封装的是无法交付的运输层的 UDP 用户数据报,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
-
这样,源主机达到了自己的目的,因为这些路由器和最后目的主机发来的 ICMP 报文正好给出了源主机想知道的路由信息到达目的主机所经过的路由器的 IP 地址,以及到达其中的每一个路由器的往返时间。
我们还应注意到,从原则上讲, IP 数据报经过的路由器越多,所花费的时间也会越多。但有时正好相反。这是因为互联网的拥塞程度随时都在变化,也很难预料到。因此,完全有这样的可能:经过更多的路由器反而花费更少的时间。
注意:PING 工作在应用层,它直接使用网络层的 ICMP;Traceroute / Tracert 工作在网络层。