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 端口不可达的报文。

  1. Traceroute 程序使用 ICMP 报文和 IP 首部中的 TTL 字段(生存周期)。
  2. 所经过的每个路由器都将 TTL 值减 1。当路由器收到一份IP数据报,如果其TTL字段是0或1,则路由器不转发该数据报(接收到这种数据报的目的主机可以将它交给应用程序,这是因为不需要转发该数据报。但是在通常情况下,系统不应该接收 TTL 字段为 0 的数据报)。相反,路由器将该数据报丢弃,并给信源机发一份 ICMP“超时”信息。 Traceroute 程序的关键在于包含这份 ICMP 信息的 IP 报文的信源地址是该路由器的IP地址。
  3. 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地址清单,但是数据报在清单上指 明的任意两个地址之间可以通过其他路由器。

Snip20180629_21

  • 对于宽松的源站选路来说,code 字段的值是 0x83;而对于严格的源站选路,其值为 0x89。

3.4 ping 和 traceroute程序比较

比较ping和traceroute程序在处理同一台主机上客户的多个实例的不同点。

比较ping和traceroute程序在计算往返时间上的不同点。

    尽管讲解概念如果同学们是初初相识,真有点晦涩难懂,本人讲解概念的同时,尽量结合实操来讲,这样即加固了概念,同时让同学不会感觉到太烦闷,其实对这些重要基础概念的理解,正是学习过《计算机网络原理》,与直接上手做事的人的区别所在。     古人云,腹有诗书气自华,只要先搞懂了原理,学有所成,今后和别人讨论网络底层问题的时候,才能够抑扬顿挫底气十足,不怯场!# 网络层首部     初探十二段内容介绍     ipv4和ipv6 版本号表示;首部长度     区分服务,给数据包添加标识 QoS     总长度 Total Length;标识Identification;标志Flags     生存时间 TTL     协议号;首部校验和     实训抓包验证诸项内容# ICMP 差错报告报文格式     数据包类型(详解列表:类型值和代码)     TTL耗尽报告-1     主机不可到达(Destination unreachable)-2     路由重定向(Redirect)-3     给应用程序返回差错报告-4     实例讲解:使用ping命令测试网络判断出问题范围     跟踪数据包路径主要命令介绍:tracert和pathping# ARP 协议     arp 协议本网段与跨网段的工作原理     arp 欺骗的两个目的,阻断连接或截获数据包     arp 欺骗的工作原理阐述,创建阻断连接的实验环境     arp 欺骗演示工具,网络执法官     arp 欺骗防止或阻止措施:         手工绑定两端通信主机的mac地址 -a         同时修改mac地址和ip地址;安装运行wireshark工具 -b         在路由器中绑定通信主机mac地址 -c# 搭建流媒体服务     提供点对点服务:采用TCP协议,而非IGMP协议     提供多播视频:根据多播地址切换频道(IGMP协议-UDP)     根据多播IP地址,参照预定规则,合成多播MAC地址     阐述IGMP跨网段运行方式,与创建跨网段环境     启用多播路由:实现流媒体跨网段转发视频,同时抓包查看ICMP数据包特性# 习题详解    网络层协议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值