<tcp/ip详解卷一>阅读笔记(2)——IP层的分用(ICMP)

这一次将从ip首部中的“协议”字段的分用说开来。前面的图中我们可以看到,所有的TCP、UDP、ICMP及IGMP数据都以ip数据报格式传输。TCP段、UDP数据报文将交付到上一层即应用层,而ICMP及IGMP报文则由tcp/ip协议模块处理,不会支付到用户应用层。

1. ICMP:Internet控制报文协议

ICMP报文是在ip数据报内部被传输的,除去ip首部,其基本格式如下:



有些icmp报文用于查询,有些icmp报文用于差错报告,各种类型的icmp报文如下图所示:

对ICMP差错报文和ICMP查询报文的处理不同,在对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文。当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节,这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或者UDP首部中的TCP或UDP端口号来判断)。

下面各种情况都不会导致产生ICMP差错报文:

(1)ICMP差错报文(但是ICMP查询报文可能会产生ICMP差错报文)

(2)目的地址是广播地址或多地址或多播地址的IP数据报

(3)作为链路层广播的数据报

(4)不是IP分片的第一片

(5)源地址不是单个主机的数据报

2. ICMP查询报文

列表中提到的查询报文,包括回显应答/请求、路由器通告/请求、时间戳请求/应答和地址掩码请求/应答,《tcp/ip...》这本书基本都作了介绍。

首先是子网掩码请求/应答报文,它用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的ICMP请求报文,其格式如下:

ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回,这样发送端就可以把应答与请求进行匹配。

ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time, UTC),它提供了毫秒级的分辨率,其报文格式如下:

请求端填写发起时间戳,应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。其中各项在时间线上的位置如下:

回显请求/应答即我们平时使用的ping程序使用的报文。ping的目的是为了测试另一台主机是否可达,该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。大多数的TCP/IP实现都在内核中直接支持ping服务器(因此也可以设置为关闭该服务器),ICMP回显请求/应答报文的格式如下:

前面我们提到过IP选项中有一个记录路由选项,ping程序通过加-r指令可以在ip数据报的首部加入记录路由选项,这样,每个处理该数据报的路由器都把它的ip地址放入选项字段中,当数据报到达目的端时,ip地址清单应该复制到ICMP回显应答中,这样返回途中所经过的路由器地址也被加入清单中。但是,ip报文的首部只有40个字节的空间来存放RR选项,RR选项的一般格式如下:

code是一个字节,指明ip选项的类型。对于RR选项来说,它的值为7,len是RR选项总字节长度,在这种情况下为39,ptr称作指针字段,它是一个基于1的指针,指向存放下一个IP地址的位置。它的最小值为4,指向存放第一个ip地址的位置。随着每个IP地址存入清单,ptr的值分别为8,12最大到36.当记录下9个IP地址后,ptr的值为40,表示清单已满。

除了可以在ping发送的ICMP回显报文的IP首部中加入RR选项外,也可以加入IP时间戳选项,格式与上面差不多,只不过多了一个用于描述溢出字段和标志字段。

还有最后一种ICMP查询报文,即路由器通告/回显报文,它用于IP选路。选路是IP最重要的功能之一。前面我们有提到过IP路由选择时搜索路由表的几个步骤(这是选路机制):

(1)搜索匹配的主机地址

(2)搜索匹配的网络地址

(3)搜索默认表项。

下图描述了IP层处理过程的简单流程:

系统通过三种途径改变路由表的表项,一个是route命令,由管理员手动配置路由,一个是ICMP重定向报文,这是一种只能由路由器生成的ICMP差错报文,最后一个则是路由守护程序,路由守护程序是一个应用程序,它通过发送ICMP路由器请求报文,接收ICMP路由器通告报文来获知相邻的网络情况。ICMP路由器请求报文、路由器通告报文的格式如下:

路由器通告报文中,地址数字段说明该报文中共包含多少个路由器地址,地址项长度是指每个路由器地址32bit字的数目,在ipv4中始终为2,生存时间字段指的是通告地址有效时间(以秒为单位)。

开始的时候我一直在想,路由器请求/通告报文跟RIP到底是什么关系呢?后来仔细看了几遍书中关于它的介绍,猜测觉着,路由器请求/通告报文是同一子网中主机与路由器之间的通信(而RIP是路由器与路由器之间的通信),这个通信过程由应用层的路由守护进程完成,“它只增加或删除默认表项。守护程序必须把它配置成一台路由器或主机来使用”,因为路由器跟主机的操作是不一样的,路由器启动后负责发送路由器通告并监听来自主机的路由器请求;而主机启动后则发送路由器请求,并监听来自路由器的路由器通告。

3. 动态选路协议

