ICMP
ping 基于ICMP协议,ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
ICMP报文格式如下,封装在IP包里面,工作在网络层:
ICMP从类别上大概分为查询报文和差错报文。
PING
ping命令基于ICMP查询报文设计,原理是用类型码为8的ICMP发请 求,受到请求的主机则用类型码为0的ICMP回应。
ping首先通过arp协议广播请求目的主机的MAC地址,得到MAC地址之后发送请求报文。
回送应答报文格式如下:
和原始ICMP报文不同之处就是新增加了标识符和序号,标识符通常包含PID,序号从0开始,每次发送加1,可以确认网络包是否丢失。
PING命令的总体流程如下图所示
traceroute
Traceroute的原理是非常非常的有意思,它受到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据 报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。
有人要问,我怎么知道UDP到没到达目的主机呢?这就涉及一个技巧的问题,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较 小的端口,比如说80,比如说23,等等。而traceroute发送的是端口号>30000(真变态)的UDP报,所以到达目的主机的时候,目的 主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了。