二层三层网络协议-ICMP和ping

 

ICMP协议
Internet Control Message Protocol 互联网控制报文协议

协议类型如下

 

ping程序主要是使用了ICMP协议里面的 echo request,echo reppply类型



查询和应答报文,会有一个标示符,标识本次的ping程序的id
还有一个序列号,表示发送报文的序号,比如发送一个2号探测包,那么就要收到一个2号回复包
ping程序里面还有时间戳,用来计算这个报文从发送到收到用了多长时间


此外还有差错报文,根据不同的类型区分
终点不可达3,终点不可达还可以细分为
1)网络不可达,找不到地方
2)主机不可达,找不到对应的主机
3)协议不可达,目标主机的支持的协议不对应
4)端口不可达,目标端口没开放
5)需要进行分片但设置了不分片位


源站抑制,也就是让源站放满发送速度
超时,也就是超过网络包的生存时间但还没达到
路由重定向

ping协议的截图如下:

 

ping协议的接收和发送过程

这是最简单的情况,如果跨网段,经过了路由器,还会继续转发
但对于ping程序来说,就是一个发送,收到的过程,中间经过了那些地方他并不知道
可以使用 tcpdump -i ech0 icmp 来查看icmp的收发过程

 

 

traceroute协议
这个协议利用了icmp的规则,故意制造了一些能够产生错误的场景
ping程序从A -> B,中间经过了哪些他是不知道的,而traceroute将TTL设置成了1,icmp数据包经过了路由之后就会变成TTL=0,产生一个错误,于是就返回了,这样就可以知道中间某个路由的了
接着继续设置TTL=2,TTL=3
traceroute每次发送的探测包的时候,故意将端口设置成很大,这个数据包如果真的达到了目标主机后,就会返回一个端口不可达的错误,于是traceroute就知道到目的地了

如果数据包没达到,这可能是超时了

 

traceroute还有一个作用是 故意设置不分片,从而确定路径的MTU

traceroute第一个分组长度正好跟出口的MTU相等,如果中间遇到窄的关口被卡主,就会返回ICMP网络差错包,于是traceroute就减小分组的长度,直到能到大目标主机为止

 

traceroute  baidu的结果

 

tcpdump  traceroute 的结果

 

 

 

 

 

 

参考

维基百科ICMP协议

ICMP详解