TCP/IP详解 卷1:协议—Ping程序

Posted xhjh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP/IP详解 卷1:协议—Ping程序相关的知识,希望对你有一定的参考价值。

Ping程序目的是为了测试另一台主机是否可达。客户端程序发送一份ICMP回显请求报文给主机服务器,并等待返回ICMP回显应答,每个回显应答服务器必须响应标识符和序列号字段。另外,客户发送的选项数据必须回显。因此,客户端Ping程序会将ICMP中的标识符字段设置为发送进程ID,这样即使同一台主机上同时运行多个Ping程序实例,Ping程序也能识别出返回的信息。新号字段从0开始则每发送一次请求+1,用来查看数据报丢失、失序或重复情况。

IP记录路由选项

Ping程序大多数不同版本都提供-R选项,以提供记录路由的功能。它使得Ping程序在发送出去的IP数据报中设置IPRR选项。这样,每个处理该数据报的路由器都把它的IP地址放入选项字段中。当数据报到达目的端时,IP地址清单应该复制到ICMP回显应答中,这样返回途中所经过的路由器地址也被加入清单中。当ping程序收到回显应答时,它就打印出这份IP地址清单。

最大的问题是IP首部中只有有限的空间来存放IP地址。如上图,IP首部中的首部长度字段只有4bit,因此整个IP首部最长只能包括15个32 bit长的字(即60个字节)。由于IP首部固定长度为20字节,RR选项用去3个字节(下面讨论),这样只剩下37个字节(60-20-3)来存放IP地址清单,也就是说只能存放9个IP地址。
IP数据报中的RR选项的一般格式如下图所示:

code是一个字节,指明IP选项的类型。对于RR选项来说,它的值为7。len是RR选项总字节长度,在这种情况下为39(尽管可以为RR选项设置比最大长度小的长度,但是ping程序总是提供39字节的选项字段,最多可以记录9个IP地址。由于IP首部中留给选项的空间有限,它一般情况都设置成最大长度)。
ptr称作指针字段。它是一个基于1的指针,指向存放下一个IP地址的位置。它的最小值为4,指向存放第一个IP地址的位置。随着每个IP地址存入清单,ptr的值分别为8,12,16,最大到36。当记录下9个IP地址后,ptr的值为40,表示清单已满。
Ping程序利用IP记录路由选项(RR)实现路由IP记录,存在以下不足:

  1. 不是所有的路由器都支持记录路由选项
  2. 记录路由一般是单向的选项。发送端设置了该选项,那么接收端不得不从收到的IP首部中提取出所有的信息,然后全部返回给发送端。这样使得记录下来的IP地址翻了一番(一来一回)
  3. IP首部中留给选项的空间有限,不能存放当前大多数的路径

IP时间戳选项

IP时间戳选项与记录路由选项类似。IP时间戳选项的格式如下图所示:

时间戳选项的代码为0x44。其他两个字段len和ptr与记录路由选项相同:选项的总长度(一般为36或40)和指向下一个可用空间的指针(5,9,13等)。
接下来的两个字段是4bit的值:OF表示溢出字段,FL表示标志字段。时间戳选项的操作根据标志字段来进行,如下图所示:

如果路由器由于没有空间而不能增加时间戳选项,那么它将增加溢出字段的值。
时间戳的取值一般为自UTC午夜开始计的毫秒数,与ICMP时间戳请求和应答相类似。如果路由器不使用这种格式,它就可以插入任何它使用的时间表示格式,但是必须打开时间戳中的高位以表明为非标准值。
与我们遇到的记录路由选项所受到的限制相比,时间戳选项遇到情况要更坏一些。如果我们要同时记录IP地址和时间戳(标志位为1),那么就可以同时存入其中的四对值。只记录时间戳是没有用处的,因为我们没有标明时间戳与路由器之间的对应关系(除非有一个永远不变的拓扑结构)。标志值取3会更好一些,因为我们可以插入时间戳的路由器。一个更为基本的问题是,很可能无法控制任何给定路由器上时间戳的正确性。这使得试图用IP选项来计算路由器之间的跳站数是徒劳的。接下来将看到traceroute程序可以提供一种更好的方法来计算路由器之间的跳站数。

以上是关于TCP/IP详解 卷1:协议—Ping程序的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP详解 卷1:协议—Ping程序

TCP/IP详解 卷1:协议—Ping程序

TCP/IP详解 卷1:协议—Ping程序

TCP/IP详解 卷1:协议—Traceroute程序

TCP/IP详解 卷1:协议—Traceroute程序

TCP/IP详解 卷1:协议—Traceroute程序