前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >速读原著-TCP/IP(IP记录路由选项)

速读原著-TCP/IP(IP记录路由选项)

作者头像
cwl_java
发布2020-03-06 13:26:22
1.1K0
发布2020-03-06 13:26:22
举报
文章被收录于专栏:cwl_Javacwl_Java

7.3 IP记录路由选项

p i n g程序为我们提供了查看 I P记录路由(R R)选项的机会。大多数不同版本的 p i n g程序都提供-R选项,以提供记录路由的功能。它使得 p i n g程序在发送出去的I P数据报中设置I P

R R选项(该I P数据报包含I C M P回显请求报文)。这样,每个处理该数据报的路由器都把它的I P地址放入选项字段中。当数据报到达目的端时, I P地址清单应该复制到 I C M P回显应答中,这样返回途中所经过的路由器地址也被加入清单中。当 p i n g程序收到回显应答时,它就打印出这份I P地址清单。

这个过程听起来简单,但存在一些缺陷。源端主机生成 R R选项,中间路由器对 R R选项的处理,以及把 I C M P回显请求中的 R R清单复制到I C M P回显应答中,所有这些都是选项功能。幸运的是,现在的大多数系统都支持这些选项功能,只是有一些系统不把 I C M P请求中的I P清单复制到I C M P应答中。

但是,最大的问题是 I P首部中只有有限的空间来存放 I P地址。我们从图 3 - 1可以看到,I P首部中的首部长度字段只有 4 bit,因此整个I P首部最长只能包括1 5个32 bit长的字(即6 0个字节)。由于I P首部固定长度为 2 0字节,R R选项用去3个字节(下面我们再讨论),这样只剩下3 7个字节( 6 0-2 0-3)来存放 I P地址清单,也就是说只能存放 9个I P地址。对于早期的A R PA N E T来说,9个I P地址似乎是很多了,但是现在看来是非常有限的(在第 8章中,我们将用Tr a c e r o u t e工具来确定数据报的路由)。除了这些缺点,记录路由选项工作得很好,为详细查看如何处理I P选项提供了一个机会。

I P数据报中的R R选项的一般格式如图7 - 3所示。

在这里插入图片描述
在这里插入图片描述

c o d e是一个字节,指明 I P选项的类型。对于 R R选项来说,它的值为 7。l e n是R R选项总字节长度,在这种情况下为 3 9(尽管可以为 R R选项设置比最大长度小的长度,但是 p i n g程序总是提供3 9字节的选项字段,最多可以记录 9个I P地址。由于I P首部中留给选项的空间有限,它一般情况都设置成最大长度)。

p t r称作指针字段。它是一个基于 1的指针,指向存放下一个 I P地址的位置。它的最小值为4,指向存放第一个 I P地址的位置。随着每个 I P地址存入清单, p t r的值分别为8,1 2,1 6,最大到3 6。当记录下9个I P地址后,p t r的值为4 0,表示清单已满。 当路由器(根据定义应该是多穴的)在清单中记录 I P地址时,它应该记录哪个地址呢?

是入口地址还是出口地址?为此, RFC 791 [Postel 1981a]指定路由器记录出口 I P地址。我们在后面将看到,当原始主机(运行 p i n g程序的主机)收到带有 R R选项的I C M P回显应答时,它也要把它的入口I P地址放入清单中。

7.3.1 通常的例子

我们举一个用R R选项运行p i n g程序的例子,在主机s v r 4上运行p i n g程序到主机s l i p。一个中间路由器( b s d i )将处理这个数据报。下面是 s v r 4的输出结果:

在这里插入图片描述
在这里插入图片描述

分组所经过的四站如图 7 - 4所示(每个方向各有两站),每一站都把自己的 I P地址加入R R清单。

在这里插入图片描述
在这里插入图片描述

路由器b s d i在不同方向上分别加入了不同的 I P地址。它始终是把出口的 I P地址加入清单。我们还可以看到,当 I C M P回显应答到达原始系统( s v r 4)时,它把自己的入口 I P地址也加入清单中。

还可以通过运行带有- v选项的t c p d u m p命令来查看主机s u n上进行的分组交换(参见 I P选项)。输出如图7 - 5所示。

