TCP/IP详解,卷1:协议--第8章 Traceroute程序
引言
由Van Jacobson编写的Tr a c e r o u t e程序是一个能更深入探索T C P / I P协议的方便可用的工具。
尽管不能保证从源端发往目的端的两份连续的 I P数据报具有相同的路由,但是大多数情况下
是这样的。Tr a c e r o u t e程序可以让我们看到I P数据报从一台主机传到另一台主机所经过的路由。
Tr a c e r o u t e程序还可以让我们使用I P源路由选项。
使用手册上说:“程序由Steve Deering提议,由Van Jacobson实现,并由许多其他人
根据C. Philip Wood, Tim Seaver 及Ken Adelman等人提出的令人信服的建议或补充意见
进行调试。
Traceroute程序的操作
在7 . 3节中,我们描述了 I P记录路由选项(R R)。为什么不使用这个选项而另外开发一个
新的应用程序?有三个方面的原因。首先,原先并不是所有的路由器都支持记录路由选项,
因此该选项在某些路径上不能使用( Tr a c e r o u t e程序不需要中间路由器具备任何特殊的或可选
的功能)。
其次,记录路由一般是单向的选项。发送端设置了该选项,那么接收端不得不从收到的 I P
首部中提取出所有的信息,然后全部返回给发送端。在 7 . 3节中,我们看到大多数P i n g服务器的
实现(内核中的I C M P回显应答功能)把接收到的R R清单返回,但是这样使得记录下来的 I P地
址翻了一番(一来一回)。这样做会受到一些限制,这一点我们在下一段讨论( Tr a c e r o u t e程序
只需要目的端运行一个U D P模块 — 其他不需要任何特殊的服务器应用程序)。
最后一个原因也是最主要的原因是, I P首部中留给选项的空间有限,不能存放当前大多
数的路径。在I P首部选项字段中最多只能存放 9个I P地址。在原先的A R PA N E T中这是足够的,
但是对现在来说是远远不够的。
Tr a c e r o u t e程序使用I C M P报文和I P首部中的T T L字段(生存周期)。T T L字段是由发送端
初始设置一个8 bit字段。推荐的初始值由分配数字 R F C指定,当前值为6 4。较老版本的系统
经常初始化为1 5或3 2。我们从第7章中的一些p i n g程序例子中可以看出,发送 I C M P回显应答
时经常把T T L设为最大值2 5 5
发送一份 T T L字段为1的I P数据报给
目的主机。处理这份数据报的第一个路由器将 T T L值减1,丢弃该数据报,并发回一份超时
I C M P报文。这样就得到了该路径中的第一个路由器的地址。然后 Tr a c e r o u t e程序发送一份
T T L值为2的数据报,这样我们就可以得到第二个路由器的地址。继续这个过程直至该数据报
到达目的主机。但是目的主机哪怕接收到 T T L值为1的I P数据报,也不会丢弃该数据报并产生
一份超时I C M P报文,这是因为数据报已经到达其最终目的地。那么我们该如何判断是否已经
到达目的主机了呢?
Tr a c e r o u t e程序发送一份U D P数据报给目的主机,但它选择一个不可能的值作为 U D P端口
号(大于30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报
到达时,将使目的主机的 U D P模块产生一份“端口不可达”错误(见 6 . 5节)的I C M P报文。
这样,Tr a c e r o u t e程序所要做的就是区分接收到的 I C M P报文是超时还是端口不可达,以判断
什么时候结束。
Tr a c e r o u t e程序必须可以为发送的数据报设置T T L字段。并非所有与T C P / I P接口的
程序都支持这项功能,同时并非所有的实现都支持这项能力,但目前大部分系统都支
持这项功能,并可以运行Tr a c e r o u t e程序。这个程序界面通常要求用户具有超级用户权
限,这意味着它可能需要特殊的权限以在你的主机上运行该程序。
局域网输出
往返时间是由发送主机的 t r a c e r o u t e程序计算的。它是指从 t r a c e r o u t e程序到该路
由器的总往返时间。如果我们对每段路径的时间感兴趣,可以用 T T L字段为N + 1所打印出来的
时间减去T T L字段为N的时间
有两种不同的I C M P“超时”报文(见6 . 2节的图6 - 3),它们的I C M P报文中c o d e字段不同。
图8 - 2给出了这种I C M P差错报文的格式
我们所讨论的I C M P报文是在T T L值等于0时产生的,其c o d e字段为0。
主机在组装分片时可能发生超时,这时,它将发送一份“组装报文超时”的 I C M P报文
(我们将在11 . 5节讨论分片和组装)。这种差错报文将c o d e字段置1
计算出S L I P链路的往返时间是很有意义的,就象我们在 7 . 2节中所举的P i n g例子,将链路
值设置为1 2 0 0 b / s一样。发送出的U D P数据报共4 2个字节,包括1 2字节的数据、8字节U D P首
部、2 0字节的I P首部以及(至少)2字节的S L I P帧(2 . 4节)。但是与P i n g不一样的是,返回的
数据报大小是变化的。从图 6 - 9可以看出,返回的 I C M P报文包含发生差错的数据报的 I P首部
以及紧随该I P首部的8字节数据(在t r a c e r o u t e程序中,即U D P首部)。这样,总共就是2 0
- 8 + 20 + 8 + 2,即5 8字节。在数据速率为960 b/s的情况下,预计的RT T就是(42 + 58/960),
即104 ms。这个值与s v r 4上所估算出来的110 ms是吻合的
关于t r a c e r o u t e程序,还有一些必须指出的事项。首先,并不能保证现在的路由也是
将来所要采用的路由,甚至两份连续的 I P数据报都可能采用不同的路由。如果在运行程序时,
路由发生改变,就会观察到这种变化,这是因为对于一个给定的 T T L,如果其路由发生变化,
t r a c e r o u t e程序将打印出新的I P地址。
第二,不能保证I C M P报文的路由与t r a c e r o u t e程序发送的U D P数据报采用同一路由。
这表明所打印出来的往返时间可能并不能真正体现数据报发出和返回的时间差(如果 U D P数
据报从信源到路由器的时间是 1秒,而I C M P报文用另一条路由返回信源用了 3秒时间,则打印
出来的往返时间是4秒)
第三,返回的I C M P报文中的信源I P地址是U D P数据报到达的路由器接口的 I P地址。这与
I P记录路由选项(7 . 3节)不同,记录的 I P地址指的是发送接口地址。由于每个定义的路由器
都有2个或更多的接口,因此,从 A主机到B主机上运行t r a c e r o u t e程序和从B主机到A主机
上运行t r a c e r o u t e程序所得到的结果可能是不同的
最后,在广域网情况下,如果 t r a c e r o u t e程序的输出是可读的域名形式,而不是 I P地
址形式,那么会更好理解一些。但是由于 t r a c e r o u t e程序接收到I C M P报文时,它所获得的
唯一信息就是I P地址,因此,在给定 I P地址的情况下,它做一个“反向域名查看”工作来获
得域名。这就需要路由器或主机的管理员正确配置其反向域名查看功能(并非所有的情况下
都是如此)
IP源站选路选项
通常I P路由是动态的,即每个路由器都要判断数据报下面该转发到哪个路由器。应用程
序对此不进行控制,而且通常也并不关心路由。它采用类似 Tr a c e r o u t e程序的工具来发现
实际的路由。
源站选路(source routing)的思想是由发送者指定路由。它可以采用以下两种形式:
• 严格的源路由选择。发送端指明 I P数据报所必须采用的确切路由。如果一个路由器发现
源路由所指定的下一个路由器不在其直接连接的网络上,那么它就返回一个“源站路
由失败”的I C M P差错报文。
• 宽松的源站选路。发送端指明了一个数据报经过的 I P地址清单,但是数据报在清单上指
明的任意两个地址之间可以通过其他路由器
图8 - 6给出了源站路由选项的格式。
这个格式与我们在图 7 - 3中所示的记录路由选项格式基本一致。不同之处是,对于源站选
路,我们必须在发送I P数据报前填充I P地址清单;而对于记录路由选项,我们需要为 I P地址清
单分配并清空一些空间,并让路由器填充该清单中的各项。同时,对于源站选路,只要为所
需要的I P地址数分配空间并进行初始化,通常其数量小于 9。而对于记录路由选项来说,必须
尽可能地分配空间,以达到9个地址。
对于宽松的源站选路来说, c o d e字段的值是0 x 8 3;而对于严格的源站选路,其值为 0 x 8 9。
l e n和p t r字段与7 . 3节中所描述的一样。
源站路由选项的实际称呼为“源站及记录路由”(对于宽松的源站选路和严格的源站选路,
分别用L S R R和S S R R表示),这是因为在数据报沿路由发送过程中,对I P地址清单进行了更新。
下面是其运行过程:
• 发送主机从应用程序接收源站路由清单,将第 1个表项去掉(它是数据报的最终目的地
址),将剩余的项移到1个项中(如图8 - 6所示),并将原来的目的地址作为清单的最后一
项。指针仍然指向清单的第1项(即,指针的值为4)。
• 每个处理数据报的路由器检查其是否为数据报的最终地址。如果不是,则正常转发数
据报(在这种情况下,必须指明宽松源站选路,否则就不能接收到该数据报)。
• 如果该路由器是最终目的,且指针不大于路径的长度,那么( 1)由p t r所指定的清单中的
下一个地址就是数据报的最终目的地址;(2)由外出接口(outgoing interface)相对应的I P
地址取代刚才使用的源地址;(3)指针加4
以用下面这个例子很好地解释上述过程。在图 8 - 7中,我们假设主机 S上的发送应用程
序发送一份数据报给D,指定源路由为R1,R2和R3
在上图中,#表示指针字段,其值分别是 4、8、1 2和1 6。长度字段恒为1 5(三个I P地址加
上三个字节首部)。可以看出,每一跳I P数据报中的目的地址都发生改变。
当一个应用程序接收到由信源指定路由的数据时,在发送应答时,应该读出接收到的路
由值,并提供反向路由
Host Requirements RFC指明,T C P客户必须能指明源站选路,同时,T C P服务器
必须能够接收源站选路,并且对于该 T C P连接的所有报文段都能采用反向路由。如果
T C P服务器下面接收到一个不同的源站选路,那么新的源站路由将取代旧的源站路
由。
小结
在一个T C P / I P网络中,t r a c e r o u t e程序是不可缺少的工具。其操作很简单:开始时发
送一个T T L字段为1的U D P数据报,然后将 T T L字段每次加 1,以确定路径中的每个路由器。
每个路由器在丢弃 U D P数据报时都返回一个 I C M P超时报文 2,而最终目的主机则产生一个
I C M P端口不可达的报文
TCP/IP详解,卷1:协议--第8章 Traceroute程序的更多相关文章
- 【TCP/IP详解 卷一:协议】第二章:链路层
2.1 引言 链路层的三个目的: (1)为IP模块发送和接收IP数据报. (2)为ARP模块发送ARP请求和接收ARP应答.地址解析协议:ARP. (3)为RARP模块发送RARP请求和接收RARP应 ...
- tcp/ip详解 卷1 -- 协议概述
第一章 概述 分层 TCP/IP 通常被认为是一个四层协议系统. 每一层负责不同的功能. 链路层, 也成为数据链路层或者网络接口层. 通常包括 操作系统中的设备驱动程序和计算机中对应的网络接口卡. 主 ...
- 《TCP/IP详解 卷1:协议》读书笔记
第一章 概述 协议栈 应用层 HTTP,FTP 运输层 TCP, UDP 段(Segment) 网络层 IP, ICMP, IGMP 数据报(Datagram) 链路层 帧(Frame) 物理 ...
- 【TCP/IP详解 卷一:协议】第一章概论 学习笔记
第一章 概述 游览了一下,本章主要是简介OSI模型的低层(1-4层).介绍了TCP/IP协议族的相关知识. TCP/IP的分层 Application <--> TCP / UDP < ...
- TCP/IP详解 卷1 第十九章 TCP的交互数据流
19.1 引言 成块数据:比如ftp.电子邮件.Usenet新闻 交互数据:Telnet.Rlogin 成块数据的报文段基本上都是满长度(full-size)的,而交互数据小的多(Telnet和Rlo ...
- 《TCP/IP详解卷1:协议》第1章 概述-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第2章 链路层-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第3章 IP:网际协议(2)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第4章 ARP:地址解析协议-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
随机推荐
- 查看mysql是否锁表了
1.查看表是否被锁: (1)直接在mysql命令行执行:show engine innodb status\G. (2)查看造成死锁的sql语句,分析索引情况,然后优化sql. (3)然后show p ...
- [更新ing]zzy的家里蹲网课日记
前言 精神小(ge)伙(zi)终于记起了他的博客密码...... 寒假以来,积累了巨多的好想法想要写博客,往往都是因为各种原因半途而废--在学习生活上甚至也有各种拖延的毛病:爱欠作业不早睡,不见成绩不 ...
- javascript生成指定位数的随机数
<script type="text/javascript"> document.write("请输入要生成随机数的位数:"); // digit是 ...
- 基于Docker的Consul集群实现服务发现
服务发现 其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的. ...
- javascript 基础整理
js编码标准 参考 数据类型 注意事项
- Vue中富文本编辑器(vue-quill-editor)的使用
1. 安装 npm install vue-quill-editor --save 2. 导入并挂载 import VueQuillEditor from 'vue-quill-editor' // ...
- 【计算语言学实验】基于 Skip-Gram with Negative Sampling (SGNS) 的汉语词向量学习和评估
一.概述 训练语料来源:维基媒体 https://dumps.wikimedia.org/backup-index.html 汉语数据 用word2vec训练词向量,并用所学得的词向量,计算 pku_ ...
- Process、管理者权限、注册表、xml修改
//判断是否有管理者权限 WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); if (!p ...
- springboot web - 启动(4) tomcat
接第二篇 第二篇里面, 看到容器创建的是 AnnotationConfigServletWebServerApplicationContext 类型. 一 .类图 二. 构造 public Gener ...
- shelll高级编程【实战】(1)
shell优势在于处理操作系统底层业务,2000多个命令都是shell的支持. 一键安装,报警脚本,常规业务操作,shell开发更简单快速. 1- 常用操作系统默认shell linux: Bourn ...