tcptraceroute
TCP/IP详解05-网络层:ICMP协议、Ping和Traceroute
- TCP/IP详解05-网络层:icmp协议、Ping和Traceroute
1. ICMP:Internet控制报文协议(Internet Control Message Protocol)
前面讲到了,ip协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。
当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。
ICMP 报文是在 IP 数据报内部被传输的。
- ICMP 数据包由 8bit 的错误类型和 8bit 的代码和 16bit 的校验和组成。而前 16bit就组成了ICMP所要传递的信息。
- 检验和字段覆盖整个 ICMP 报文。使用的算法与 IP 首部检验和算法相同。ICMP 的检验和是必需的。
1.1 ICMP报文的类型
不同类型由报文中的类型字段和代码字段来共同决定。图中的最后两列表明 ICMP 报文是一份查询报文还是一份差错报文。
当发送一份ICMP差错报文时,报文始终包含 IP 的首部和产生 ICMP 差错报文的 IP 数据报的前 8 个字节。
这样,接收 ICMP 差错报文的模块就会把它与某个特定的协议(根据 IP 数据报首部中的协议字段来判断)和用户进程(根据包含在 IP 数据报前 8 个字节中的 TCP 或 UDP 报文首部中的 TCP 或 UDP 端口号来判断)联系起来。
下面各种情况都不会导致产生 ICMP差错报文:
- 1) ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)。
- 2) 目的地址是广播地址(见图 3-9)或多播地址(D类地址,见图1-5)的IP数据报。
- 3) 作为链路层广播的数据报。
- 4) 不是IP分片的第一片(将在11.5节介绍分片)。
- 5) 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
这些规则是为了防止过去允许 ICMP差错报文对广播分组响应所带来的广播风暴。
1.2 ICMP 查询报文
1.2.1 ICMP地址掩码请求与应答
ICMP 地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播 它的 ICMP 请求报文(这一过程与无盘系统在引导过程中用 RARP 获取 IP 地址是类似的)。
ICMP 地址掩码请求和应答报文的格式如下图所示。ICMP 报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就可以把应答与请求进行匹配。
sun % icmpaddrmask
sun received mask= ff000000, from 140.252.13.33
sun % icmpaddrmask
localhost received mask= ff000000, from 127.0.0.1
上述两种情况下返回的地址掩码对应的都是环回地址,即 A类地址 127.0.0.1。还有,我们从图 2-4 可以看到,发送给本机 ip 地址的数据报( 140.252.13.33)实际上是送到环回接口。ICMP 地址掩码应答必须是收到请求接口的子网掩码(这是因为多接口主机每个接口有不同的子网掩码),因此两种情况下地址掩码请求都来自于环回接口。
1.2.2 ICMP时间戳请求与应答
ICMP 时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间( Coordinated Universal Time, UTC)(早期的参考手册认为 UTC 是格林尼治时间)。
ICMP 时间戳请求和应答报文格式如图所示:
1.3 ICMP 差错报文
1.3.1 ICMP端口不可达差错
ICMP不可达报文的一般格式如图
ICMP差错报文包含产生该差错报文的数据报IP首部,并至少包含该IP首部后面的前8个字节.
- (1)IP首部包含协议字段,使ICMP知道如何解析后面的8个字节.
- (2)IP首部后面的前8个字节实际为TCP或UDP首部的一部分,包含了源端口和目的端口号.
2. ICMP的应用–Ping程序
ping 程序是对两个 TCP/IP 系统连通性进行测试的基本工具。它只利用 ICMP回显请求和回显应答报文
,而不用经过传输层( TCP/UDP)。Ping服务器一般在内核中实现 ICMP的功能。
ping 的原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。我们可以看到,ping给出来了传送的时间和TTL的数据。
- Unix 系统在实现 ping 程序时是把 ICMP 报文中的
标识符字段
置成发送进程的 ID号。 这样即使在同一台主机上同时运行了多个 ping程序实例, ping程序也可以识别出返回的信息。 序列号
从0开始,每发送一次新的回显请求就加 1。ping 程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复
。
2.1 在 LAN、WAN 以及 SLIP 链路(拨号和线路)上运行 ping 程序的输出结果
参见书本
2.2 ping 的 IP 记录路由选项
ping 程序在发送出去的 IP 数据报中设置 IP RR 选项(该 IP 数据报包含 ICMP 回显请求报文)。这样,每个处理该数据报的路由器都把它的 IP 地址放入选项字段中。当数据报到达目的端时,IP 地址清单应该复制到 ICMP 回显应答中,这样返回途中所经过的路由器地址也被加入清单中。当 ping 程序收到回显应答时,它就打印出这份IP地址清单。
**缺点:**IP 首部中只有有限的空间来存放 IP 地址。IP首部最大的长度为 60个字节,由于 IP 首部固定长度为 20 字节,RR 选项用去3个字节(code、len、ptr),这样只剩下 37个字节( 60-20-3)来存放 IP 地址清单,也就是说只能存放 9 个 IP 地址。
- code 是一个字节,指明 IP 选项的类型。对于 RR 选项来说,它的值为 7。
- len 是 RR 选项总字节长度,在这种情况下为 39。
- ptr 称作指针字段。它是一个基于 1 的指针,指向存放下一个 IP 地址的位置。它的最小值为 4,指向存放第一个 IP 地址的位置。随着每个 IP 地址存入清单,ptr 的值分别为 8,12,16,最大到36。当记录下9个IP地址后, ptr的值为40,表示清单已满。
使用tcpdump输出RR选项:待补充
2.3 ping 的 IP 时间戳选项
- 时间戳选项的代码为 0x44
- len 和 ptr 与记录路由选项相同:选项的总长度(一般为36或40)和指向下一个可用空间的指针( 5,9,13等)。
- OF 表示溢出字段,FL 表示标志字段。
3. ICMP的应用–Traceroute程序
3.1 原理说明
不使用IP 记录路由选项( RR)的原因:
- 首先,原先并不是所有的路由器都支持记录路由选项。
- 其次,记录路由一般是单向的选项。
- 最后一个原因也是最主要的原因是,IP 首部中留给选项的空间有限,不能存放当前大多数的路径。
Traceroute 的执行操作:开始时发送一个 TTL 字段为1的 UDP 数据报,然后将 TTL 字段每次加 1,以确定路径中的每个路由器。每个路由器在丢弃 UDP 数据报时都返回一个 ICMP 超时报文 2,而最终目的主机则产生一个 ICMP 端口不可达的报文。
Traceroute 程序使用 ICMP 报文和 IP 首部中的 TTL 字段(生存周期)。
- 所经过的每个路由器都将 TTL 值减 1。
当路由器收到一份IP数据报,如果其TTL字段是0或1
,则路由器不转发该数据报(接收到这种数据报的目的主机可以将它交给应用程序,这是因为不需要转发该数据报。但是在通常情况下,系统不应该接收 TTL 字段为 0 的数据报)。相反,路由器将该数据报丢弃,并给信源机发一份 ICMP“超时”信息。
Traceroute 程序的关键在于包含这份 ICMP 信息的 IP 报文的信源地址是该路由器的IP地址。 - Traceroute程序发送一份 UDP 数据报给目的主机,但它选择一个不可能的值作为 UDP 端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报 到达时,
将使目的主机的 UDP 模块产生一份“端口不可达”错误的 ICMP 报文。
关于 Traceroute 程序,还有一些必须指出的事项:
- 首先,
并不能保证现在的路由也是将来所要采用的路由,甚至两份连续的 IP 数据报都可能采用不同的路由。
- 第二,
不能保证 ICMP 报文的路由与 traceroute 程序发送的 UDP 数据报采用同一路由。
这表明所打印出来的往返时间可能并不能真正体现数据报发出和返回的时间差(如果 UDP 数据报从信源到路由器的时间是 1 秒,而 ICMP 报文用另一条路由返回信源用了 3秒时间,则打印出来的往返时间是4秒)。 - 第三,
返回的 ICMP 报文中的信源 IP 地址是 UDP 数据报到达的路由器接口的 IP 地址。
这与 IP 记录路由选项不同,记录的 IP 地址指的是发送接口地址。由于每个定义的路由器都有2个或更多的接口,因此,从 A主机到B主机上运行 traceroute 程序和从 B 主机到 A 主机上运行 traceroute 程序所得到的结果可能是不同的。
有两种不同的ICMP“超时”报文,它们的 ICMP 报文中 code 字段不同。Traceroute程序使用的 ICMP 报文是在 TTL 值等于 0 时产生的,其code字段为0。
3.2 局域网输和广域网输出 Traceroute 程序结果
参见书本
3.3 IP源站选路选项
源站选路(source routing)的思想是由发送者指定路由。它可以采用以下两种形式:
- 严格的源路由选择。发送端指明 IP数据报所必须采用的确切路由。如果一个路由器发现 源路由所指定的下一个路由器不在其直接连接的网络上, 那么它就返回一个“源站路 由失败”的ICMP差错报文。
- 宽松的源站选路。发送端指明了一个数据报经过的 IP地址清单,但是数据报在清单上指 明的任意两个地址之间可以通过其他路由器。
- 对于宽松的源站选路来说,code 字段的值是 0x83;而对于严格的源站选路,其值为 0x89。
3.4 ping 和 traceroute程序比较
比较ping和traceroute程序在处理同一台主机上客户的多个实例的不同点。
比较ping和traceroute程序在计算往返时间上的不同点。
相关阅读
smokeping网络监控一、smokeping介绍我们在选择机房的时候,如何知道这个机房的网络情况,这个时候就要用到网络监控软件:smokeping
在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near
ping ip主机提示Destination host unreachable问题解
ping 出现destination host unreachable的问题一、问题一:虚拟机和主机互ping不通安装了虚拟机,以太网选的是默认的桥接,可安装完
@requestMapping中的produces属性使用方式和作用
它的作用是指定返回值类型,不但可以设置返回值类型还可以设定返回值的字符编码;还有一个属性与其对应,就是consumes:指定处理请求的提
Smokeping 是一款用于网络性能监测的监控软件,通过它可以在自己公司IDC的网络状况,如延时,丢包率,是否BGP多线等,通过rrdtool制图方式,