系列博客参考:http://blog.csdn.net/zy416548283/article/category/1108400
代码以编号对应放在Github上:https://github.com/zy416548283/networkProgramming
题目
编程实现Traceroute的基本功能
题目解读
- 首先了解traceroute的基本用法和功能,我们来man一下:
traceroute tracks the route packets taken from an IP network on their way to a given host.
It utilizes the IP protocol's time to live (TTL) field and attempts to elicit an ICMP TIME_EXCEEDED response from each gateway along the path to the host.
- 了解traceroute的实现原理,可以参考[TCP/IP详解 卷一]
- 根据原理,编程实现traceroute
实现
原理
traceroute一开始向目的地发送一个TTL为1的UDP数据报,这个数据报在第一跳路由器返回一个超时的ICMP报文,并丢弃该报文.发送方解析这个ICMP报文(每个进程都会从内核收到一个消息的副本),如果是超时ICMP消息,将递增TTL一次,直到到达目标主机,此时目标主机会回复一个端口不可达的ICMP报文(发送的UDP报文会选择端口比较大,并且变化的端口),发送方解析ICMP端口不可达报文,打印对应的数据.
主流程
- 处理命令行参数/处理主机名或者IP地址;
- 做一些初始化工作;
- 进入循环
循环
- 创建两个套接字:一个原始套接字用于读取返送的ICMP消息;另外一个套接字用于发送探测分组的UDP套接字;
- 对TTL进行循环递增直到TTL达到最大或者到达目的地, 并且对于每个TTL发送3个UDP数据报的探测分组. 发送一个探测分组之后等待3秒钟来接收ICMP消息,然后才发送下一个探测分组.
- 关于没有收到ICMP回应报文的情况,这样处理:
if ( (code = (*pr->recv)(seq, &tvrecv)) == -3)