前面讲到了,IP协议并非一个可靠的协议,它不保证数据被送达,那么,天然的,保证数据送达的工做应该由其余的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。web
当传送IP数据包发生错误--好比主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,而后传送回给主机。给主机一个处理错误的机会,这也就是为何说创建在IP层以上的协议是可能作到安全的缘由。算法
ICMP 报文是在 IP 数据报内部被传输的。
安全
不一样类型由报文中的类型字段和代码字段来共同决定。图中的最后两列代表 ICMP 报文是一份查询报文仍是一份差错报文。bash
当发送一份ICMP差错报文时,报文始终包含 IP 的首部和产生 ICMP 差错报文的 IP 数据报的前 8 个字节。
这样,接收 ICMP 差错报文的模块就会把它与某个特定的协议(根据 IP 数据报首部中的协议字段来判断)和用户进程(根据包含在 IP 数据报前 8 个字节中的 TCP 或 UDP 报文首部中的 TCP 或 UDP 端口号来判断)联系起来。服务器
下面各类状况都不会致使产生 ICMP差错报文:网络
这些规则是为了防止过去容许 ICMP差错报文对广播分组响应所带来的广播风暴。tcp
ICMP 地址掩码请求用于无盘系统在引导过程当中获取本身的子网掩码。系统广播 它的 ICMP 请求报文(这一过程与无盘系统在引导过程当中用 RARP 获取 IP 地址是相似的)。svg
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 地址掩码应答必须是收到请求接口的子网掩码(这是由于多接口主机每一个接口有不一样的子网掩码),所以两种状况下地址掩码请求都来自于环回接口。测试
ICMP 时间戳请求容许系统向另外一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间( Coordinated Universal Time, UTC)(早期的参考手册认为 UTC 是格林尼治时间)。
ICMP 时间戳请求和应答报文格式如图所示:
ICMP不可达报文的通常格式如图
ICMP差错报文包含产生该差错报文的数据报IP首部,并至少包含该IP首部后面的前8个字节.
ping 程序是对两个 TCP/IP 系统连通性进行测试的基本工具。它只利用 ICMP回显请求和回显应答报文
,而不用通过传输层( TCP/UDP)。Ping服务器通常在内核中实现 ICMP的功能。
ping 的原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就能够判断网络大体的状况。咱们能够看到,ping给出来了传送的时间和TTL的数据。
标识符字段
置成发送进程的 ID号。 这样即便在同一台主机上同时运行了多个 ping程序实例, ping程序也能够识别出返回的信息。序列号
从0开始,每发送一次新的回显请求就加 1。ping 程序打印出返回的每一个分组的序列号,容许咱们查看是否有分组丢失、失序或重复
。参见书本
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 地址。
使用tcpdump输出RR选项:待补充
不使用IP 记录路由选项( RR)的缘由:
Traceroute 的执行操做:开始时发送一个 TTL 字段为1的 UDP 数据报,而后将 TTL 字段每次加 1,以肯定路径中的每一个路由器。每一个路由器在丢弃 UDP 数据报时都返回一个 ICMP 超时报文 2,而最终目的主机则产生一个 ICMP 端口不可达的报文。
Traceroute 程序使用 ICMP 报文和 IP 首部中的 TTL 字段(生存周期)。
当路由器收到一份IP数据报,若是其TTL字段是0或1
,则路由器不转发该数据报(接收到这种数据报的目的主机能够将它交给应用程序,这是由于不须要转发该数据报。可是在一般状况下,系统不该该接收 TTL 字段为 0 的数据报)。相反,路由器将该数据报丢弃,并给信源机发一份 ICMP“超时”信息。
Traceroute 程序的关键在于包含这份 ICMP 信息的 IP 报文的信源地址是该路由器的IP地址。将使目的主机的 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。
参见书本
源站选路(source routing)的思想是由发送者指定路由。它能够采用如下两种形式:
比较ping和traceroute程序在处理同一台主机上客户的多个实例的不一样点。
比较ping和traceroute程序在计算往返时间上的不一样点。