当相邻的路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路。路由器之间必须采用选路协议进行通信,这样的协议有很多种,如RIP、OSPF,路由守护进程运行选路协议,并与其相邻的一些路由器进行通信。路由守护程序将选路策略加入到系统中,选择路由并加入到内核的路由表中。如果守护程序发现前往同一信宿存在多条路由,那么它将(以某种方法)选择最佳路由并加入内核路由表中。如果路由守护程序发现一条链路已经断开,它可以删除受影响的路由或加入另一条路由以绕过该问题。

在像Internet这样的系统中,目前采用了许多不同的选路协议。Internet是以一组自治系统的方式组织的,每个自治系统通常由单个实体管理。常常将一个公司或大学校园定义为一个自治系统。每个自治系统可以选择该自治系统中各个路由器之间的选路协议,这种协议称之为内部网关协议(IGP),常用的IGP有RIP和OSPF。不同自治系统的路由器之间进行通信协议称为外部网关协议(BGP)。

《tcp/ip》这本书对相应的算法并没有详细的描述,我打算之后重新看回本科的《计算机网络》再做一下总结。

4. ICMP差错报文

ICMP报文列表中列出了多种ICMP差错报文,这本书只介绍了其中的一些。

首先是ICMP不可达报文,其格式如下:

对于ICMP端口不可达差错(代码为3),接收该差错报文的系统通过读取ICMP报文内容中的差错IP报文首部,从而知道如何解释报文首部后面的8个字节(是TCP还是UDP?),通过解释后面的8个字节(目的端口号和源端口号),将知道该差错是由哪个应用进程(源端口号)引起的,是哪个目的端口不可达。

前面我们看到,每个路由器或主机中都会有一张路由表,路由表里面一般都有一个默认选项,在找不到主机或网络号匹配的下一站路由器时,路由机制都会选择其默认网关。顶层选路域维护大多数Internet网站的信息,而不使用默认路由,当路由器收到一份IP数据报但又不能转发时(没有默认路由),就要发送一份“ICMP主机不可达”差错报文(代码为1)给发送该IP报文的主机。

ICMP “超时”报文的格式与ICMP不可达报文的格式基本一致,除了类型值与代码值不同外。当路由器收到一份IP数据报,如果其TTL值字段是0或1,则路由器不转发该数据报(接收到这种数据报的目的主机可以将它交给应用程序,因为主机不需要转发该数据报,但是通常情况下,系统不应该接收TTL值为0的数据报)。路由器将该数据报丢弃,并给信源机发送一份ICMP超时报文。

ICMP超时+ICMP端口不可达+TTL是traceroute程序的工作原理。traceroute程序发送一份TTL字段为1的IP数据报文给目的主机,处理这份数据报的第一个路由器将其TTL值减1,丢弃该数据报,并发回一份ICMP超时报文,通过报文中的信源地址我们将得到该路由器的地址;接着,traceroute发送一份TTL值为2的IP数据报文给目的主机,这样,第二个路由器将发回一份ICMP超时报文,....,直到最后该报文到达目的主机并被接收,那么如何判断报文已经到达目的主机了呢?traceroute将选择一个不可能的值作为目的端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口,这样,目的主机收到该报文时,将产生一份“ICMP端口不可达”报文给,这样,当traceroute收到的ICMP报文是“目的端口不可达”时,可以判断已经完成了整个traceroute的过程。记得IP首部中的“选项”部分还可以设置“严格的源站选路”和“宽松的源站选路”选项,可以在traceroute发送的IP数据报首部中加入该选项,来规划traceroute的路径。

书中还介绍了ICMP重定向差错报文。当IP数据报应该被发送到另一个路由器上时,收到数据报的路由器(发现出接口等于入接口)就要发送ICMP重定向差错报文给IP数据报的发送端,我们在之前的IP层处理过程,还有另一个可以修改路由表的源,就是ICMP重定向差错报文,其格式如下:

 

ICMP重定向接收者必须查看三个IP地址:(1)导致重定向的IP地址(即ICMP重定向报文的数据中产生差错的数据报IP首部);(2)发送重定向报文的路由器(包含重定向信息的IP数据报的源地址);(3)应该采用的路由器IP地址(在ICMP数据报文中)。

关于ICMP重定向报文有很多规则。首先,重定向报文只能由路由器生成;另外,重定向报文是为主机而不是为路由器使用的。

这一次总结了IP数据报的分用中的一个协议,即ICMP协议,包括查询报文和差错报文,并介绍了利用这些报文的一些程序,包括ping和traceroute的原理。对于动态选路,我觉得相关算法可以等以后再做详细总结。

猜你喜欢

转载自philoscience.iteye.com/blog/1290291