ICMP 中的 ping 与 tracet
目录
ICMP
ICMP(Internet Control Message Protocol)ICMP是一个网络层协议,是基于IP协议工作的,但是它并不是传输层的功能,因此仍然把它归结为网络层协议,Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。
那么ICMP有什么作用呢?
我们数据在网络中传输中,会封装成IP数据包,而IP协议的特点是面向无连接,且不可靠的,可靠性由上层来保证。IP协议所要做的就是尽最大努力把数据传输到目的地,如果当在路由器的转发中出错了而不能到达目的地时,IP协议对错误不进行任何报告和纠正,此时主机就不知道路由器那边有什么问题。而ICMP协议正好解决了这个问题。
ICMP主要有两种功能。
ping:一般用于勘测到达目的网络的连通性
tracert:用于确定ip数据包访问目标所采取的路径
ping
我们知道有时候我们用电脑去ping一个ip地址,去测试一下对这个ip地址之间的连通性,那么ping是如何进行测试的呢?
ping的返回参数
C:\Users\hp>ping www.baidu.com
正在 Ping www.a.shifen.com [36.152.44.96] 具有 32 字节的数据:
来自 36.152.44.96 的回复: 字节=32 时间=74ms TTL=54
来自 36.152.44.96 的回复: 字节=32 时间=67ms TTL=54
来自 36.152.44.96 的回复: 字节=32 时间=46ms TTL=54
来自 36.152.44.96 的回复: 字节=32 时间=48ms TTL=54
36.152.44.96 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 46ms,最长 = 74ms,平均 = 58ms
ICMP报文中有32个字节的测试数据;
"时间=74ms"是往返时间。
"已发送=4"发送多个秒包、"已接收=4"收到多个回应包、"丢失=0"丢弃了多少个;
Minmum 最小值 、MAXimun 最大值、Average 平均值。
http://shifen.com是百度当年为了竞价排名这个广告系统注册的,
这个后台系统被命名为Shifen竞价排名,
以前的销售系统现在还叫shifen销售系统。
因为当年百度那个广告最低点击10分起价。
为什么有这么一个奇怪的名字呢?在《相信中国》中,
梁冬先生这样写道:“这个将来成就了百度80%收入的商业模式,
最初的管理平台是由一个叫刘子正的实习生主持开发的。
这也是唯一一个除http://baidu.com以外,
外人所知的百度公司所拥有的国际域名。
ping的工作过程
①首先ping命令会先发送一个 ICMP Echo Request(请求包)给对端
②对端接收到之后, 会返回一个ICMP Echo Reply(应答包)
③若没有返回,就是超时了,会认为指定的网络地址不存在。
注:默认情况下, ping命令会发送四次请求包,所以我们会看到


举个例子

Pc1 ping PC2,我们在电脑上输入ping 192.168.1.2之后都发生了什么呢?
① Ping 命令会构建一个 固定格式的 ICMP 请求数据包(Echo Request)
② ICMP 协议将这个数据包,连同去往的地址,一起 交给IP 层协议
③ IP协议将本机作为源地址,去往的地址为目的,加上一些其他的控制信息,交给数据链路层协议
④数据链层封装源目MAC地址交给物理层
⑤物理层将其转换成二进制比特流发出
⑥目的主机将比特流转换为数据,收到Echo Request包开始拆包
⑦拆开最外层帧头,发现目的地址与自己相同,继续拆包
⑧继续拆开ip包头,发现协议号为(1),交给ICMP去处理
⑨ ICMP收到之后进行响应,回复Echo reply
ping 域名与ping IP 的区别
域名
C:\Users\hp>ping www.baidu.com
正在 Ping www.a.shifen.com [61.135.185.32] 具有 32 字节的数据:
来自 61.135.185.32 的回复: 字节=32 时间=25ms TTL=54
来自 61.135.185.32 的回复: 字节=32 时间=26ms TTL=54
来自 61.135.185.32 的回复: 字节=32 时间=23ms TTL=54
来自 61.135.185.32 的回复: 字节=32 时间=23ms TTL=54
61.135.185.32 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 23ms,最长 = 26ms,平均 = 24ms
查下百度对应的IP
C:\Users\hp>nslookup www.baidu.com
服务器: cache1-xx
Address: 221.11.1.67
非权威应答:
名称: www.a.shifen.com
Addresses: 61.135.169.121
61.135.185.32
Aliases: www.baidu.com
IP
C:\Users\hp>ping 221.11.1.67
正在 Ping 221.11.1.67 具有 32 字节的数据:
来自 221.11.1.67 的回复: 字节=32 时间=14ms TTL=59
来自 221.11.1.67 的回复: 字节=32 时间=9ms TTL=59
来自 221.11.1.67 的回复: 字节=32 时间=18ms TTL=59
来自 221.11.1.67 的回复: 字节=32 时间=6ms TTL=59
221.11.1.67 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 6ms,最长 = 18ms,平均 = 11ms
可以看到ping IP 明显比ping 域名快,除了第一次发包时的域名解析导致慢以外,当每次ping完得到响应之后,ping程序会尝试一次反向dns查询(reverse dns lookup)来获取对应的域名,如果查询速度很慢的话,就会给人似乎延迟很大的感觉,其实这也是ping感觉慢,但是每次ping的响应时间却并不慢的原因。ping指令有一个 -n 选项,加上之后可以阻止ping程序去进行反向dns查询,这样ping起来就“快”了。
ping 常用命令格式
可以使用ping /?查看ping 命令相关参数