在这里插入图片描述
在这里插入图片描述

输出中o p t l e n = 4 0表示在I P首部中有4 0个字节的选项空间(I P首部长度必须为4字节的整数倍)。R R { 3 9 }的意思是记录路由选项已被设置,它的长度字段是 3 9。然后是9个I P地址,符号“#”用来标记 R R选项中的p t r字段所指向的 I P地址。由于我们是在主机 s u n上观察这些分组(参见图7 - 4),因此所能看到 I C M P回显请求中的 I P地址清单是空的,而 I C M P回显应答中有 3 个I P地址。我们省略了t c p d u m p输出中的其他行,因为它们与图 7 - 5基本一致。

位于路由信息末尾的标记E O L表示I P选项“end of list(清单结束)”的值。E O L选项的值可以为0。这时表示3 9个字节的R R数据位于I P首部中的4 0字节空间中。由于在数据报发送之前空间选项被设置为 0,因此跟在3 9个字节的R R数据之后的0字符就被解释为E O L。这正是我们所希望的结果。如果在 I P首部中的选项字段中有多个选项,在开始下一个选项之前必须填入空白字符,另外还可以用另一个值为 1的特殊字符N O P(“no operation”)。

在图7 - 5中,S V R 4把回显请求中的T T L字段设为3 2,B S D / 3 8 6设为2 5 5(它打印出的值为2 5 4是因为路由器b s d i已经将其减去1)。新的系统都把I C M P报文中的T T L设为最大值(255)。

在作者使用的三个T C P / I P系统中,B S D / 3 8 6和S V R 4都支持记录路由选项。这就是说,当转发数据报时,它们都能正确地更新R R清单,而且能正确地把接收到的I C M P回显请求中的R R清单复制到出口I C M P回显应答中。虽然SunOS 4.1.3在转发一个数据报时能正确更新RR清单,但是不能复制RR清单。Solaris 2.x对这个问题已作了修改。

7.3.2 异常的输出

下面的例子是作者观察到的,把它作为第 9章讨论 I C M P间接报文的起点。在子网1 4 0 . 2 5 2 . 1上p i n g主机a i x(在主机s u n上通过拨号S L I P连接可以访问),并带有记录路由选项。在s l i p主机上运行有如下输出结果:

在这里插入图片描述
在这里插入图片描述

我们已经在主机b s d i上运行过这个例子。现在选择 s l i p来运行它,观察 R R清单中所有的9个I P地址。

在输出中令人感到疑惑的是,为什么传出的数据报( I C M P回显请求)直接从 n e t b传到a i x,而返回的数据报( I C M P回显应答)却从 a i x开始经路由器g a t e w a y再到n e t b?这里看到的正是下面将要描述的 I P选路的一个特点。数据报经过的路由如图 7 - 6所示。

问题是a i x不知道要把目的地为子网 1 4 0 . 2 5 2 . 1 3的I P数据报发到主机n e t b上。相反,a i x在它的路由表中有一个默认项,它指明当没有明确某个目的主机的路由时,就把所有的数据报发往默认项指定的路由器 g a t e w a y。路由器g a t e w a y比子网1 4 0 . 2 5 2 . 1上的任何主机都具备更强的选路能力(在这个以太网上有超过 1 5 0台主机,每台主机的路由表中都有一个默认项指 向路由器g a t e w a y,这样就不用在每台主机上都运行一个选路守护程序)。

这里没有应答的一个问题是为什么 g a t e w a y不直接发送I C M P报文重定向到a i x(9 . 5节),以更新它的路由表?由于某种原因(很可能是由于数据报产生的重定向是一份 I C M P回显请求报文),重定向并没有产生。但是如果我们用 Te l n e t登录到a i x上的d a y t i m e服务器,I C M P就会产生重定向,因而它在 a i x上的路由表也随之更新。如果接着执行 p i n g程序并带有记录路由选项,其路由显示表明数据报从 n e t b到a i x,然后返回n e t b,而不再经过路由器g a t e w a y。 在9 . 5节中将更详细地讨论I C M P重定向的问题。

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 7.3 IP记录路由选项
    • 7.3.1 通常的例子
      • 7.3.2 异常的输出
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档