移植Traceroute到Ecos
traceroute 是什么?
Traceroute是一个能够显示数据包经过IP网络中的路由(路径)并且测量传输时延的计算机网络诊断工具。Traceroute会打印与目标主机间经过路由的往返时延,而Ping 仅计算与目标主机的最终往返时延。
Implementation
在Linux中,traceroute默认发送一组UDP报文到目的主机,但是可以配置ICMP请求或TCP SYN报文来替代。在Windows中,traceroute 默认发送ICMP请求报文而不是UDP报文。生存时间(TTL)值,被用来确定数据包发往目的地址过程中所经过的中间路由。当数据包经过路由器时,路由器会将数据包的TTL值减1,当路由器收到数据包的TTL值为0时,丢弃数据包,并返回ICMP error信息ICMP 超时。通常默认的初始TTL值为128(Windows OS)和64(Unix-based OS)
Traceroute程序通过初始发送TTL=1并且逐渐增加TTL值的数据包来识别中间路由。第一个路由器收到了数据包,减少TTL,发现TTL==0,丢弃数据包并返回ICMP超时信息给源地址。下一组数据包设置的TTL=2,所以第一个路由器将TTL-1并转发数据包,第二个路由器发现TTL==0,会丢弃数据包 并发回ICMP超时消息。Traceroute就可以通过 路由器发回的ICMP超时消息来构建一个数据包经过的路由器地址列表,直到到达目的地址,目的地址返回一个ICMP Reply消息。
每个沿路径返回的路由器时间戳值就是延迟的值,通常以毫秒为单位来测量每个包。
发送方期望在指定的秒内收到回复,如果在期望的间隔内没有收到确认数据包,会打印出一个星花。Internet Protocol不要求发往特定目的地的数据包必须采取相同的路由,所以主机列表记录的是数据包已经遍历过的主机。如果在#N跳的主机没有回复,在输出的时候这一跳被跳过。
在类Unix操作系统中,traceroute默认采用目的端口号范围33434-33534的UDP数据报。Traceroute程序通常有选项来使用ICMP Echo Request数据包或者TCP SYN报文来替代UDP。如果一个网络有防火墙并且同时管理Window 和类Unix系统,必须打开超过一个协议来允许traceroute穿过防火墙来工作并收到回复。
FreeBSD Traceroute Usage
1 | FreeBSD Traceroute命令选项(1.4a12+FreeBSD): |
-P:设置探查包协议类型:支持UDP(默认类型)、TCP、ICMP、GRE(协议号47,封装ppp协议:协议类型0x880b)
-p: 设置目的端口号
-i: 设置接口,探测包的源IP为接口IP地址(若有多个地址,可通过-s选项指定)
-s: 指定接口的一个IP地址为SIP
-t: 设置探查包IP协议TOS域
-w: 发送探查包后,设置接收数据等待时间,超时未收到数据则打印”*”
-m: 设置探查包IP协议TTL(Time to live)域
-g: 设置宽松的源站选路路由地址
-f: 设置first TTL值(默认为1)
-z: 两次探查间最小的时间间隔(default 0),单位ms,Useful when some routers use rate-limit for icmp messages.
-I: 设置发包协议类型为ICMP
-d: 打开socket层Debugging(需要内核支持)
setsockopt(sndsock, SOL_SOCKET, SO_DEBUG, (char )&on, sizeof(on));
-F: 设置探查包,IP不分片
-n: 显示IP地址时,不将其映射成主机名()
-r: 不经过路由表,直接发送给直连网络上的主机,如果主机不在直接网络上,则返回一个错误。
setsockopt(s, SOL_SOCKET, *SO_DONTROUTE**, (char *)&on, sizeof(on));
-S: 打印lost探查包百分比
-v: 打印调试信息(-v –v 会把探查包按字节打印出来)
-x: 填充探查包IP校验和字段
移植到ecos中遇到的问题
- Ecos共用同一地址空间,traceroute源文件中的全局变量和函数 须修改成static定义。
- Ecos Shell是一个单独线程来调用用户输入命令对应的函数(解析输入,调用相应函数),而不是执行命令的程序(ecos是一种单进程多线程操作系统),需要在调用函数时,对static 变量进行初始化。
总结
调试程序的时候,先从原理上弄懂程序,做到思想走在行动前面,思想指导行动,避免盲目行动。
本文链接:移植traceroute到Ecos
作者:Vskyman
出处:https://vskyman.github.io/
本文基于 知识共享署名-相同方式共享 4.0
国际许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名及链接。