那么我们为什么要用到ICMP协议呢?它的诞生是为了什么呢?
我们数据在网络中传输中,会封装成IP数据包,而IP协议的特点是面向无连接,且不可靠的,可靠性由上层来保证。IP协议所要做的就是尽最大努力把数据传输到目的地,如果当在路由器的转发中出错了而不能到达目的地时,IP协议对错误不进行任何报告和纠正,此时主机就不知道路由器那边有什么问题。而ICMP协议正好解决了这个问题。
那么它是如何进行解决的呢?
icmp主要有两个功能,一个是ping:一般用用于勘测到达目的网络的连通性;一个是tracert:用于确定ip数据访问目标所采取的路径。
Ping的工作原理。
我们在测试网络连通性的时候会使用ping+ip地址的格式,那么当这个命令输入完成之后设备会执行什么样的操作呢?
① Ping 命令会构建一个 固定格式的 ICMP 请求数据包(Echo Request)
② ICMP 协议将这个数据包,连同去往的地址,一起 交给IP 层协议
③ IP协议将本机作为源地址,去往的地址为目的,加上一些其他的控制信息,交给数据链路层协议
④数据链层封装源目MAC地址交给物理层
⑤物理层将其转换成二进制比特流发出
⑥目的主机将比特流转换为数据,收到Echo Request包开始拆包
⑦拆开最外层帧头,发现目的地址与自己相同,继续拆包
⑧继续拆开ip包头,发现协议号为(1),交给ICMP去处理
⑨ ICMP收到之后进行响应,回复Echo reply
ICMP报文的前4个字节是统一的格式,共有三个字段:即类型,代码和检验和,所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。其它字段都ICMP报文类型不同而不同,8位类型和8位代码字段一起决定了ICMP报文的类型。
Tracert工作原理
Tracert的工作原理大概可以分为五个步骤:
1.首先tracert送出3个TTL是1的IP 数据包到目的地,当路径上的第一个路由器收到这个数据包时,它将TTL减1,此时TTL等于0.
2. 所以该路由器会将此数据包丢掉,并送回一个ICMP time exceeded消息(TTL超时消息),里面包括发IP包的源地址,IP包的所有内容及路由器的IP地址
3. tracert 收到这个消息后,便知道这个路由器存在于这个路径上,接着tracert 再送出另一个TTL是2 的数据包,发现第2 个路由器…..以此类推
4. 当数据包到达目的地后,该主机则不会送回ICMP time exceeded消息
5. 一旦到达目的地,由于tracert通过UDP数据包向不常见端口(30000以上)发送数据包,因此会收到「ICMP port unreachable」消息,故可判断到达目的地。
Tracert每次发送三个数据包的原因是为了避免有时候网络不稳定而造成的丢包,所以发送三个,为了保证数据包能够正常到达。
以上介绍的就是ping与tracer的工作原理,那是如何被用到的呢?
以上图为例,我们在AR1上用ping去测试是否能够到达5.5.5.5这个ip地址
使用Wireshark抓取icmp的ping包查看ping包中的内容。
接下来我们看5.5.5.5对于12.1.1.1的回复报文
在网络中有很多的原因造成网络不能够连通,这些导致不连通的原因都在ICMP报文中进行标识。常见的有一下几种类型:
类型0,代码0:表示回显应答(ping应答)
类型8,代码0:表示回显请求(ping请求)。类型11,代码0:超时
类型3,代码0:网络不可达
类型3,代码1:主机不可达
类型5,代码0:重定向
接下来测试Tracert,在AR1上使用Tracert 5.5.5.5,来测试去往5.5.5.5的路径
当下游设备收到ttl等于1的报文,会以ICMP time exceeded 回复响应报文,告诉AR1 ttl超时。
当AR1收到此ICMP报文,就会再次发送TTL等于2的勘测报文,再次进行测试,一点一点的推出下游节点信息。
以此类推直到TTL能够到达目标设备,目标设备收到之后以ICMP port unreachable 回复
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至2705686032@qq.com 举报,一经查实,本站将立刻删除。原文转载: 原文出处: