赞
踩
ping是基于ICMP(Internet Control Message Protocol)协议工作的,首先熟悉一下ICMP协议
互联网控制报文协议
ICMP功能:确认IP包是否成功送达目标地址,报告发送过程中IP包被废弃的原因和改善网络设置等。
ICMP 的这种通知消息会使用 IP 进行发送 。
ICMP报文是封装在IP包里的,工作在网路层,是IP协议的助手。
ICMP 包头的类型字段,大致可以分为两大类:
回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息,ping命令就是利用这个消息实现的。
可以向对端主机发送回送请求的消息(8),也可以接收对端主机发送回来的回送应答(0)。
相比于原生ICMP,这里多两个字段:
目标不可达消息 —— 类型 为 3
原点抑制消息 —— 类型 4
重定向消息 —— 类型 5
超时消息 —— 类型 11
网络不可达 0 :IP地址是分为网络号和主机号的,所以当路由器中的路由器表匹配不到接收方IP的网络号
主机不可达 1 :路由器表中没有该主机的信息或主机没有连接到网络
协议不可达 2:主机使用TCP协议访问对端主机时,能找到对端的主机了,但是对端主机防火墙禁止TCP协议访问,会通过ICMP协议以协议不可达的原因告知主机
端口不可达 3:对端主机没有进程监听8080端口
路由器发送端主机使用不是最优的路径发送数据,那么它会返回一个ICMP重定向消息给这个主机,在这个消息中包含了最合适的路由消息和源数据。
IP包中有一个字段叫做TTL(生存周期),它的值随着每经过一次路由器就会减1,直到减到0时该IP包会被丢弃。设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。
同个子网下的主机 A 和 主机 B,主机 A 执行ping 主机 B 后,我们来看看其间发送了什么?
ping命令执行的时候,源主机首先会构建一个ICMP回送请求消息数据包。
ICNO数据包内包含多个字段,最重要的两个是:
主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。
接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。
主机 B 会构建一个 ICMP 回送响应消息数据包,回送响应数据包的类型字段为 0,序号为接收到的请求数据包中的序号,然后再发送出去给主机 A。
在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。
此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。
可以看出 ping 这个程序是使用了 ICMP 里面的 ECHO REQUEST(类型为 8 ) 和 ECHO REPLY (类型为 0)。
traceroute 192.168.1.100
traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。
原理:利用 IP 包的生存期限 从 1 开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息的一种方法。
比如,将 TTL 设置 为 1,则遇到第一个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是时间超时。
接下来将 TTL 设置为 2,第一个路由器过了,遇到第二个路由器也牺牲了,也同时返回了 ICMP 差错报文数据包,如此往复,直到到达目的主机。这样的过程,traceroute 就可以拿到了所有的路由器 IP。
traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU。这样做的目的是为了路径MTU发现。
它的工作原理如下:
首先在发送端主机发送 IP 数据报时,将 IP 包首部的分片禁止标志位设置为 1。根据这个标志位,途中的路由器不会对大数据包进行分片,而是将包丢弃。
随后,通过一个 ICMP 的不可达消息将数据链路上 MTU 的值一起给发送主机,不可达消息的类型为「需要进行分片但设置了不分片位」。
发送主机端每次收到 ICMP 差错报文时就减少包的大小,以此来定位一个合适的 MTU 值,以便能到达目标主机。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。