在工作和生活中,常常会遇到网络不通的情况,而机器明明就在那里,看着都好好的,就是网络不通。遇到类似的问题如何定位呢?
1 ICMP 协议的格式
要分析类似的问题,我们先需要了解一个协议,ICMP 协议,ICMP 全称 internet Control Message Protocol,就是互联网控制报文协议。
网络包在异常复杂的网络环境中传输时,常常会遇到各种各样的问题。当遇到问题的时候,总不能“死个不明不白”,要传出消息来,报告情况,这样才能调整传输策略。
ICMP 报文是封装在 IP 包中的,因为传输指令的时候,肯定需要源地址和目的地址。它本身非常简单,作为控制报文肯定要尽量简单。
ICMP 报文有很多的类型,不同的类型有不同的代码。最常用的类型是主动请求为8,主动请求的应答为 0。
查询报文类型
查询报文类型是主动侦探网络的情况。对应的工具为 ping。ping 会存放发送请求的时间值,来计算往返时间,说明路程的长短。
差错报文类型
差错报文就是发送出一些侦探包,根据侦探包的返回类型来判断网络呢情况。主要有以下几种差错:
- 终点不可达
具体的原因在代码中表示就是,网络不可达错误码为 0,主机不可达错误码为 1,协议不可达错误码为 2,端口不可达错误码为 3,需要分片但设置不了分片错误码为 4。 - 源站抑制
即网络拥堵,让源站放慢发送速度。 - 时间超时
超过网络包的生命周期还没到达。 - 路由重定向
即下次请发另一个路由器,此路不是最优路径。
2 ping 的工作过程
3 Traceroute:差错报文类型的使用
那么是不是要网络确实遇到这些错误了才能出现这些错误报文呢?那也不是,有一个 traceroute 程序会使用 ICMP 的规则,故意制造一些能够产生错误的场景。
所以,一个作用是 traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地沿途要经过的路由器。如果将 TTL 设置为 1,则经过一个路由器该报文就牺牲了,会产生一个差错报文返回。将 TTL 设置为 2,则经过两个路由器该报文就牺牲了,如此可以拿到此报文发送出去将经过的全部路由器 ip。
traceroute 可以设置一个不可能的端口,来测试报文超时时间。
traceroute 可以故意设置不分片,从而确定路径的 MTU。
4 总结
- ICMP 相当于网络世界的侦察兵。分为主动请求报文和差错报文类型。
- Ping 使用查询报文,Traceroute 使用差错报文。