网络协议之网络探测协议ICMP及其应用ping,traceroute
写在前面
我们知道,网络环境本身是非常不稳定的,那么当出现问题时,有没有一种标准的协议来处理类似的问题呢?答案是肯定的,这个协议就是ICMP,全称,Internet control message protocol,互联网控制报文协议。当然有了协议还不够,就像是写代码的时候只定义接口是不够的,还要定义具体的实现类。对于ICMP协议我所知的实现类
,即具体应用有ping,traceroute。
1:正文
首先ICMP协议是属于网络层的协议,封装在IP数据包里,格式如下:
报文主要分为两种类型。查询报文类型和差错报文类型,其中查询报文类型就是简单的主动请求和主动应答,而ping使用的就是这种报文,这点我们可以通过抓包来进行验证。
对于差错报文类型,其具体的应用是traceroute,traceroute会故意模拟错误,比如从1开始设置ttl值从而获取到到目标主机都经过了哪些路由,如下:
# traceroute www.google.com
traceroute: Warning: www.google.com has multiple addresses; using 66.249.89.99
traceroute to www.l.google.com (66.249.89.99), 30 hops max, 38 byte packets
1 192.168.0.1 (192.168.0.1) 0.653 ms 0.846 ms 0.200 ms
2 118.250.4.1 (118.250.4.1) 36.610 ms 58.438 ms 55.146 ms
3 222.247.28.177 (222.247.28.177) 54.809 ms 39.879 ms 19.186 ms
4 61.187.255.253 (61.187.255.253) 18.033 ms 49.699 ms 72.147 ms
5 61.137.2.177 (61.137.2.177) 32.912 ms 72.947 ms 41.809 ms
6 202.97.46.5 (202.97.46.5) 60.436 ms 25.527 ms 40.023 ms
traceroute还可以故意设置不分片
来探测中间路由的分组大小,如果遇到较小的路由分组大小,则会收到需要进行分片但设置了不分片位”的差错回复,直到获取一个最大的可以不需要分片就能到达目标主机的分组大小,从而提高数据包传输效率。