[练习]traceroute命令

来源:互联网 发布:小米清空用户数据失败 编辑:程序博客网 时间:2024/06/05 17:24

2017/4/21 13:51本文,记录实现Linux命令traceroute(路由数据路径追踪命令),使用Linux C 原始套接字实现。
需求分析

traceroute命令:用于追踪数据包在网络上的传输时的全部路径,并测量其返回的时间。
  1. 可以知道信息从你的计算机到互联网的另一端主机是走的什么路径,相同的包(相同出发点和目的地)走的路径或许不同。
  2. 局域网在不同的网段之间,通过该命令排查是主机问题还是路由问题。
Linux常用网络工具:路由扫描之traceroute,链接
参考资料:
  1. 《计算机网络》4.4网际控制报文协议ICMP UDP
  2. 《UNIX网络编程·卷1 套接字接口API》28章
  3. ping百科、traceroute百科
Linux 与 Win 的实现区别

Linux:
h265@H265:traceroute$ traceroute -I www.baidu.comYou do not have enough privileges to use this traceroute method.socket: 不允许的操作h265@H265:traceroute$ sudo traceroute -I www.baidu.com[sudo] h265 的密码:traceroute to www.baidu.com (183.232.231.173), 30 hops max, 60 byte packets 1  gateway (10.0.4.2)  0.218 ms  0.133 ms  0.087 ms 2  10.30.24.1 (10.30.24.1)  5.890 ms  6.297 ms  6.349 ms 3  172.16.254.1 (172.16.254.1)  6.427 ms  6.513 ms  6.566 ms 4  10.0.3.9 (10.0.3.9)  2.115 ms  2.333 ms  5.428 ms 5  10.0.4.6 (10.0.4.6)  5.680 ms  5.779 ms  5.858 ms 6  183.236.19.129 (183.236.19.129)  6.441 ms  4.305 ms  5.555 ms 7  120.196.2.9 (120.196.2.9)  8.492 ms  6.597 ms  6.828 ms 8  * * * 9  * * *10  183.235.225.182 (183.235.225.182)  8.103 ms  8.038 ms  8.027 ms11  120.196.241.182 (120.196.241.182)  8.328 ms  8.467 ms  14.183 ms12  * * *13  * * *14  183.232.231.173 (183.232.231.173)  10.573 ms  12.545 ms  14.893 ms
结论:
     Linux提供两个实现(ICMP与UDP),指定实现方式需要root权限。
星号表示该路由网络不通畅(并非不通),提示命令重新寻址,所以不返回router信息。
Win:
菜单--运行--cmd--tracert www.baidu.com····很慢····
上面Win的自行操作,结论:
     Win提供UDP实现
方案探索(进一步理解网际协议)

  1. UDP traceroute:发送udp路由数据包,监测返回icmp差错报告数据包
  2. ICMP traceroute: 发送icmp路由数据包,监测返回icmp差错报告数据包
参考链接
方案分析
UDP traceroute
利用:ICMP协议(类型)和UDP协议(端口)
  1. TTL-expired(type 11)
  2. ICMP port unreachable(type 3, code 3)
  3. UDP(port >32768 )
操作流程
  1. source发出UDP packet,
    1. source port使用随机的任何大于32768的高段port#,
    2. destination port # 从33434开始每送个probe依此递增,直至33434+29, (cisco router上使用extended-traceroute命令可以修改这个起始的33434 port #),
  2. 同时TTL从1开始依此递增,直至1+29=30(最多送30个probe)。
  3. 中间的router送回 ICMP TTL-expired,使得source得知了中间的每一个router,
  4. 最后的destination送回TTL-expired 和ICMP port unreachable (因为任何主机上都没有应用使用UDP port# >32768这样的高段port#)。 
影响因素
  1. 中间某处封掉UDP port>32768回导致traceroute不工作
  2. 封掉TTL超时会使source看不到中间的router(有的router根本不支持回送TTL超时)
  3. 封掉type3, code3可能看不到destination

ICMP traceroute
利用:ICMP协议(类型)
  1. Echo Request(type 8)
  2. Echo Reply(type 0)
  3. TTL-expired(type 11)
操作流程
  1. 源发出 ICMP Equest,第一个request的TTL为1,第二个request的TTL为2,以后依此递增直至第30个;
  2. 中间的router送回ICMP TTL-expired ( ICMP type 11) 通知source,(packet同时因TTL超时而被drop),由此source知晓一路上经过的每一个router;
  3. 最后的destination送回ICMP Echo Reply。
影响因素
  1. 中间任何一个router上如果封了ICMP Echo Request, traceroute就不能工作;
  2. 如果封了type 11 (TTL-expired), 中间的router全看不到,但能看到packet 到达了最后的destination;
  3. 如果封了ICMP Echo Reply,中间的全能看到,最后的destination看不到。
实现过程

流程图如下:

关键代码结构:

数据结构设计:

github代码下载

0 0
原创粉丝点击