目录
关于ICMP协议,本期就不在这里具体介绍,这里只是简单回顾一下报文类型。ICMP报文大致3大类,当然也可以分为2类:查询报文和差错报文。(也就说,一个ICMP报文,要么是查询报文,要么就是差错报文。)
ICMP分3大类
ICMP报文类型
ICMP 报文由首部和数据组成。首部为定长8字节(前4字节是通用部分,后4字节随类型不一样有所差异。)ICMP报文的一般格式如图所示:
tracert会用到的报文如下:
tracert原理除了会涉及上述报文,还涉及到一个机制,就是IP报文首部的TTL字段:
TTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。TTL是IPv4报头的一个8 bit字段。TTL的作用是限制IP数据包在计算机网络中的存在的时间。TTL的最大值是255,TTL的一个推荐值是64。
traceroute的实现原理,有两种方法:1、基于UDP报文实现的;2、基于ICMP报文实现。接下来分别与大家介绍一下这2种方法是如何实现的?
基于UDP报文的traceroute是这样实现的:让你在客户端输入 traceroute 命令+ip时, 客户端就发起一个UDP报文,使用一个大于30000的端口号(选这么端口号,目的端一般都是未使用,所以待会就收到一个端口不可达信息。)这样子,服务器端收到这个UDP报文后就会返回ICMP端口不可达的错误信息。同时,第一个数据包,TTL=1,这样第一跳路由器收到后,要转发出去时,会将TTL减一,即TTL=0, 就丢弃,然后第一跳路由器就返回一个ICMP超时的错误信息,所以,客户端通过判断收到ICMP端口不可达报文来确定数据包已到达目的地,如果是收到ICMP超时错误信息报文,说明还没到达目的地,就会将TTL加1,以此类推。
下面,龙哥将通过动态图给大家演示,traceroute基于UDP的实现原理:希望大家看完能更加直观地掌握。
1、客户端发送第一个端口大于30000,TTL=1的UDP数据报文,第1跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=0,就丢弃该数据包,并向客户端返回TTL超时的ICMP报文。客户端收到,TTL超时ICMP报文,从报文里面的源地址,得到第1跳地址:10.10.10.10
2、由于客户端发现还没收到端口不可达的ICMP报文,于是继续尝试发送,端口号比上次发送的进行加1,TTL也进行加1。第1跳路由器收到后,根据目的地址进行转发,转发出去时,TTL减1,减完后TTL=1。第2跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=0,就丢弃该数据包,并向客户端返回TTL超时的ICMP报文。
客户端收到,TTL超时ICMP报文,从报文里面的源地址,得到第2跳地址:20.20.20.20
3、由于客户端仍然还没收到端口不可达的ICMP报文,于是继续尝试发送,端口号比上次发送的进行加1,TTL也进行加1。第1跳路由器收到后,根据目的地址进行转发,转发出去时,TTL减1,减完后TTL=2。第2跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=1, TTL不是0,路由器就继续转发。数据包终于到达服务器啦!服务器查看目的地址,就是找我的,于是继续解封装,查看UDP报文的数据部分,发现端口号不可达,于是向客户端发送一个 端口不可达的ICMP报文。
客户端收到,端口不可达的ICMP报文,确认UDP数据包已成功到达服务器了,traceroute结束,并记录源IP地址:192.168.2.1
这一次,我们不再使用UDP报文了,而是使用ICMP的回显请求和回显应答这两种报文。原理跟 前面介绍UDP差不多,换汤不换药。
基于ICMP报文的traceroute是这样实现的:让你在客户端输入 traceroute 命令+ip时, 客户端就发起一个ICMP回显请求报文,第一个数据包,TTL=1,这样第一跳路由器收到后,要转发出去时,会将TTL减一,即TTL=0, 就丢弃,然后第一跳路由器就返回一个ICMP超时的错误信息,客户端收到后,会判断是否收到ICMP 回显应答 报文? 如果还没收到,就会继续发送回显请求报文,TTL加1进行尝试,当到底服务器后,服务器就会发送ICMP 回显应答报文。
1、客户端发送第一个TTL=1的ICMP 回显请求报文,第1跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=0,就丢弃该数据包,并向客户端返回TTL超时的ICMP报文。客户端收到,TTL超时ICMP报文,从报文里面的源地址,得到第1跳地址:10.10.10.10
2、由于客户端发现还没收到回显应答 的ICMP报文,于是继续尝试发送,TTL进行加1。第1跳路由器收到后,根据目的地址进行转发,转发出去时,TTL减1,减完后TTL=1。第2跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=0,就丢弃该数据包,并向客户端返回TTL超时的ICMP报文。
客户端收到,TTL超时ICMP报文,从报文里面的源地址,得到第2跳地址:20.20.20.20
3、由于客户端仍然还没收到 回显应答 的ICMP报文,于是继续尝试发送,TTL进行加1。第1跳路由器收到后,根据目的地址进行转发,转发出去时,TTL减1,减完后TTL=2。第2跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=1, TTL不是0,路由器就继续转发。数据包终于到达服务器啦!服务器查看目的地址,就是找我的,于是继续解封装,查看IP数据部分(ICMP),发现是回显请求的ICMP报文,于是向客户端发送一个 回显应答的ICMP报文。
客户端收到,回显应答的ICMP报文,确认UDP数据包已成功到达服务器了,traceroute结束,并记录源IP地址:192.168.2.1
配置很简单,这里不再列出。
1、配置直连接口IP地址、设备名。2、把路由打通,我随便配了OSPF路由协议,全网可达就行。
R1处抓包:TTL=1 , ICMP请求报文。
PC1收到TTL 超时报文:
实现中,traceroute每次会发3个同样的数据包,这里只列举一个。
R1处抓包:TTL=2, ICMP请求报文。
R2处抓包:TTL=1, ICMP请求报文。
PC1收到的TTL 超时报文:
中间的多跳路由器,收到的ICMP 回显请求报文,这里不在列举。这列举一下,PC1收到的回显应答报文:
2、在路由器上R1 tracert PC 2,然后再每个进方向的接口处抓包:
发送UDP报文,TTL=1 ,端口号 33434
收到TTL超时报文,并且会把刚刚请求报文的头部信息放在数据部分:
每一次会发3个同样的UDP报文,TTL一样,端口会再上一个基础上加1::
发送UDP报文,TTL=2,端口号 334347
第2跳路由器收到的UDP报文:TTL=1,端口号 334347
PC1收到的TTL 超时报文:
中间的多跳路由器,收到的很多UDP报文,这里不在列举。这列举一下,PC1收到的端口不可达报文: