0x00.当我们ping了一下,发生了什么?
下图为从192.168.1.2发送一个type=8,code=0的查询报文,下面是它的发送和接受response过程
ping发包
0x01.ICMP(Internet Control Message Protocol)
ICMP协议的类型分为两大类,查询报文和差错报文。如下表:
icmp为ip上一层协议,但因为承担了一部分ip协议功能,所以有时也被和ip层协议放在一层
下图为差错报文响应(上层1、2,发送ip数据报,返回差错icmp报文)以及查询报文(下层1、2,发送icmp查询,返回icmp响应的报文)也即ping的过程,以及ip头和icmp头的各个字段,可详见RFC 792(ICMP)和RFC 791(IP)
差错响应、查询响应、报文头拆解
具体地,ip协议头和icmp协议头的具体构成如下:
报文头结构
0x02.traceroute
traceroute的原理其实是利用了icmp的差错报文响应来实现对路由进行探测的
我们通过执行 traceroute 192.168.1.1,来分析一下他的原理,它的原理就是利用 IP 包的 TTL 从 1 开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息的方法。
首先 traceroute 会将 IP 包的 TTL 设置 为 1,然后发送 UDP 包,他会填入一个端口号作为 UDP 目标端口号(默认是:33434-33534);在这之后,TTL=2 3 4 ……
下图为展示traceroute原理:
traceroute原理
实验:
从192.168.1.1发送一个ttl=1的UDP报文,port随机33435 -- 48596
发包
返回一个差错响应为3的ICMP报文,type=3,code=3
收包
对照一下:
type=3,code=3
端口不可达
但如果是路由器禁用icmp或者主机不存在,那么这个差错报文是不会返回的
所以证明udp发送到了主机,然后被拒掉了,返回了type=3,code=3的icmp报文
值得注意的是:
traceroute在linux中发包使用的是udp(默认,可改),在windows中发包使用的则是icmp协议(默认)
参考文献:
https://zhuanlan.zhihu.com/p/369623317
https://blog.csdn.net/LearnLHC/article/details/115247444