我们在电脑上去ping一个地址的时候,不仅能够看到网络是否能够通讯,还能够看到为什么不能进行通讯,比如请求超时,目的不可达,请求被拒绝等等,那么我们的电脑是如何知道这些原因的呢?我们来看一下ping包长什么样子。
结合WireShark分析数据包
ICMP报文

| 字段 | 解释 |
|---|---|
| 类型 | 占据一个字节,标识ICMP报文的类型。ICMP报文类型可以分为两大类,分别是取值在1~127之间的差错报文,另一类是取值大于128的信息报文 |
| 代码 | 占据一个字节,与类型字段一起共同标识ICMP报文的详细类型 |
| 校验和 | 是将整个ICMP数据包(包括数据部分)以16位为一个单位采用CRC校验,然后按位取反后的值 |
注:Frame 即数据帧,WireShark可以看到第一行编号是95

1、ICMP报文的前4个字节是统一的格式,共有三个字段:即类型,代码和检验和
2、ICMP所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。其它字段都ICMP报文类型不同而不同。
3、8位类型和8位代码字段一起决定了ICMP报文的类型
常用:
类型0,代码0:表示回显应答(ping应答)
类型8,代码0:表示回显请求(ping请求)。
类型11,代码0:超时
类型3,代码0:网络不可达
类型3,代码1:主机不可达
类型5,代码0:重定向
例:

IP数据报
ICMP+IP头部构成IP数据报

IP头部各字段:


以太网帧
我们选中以太帧报文(红色方框圈中的地方),则下面有14个字节被选中了(绿色方框圈中的地方)。可以看到圈中的数据分别是:目的地址的mac地址,源地址的mac地址,还有一个值为0x8000的数据。



数据链路层
双击第35帧数据包,可以得到如下的显示结果。点击数据链路层报文(红色方框标注的地方),可以看到整个74字节的报文内容(绿色方框圈起来的地方)就被选中了,这说明ping request数据链路层报文一共有74个字节。

双击该行,可以展开看到里面更详细的内容:

Tracert
Tracert工作原理:
1.首先tracert送出3个TTL是1的IP 数据包到目的地,当路径上的第一个路由器收到这个数据包时,它将TTL减1,此时TTL等于0.
-
所以该路由器会将此数据包丢掉,并送回一个ICMP time exceeded消息(TTL超时消息),里面包括发IP包的源地址,IP包的所有内容及路由器的IP地址
-
tracert 收到这个消息后,便知道这个路由器存在于这个路径上,接着tracert 再送出另一个TTL是2 的数据包,发现第2 个路由器…以此类推
-
当数据包到达目的地后,该主机则不会送回ICMP time exceeded消息
-
一旦到达目的地,由于tracert通过UDP数据包向不常见端口(30000以上)发送数据包,因此会收到「ICMP port unreachable」消息,故可判断到达目的地。
Tracert每次发送三个数据包的原因是为了避免有时候网络不稳定而造成的丢包,所以发送三个,为了保证数据包能够正常到达。