icmp ping - yaokun123/php-wiki GitHub Wiki

ICMP[INTERNET CONTROL MESSAGE PROTOCOL]

一、简介

ICMP协议是一个网络层协议。
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。
如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。所以我们就需要一种协议来完成这样的功能–ICMP协议。

ICMP全名为(internet control message protocol)网络控制消息协议。
ICMP的协议号为1。
ICMP报文就像是IP报文的小弟,总顶着IP报文的名头出来混。因为ICMP报文是在IP报文内部的,如图:
|ip首部|ICMP报文|

ICMP协议的功能

1、确认IP包是否成功到达目标地址
2、通知在发送过程中IP包被丢弃的原因

我们需要注意几点

1、ICMP是基于IP协议工作的,但是它并不是传输层的功能,因此仍然把它归结为网络层协议
2、ICMP只能搭配IPv4使用,如果是IPv6的情况下, 需要是用ICMPv6

二、ICMP的报文格式

ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。
一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。
当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。ICMP报头如下图所示。

类型 说明
类型 占一字节,标识ICMP报文的类型,从类型值来看ICMP报文可以分为两大类。第一类是取值为1~127的差错报文,第2类是取值128以上的信息报文
代码 占一字节,标识对应ICMP报文的代码。它与类型字段一起共同标识了ICMP报文的详细类型
校验和 这是对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错(其计算方法与在我们介绍IP报头中的校验和计算方法是一样的)

ICMP大概分为两类报文

1、通知出错原因
2、用于诊断查询

类型(十进制) 内容
0 回送应答
3 目标不可达
4 原点抑制
5 重定向或改变路由
8 回送请求
9 路由器公告
10 路由器请求
11 超时
17 地址子网请求
18 地址子网应答

三、ICMP典型运用—ping

ping命令的功能

1、能验证网络的连通性(是否畅通)
2、会统计响应时间和TTL(IP包中的Time To Live,生存周期)

那么如何验证的呢?

1、ping命令会先发送一个 ICMP Echo Request给对端
2、对端接收到之后, 会返回一个ICMP Echo Reply
3、若没有返回,就是超时了,会认为指定的网络地址不存在。

问题:telnet是23端口,ssh是22端口,那么ping是什么端口?

答:ping命令是基于ICMP,是在网络层。而端口号,是传输层的内容。所以在ICMP中根本就不关注端口号这样的信息。

ping baidu.com    //注意, 此处 ping 的是域名,不是url

ping -t    //一直ping下去
ping -l    //使用大包ping
ping -i    //更改数据包的TTL时间。能够跟踪数据包途径的路由器

使用ping命令还可以粗略估计(不精确)一下对方是什么操作系统:
ttl是生存时间,每过一个路由器ttl都减1,当ttl=0时还没到达目的地,数据包就会被丢弃。
ttl 128 windows
ttl 64 linux
ttl的最大值为255

四、pathping(windows)

跟踪数据包路径,计算丢包情况

五、ICMP典型运用—tracert(traceroute)

traceroute也是基于ICMP协议实现的。
功能:打印出可执行程序主机,一直到目标主机之前经历多少路由器。

在路由器上跟踪数据包路径的命令