本节内容继续介绍ICMP协议相关的知识,前面我们知道到了ICMP报文分为差错报告报文和询问报文两种类型,询问报文就是用来描述网络连通状态的,结合两个具体的命令ping和tracert,来认识ICMP询问报文。
ICMP询问报文
我们知道,无论是差错报告报文还是询问报文,它们的格式都是一样的,而用来区分具体报文类型就要靠ICMP首部的类型字段的值。现在我们来看具体的询问报文的类型:
类型值 | 代码值 | 类型描述 |
---|---|---|
8 | 0 | 回显请求 |
0 | 0 | 回显应答 |
13 | 0 | 时间戳请求 |
14 | 0 | 时间戳应答 |
类型值8和0分别代表回显请求和应答,是指当某主机或某路由器向其他的目标主机和路由器发出一个询问请求,以测试从本机到目标是否可达等状态,期望得到目标主机的回答。
类型值13和14分别代表时间戳请求和应答,作用是请求某台主机或路由器回答当前的日期和时间,以用于时钟同步。
Ping命令
ping命令是网络故障诊断测试常用的工具,在windows系统、Linux系统,甚至是华为设备的VRP系统中都可以使用,使用Ping的作用就是测试一端到另一端是否连通。
ping命令的原理就是利用了ICMP的两种询问报文——回显请求和应答。
常用的使用方式
命令参数 | 功能说明 | 举例 |
---|---|---|
无 | 直接用本机ping目标主机的IP地址 | ping 1.0.0.1 |
-n | 指定发出的ICMP回显请求包的数量 | ping 1.0.0.1 -n 10 |
-t | 连续不断的执行ping操作 | ping 1.0.0.1 -t |
-l | 指定发出数据包的大小 | ping 1.0.0.1 -l 65500 |
-f | 数据包首部“DF”置为1,即不允许被分片 | ping 1.0.0.1 -f |
上述几种使用方式只是一般情况下常用的方式,并不是全部的方式,想要查看全部的方式,请打开cmd命令窗口,输入ping之后直接回车,系统即会显示出ping命令全部的用法。
本机直接ping目标主机的IP地址(或某路由器的接口IP地址)这是最常用的方法,目的就是为了判断两者之间是否连通;
在windows系统下,执行一次ping命令,系统默认发出4个ICMP的回显请求包,如果想要自己指定让系统发出几个,那就加上-n参数;
如果想让系统连续不断的执行ping,就加-t参数,直到手动按下ctrl+c才会终止;
-l参数和-f参数一般用做网络压力性能测试,通过指定一个比较大的数据包,并且设置不允许它分片,测试出网络的性能。windows系统默认发出的数据包大小是32字节,最大可指定65500字节。
常见的返回结果
执行ping命令后,一般会有四种返回结果:
第一种是正常的,表示本计算机和目标主机之间的网络是连通的,返回结果示例为:
第二种属于不正常的返回结果,无法访问目标主机,原因可能是找不到目标IP地址的路由,也可能是ping了一个不存在的IP地址,也有可能是本机设置的防火墙不允许访问目标IP,还有可能是两者之间的物理链路出了问题(比如网线除了故障),结果示例为:
第三种也是不正常的返回结果,请求超时,原因是数据包传输过程中TTL值为0了,被路由器丢弃掉了,也可能是目标主机为了保证自身安全性,开启了防火墙,不允许别的主机来ping它,还有可能是目标主机正处于关机状态,结果示例为:
第四种也是不正常的结果,传输失败,原因主要是本机没有指定自己的网关IP而去ping一个其它网段的IP地址,结果示例为:
以上就是四种最常见的ping命令返回结果,我们可以根据这些结果来大概判断出网络的故障点在那里,从而更有针对性的去解决。
tracert命令
tracert是windows系统常用的网络测试命令,功能是跟踪路由。此命令在linux系统下的名称有些区别,叫“traceroute”,但功能是一样的。
跟踪路由实现的原理也是利用了ICMP,是通过ICMP的差错报告机制和IP数据包首部中的TTL字段值来实现的。
路由跟踪的过程是:
源主机向目标主机发送一连串的IP数据包,第一个包的TTL值设置为1,当第一个包到达第一个路由器的时候,路由器把它的TTL值减一,这时候数据包的TTL成为0了,就被路由器丢弃了,然后向源主机发送一个ICMP的差错报告报文,差错原因是时间超过;
接着源主机发出第二个数据包,TTL值被设置为2,也就是说这个包最多能经过两个路由器,当到达第二个路由器的时候,TTL值又被减为0了,第二个路由器就会向源主机发送时间超过;
就这样以此类推的继续下去,直到有一个数据包最终到达了目标主机。而目的主机不会把数据包的TTL减一了,直接向源主机发送一个终点不可达的差错报告。
可以发现,这样的探测过程就像探路一样,利用数据包经过逐跳的路由器转发,源主机就可以得到从自己到目标主机的“沿途路径”上的所有路由器的IP地址,以及到达其中每一跳路由器的往返时间。
下面是我用tracert来追踪了到百度网站的“沿途路由”,得到以下结果:
要注意的细节是,windows系统下,最多能跟踪30个跃点,也就是30个“沿途路径上”的路由器。另外, 路径上有一些“请求超时”的情况,可能是某些路由器做了安全防护措施,或者是当时路由器的任务繁重,来不及处理到达的数据包,只能将它丢弃掉。
以上就是ICMP询问报文和两条常用测试命令的原理以及常用的方法。下一节我们系统学习一下网络层的设备——路由器和三层交换机。
参考教材:谢希仁《计算机网络》第七版