[练习]traceroute命令
来源:互联网 发布:小米清空用户数据失败 编辑:程序博客网 时间:2024/06/05 17:24
2017/4/21 13:51本文,记录实现Linux命令traceroute(路由数据路径追踪命令),使用Linux C 原始套接字实现。
需求分析
traceroute命令:用于追踪数据包在网络上的传输时的全部路径,并测量其返回的时间。
- 可以知道信息从你的计算机到互联网的另一端主机是走的什么路径,相同的包(相同出发点和目的地)走的路径或许不同。
- 局域网在不同的网段之间,通过该命令排查是主机问题还是路由问题。
Linux常用网络工具:路由扫描之traceroute,链接
参考资料:
- 《计算机网络》4.4网际控制报文协议ICMP UDP
- 《UNIX网络编程·卷1 套接字接口API》28章
- 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实现
方案探索(进一步理解网际协议)
- UDP traceroute:发送udp路由数据包,监测返回icmp差错报告数据包
- ICMP traceroute: 发送icmp路由数据包,监测返回icmp差错报告数据包
参考链接
方案分析
UDP traceroute
利用:ICMP协议(类型)和UDP协议(端口)
- TTL-expired(type 11)
- ICMP port unreachable(type 3, code 3)
- UDP(port >32768 )
操作流程
- source发出UDP packet,
- source port使用随机的任何大于32768的高段port#,
- destination port # 从33434开始每送个probe依此递增,直至33434+29, (cisco router上使用extended-traceroute命令可以修改这个起始的33434 port #),
- 同时TTL从1开始依此递增,直至1+29=30(最多送30个probe)。
- 中间的router送回 ICMP TTL-expired,使得source得知了中间的每一个router,
- 最后的destination送回TTL-expired 和ICMP port unreachable (因为任何主机上都没有应用使用UDP port# >32768这样的高段port#)。
影响因素
- 中间某处封掉UDP port>32768回导致traceroute不工作
- 封掉TTL超时会使source看不到中间的router(有的router根本不支持回送TTL超时)
- 封掉type3, code3可能看不到destination
ICMP traceroute
利用:ICMP协议(类型)
- Echo Request(type 8)
- Echo Reply(type 0)
- TTL-expired(type 11)
操作流程
- 源发出 ICMP Equest,第一个request的TTL为1,第二个request的TTL为2,以后依此递增直至第30个;
- 中间的router送回ICMP TTL-expired ( ICMP type 11) 通知source,(packet同时因TTL超时而被drop),由此source知晓一路上经过的每一个router;
- 最后的destination送回ICMP Echo Reply。
影响因素
- 中间任何一个router上如果封了ICMP Echo Request, traceroute就不能工作;
- 如果封了type 11 (TTL-expired), 中间的router全看不到,但能看到packet 到达了最后的destination;
- 如果封了ICMP Echo Reply,中间的全能看到,最后的destination看不到。
实现过程
流程图如下:
关键代码结构:
数据结构设计:
github代码下载
0 0
- [练习]traceroute命令
- traceroute命令
- traceroute命令
- traceroute命令
- traceroute命令
- traceroute命令
- traceroute 命令
- traceroute命令
- traceroute命令
- traceroute命令
- traceroute命令
- traceroute命令
- traceroute命令
- traceroute命令
- traceroute命令
- traceroute命令略谈
- traceroute linux命令使用
- traceroute命令原理简介
- Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage
- pom文件报错读取架包失败Missing很多架包但是架包都有
- BottomNavigationBar的使用
- Oracle Exists用法
- 在AndroidStudio直接运行时百度地图显示,打包成APK,安装在真机上不显示的问题
- [练习]traceroute命令
- 如何打开pr_debug调试信息
- JAVA & JSON详解
- iOS开发:隐藏状态栏的方法
- linux共享内存初体验
- react native Slider 使用详解
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
- Android中基于ServerSocket的实际使用与简单介绍(内附一个PC端群控多台手机的消息发送和接收Demo)
- Unity Shader 基础知识