网络编程—Traceroute程序实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
目录 (1)
1. 问题描述 (2)
2. 需求分析 (2)
3. 系统设计 (2)
3.1. 概要设计 (2)
3.2. 详细设计 (4)
3.2.1. Traceroute的实现原理 (4)
4. 调试 (6)
5. 总结 (7)
6. 附录 (8)
7. 参考文献 (13)
8. 设计评语 (14)
1.问题描述
本次课程设计,我们小组选择了课外的题目,经过讨论,最终我们决定我们小组的课题为:网络编程——Traceroute程序的应用。
Traceroute(路由追踪)是一个非常有用的网络工具。在命令提示符下,执行Traceroute 程序,输入必要的参数后即可探测出到达网络中任何一台目标主机中途需要经过哪些路由器以及每个路由器的信息,比如IP地址等。在网络中进行多播通信或者遇到路由问题时,Traceroute获得的信息就非常有用。
2.需求分析
路由是把信息从源穿过网络传递到目的地的行为,在传输过程中,遇到一系列的中间节点。这些中间节点构成了路由跟踪的依据。路由的话题早已在计算机界出现,但直到八十年代中期才获得商业成功,这一时间延迟的主要原因是七十年代的网络很简单,后来大型的网络才较为普遍。而路由跟踪是在路由的基础上提出的问题,是利用路由跟踪实用程序于确定 IP 数据报访问目标所采取的路径。当我们不能通过网络访问目的设备时,网络运行者就需要判断是哪里出了问题。问题不仅仅会出现在最终目的设备,也可能出现在转发数据包的中间路由器。解决方法是,了解了 IP 数据报访问目标所采取的路径,将发现网络布网简单拓扑,确定路由断点即可解决网络故障。操作系统中的tracert 或traceroute 路由跟踪程序,通过它可以查看到达目标地址所经过的路径。它的作用与 ping 有类似之处,使用 ping 可以检查是否连接,如果不通,一般不好准确判断哪一个节点出错,而使用 tracert 则可以准确判断出错的部分。路由跟踪程序随着网络的发展而发展,现已经较为成熟,不仅在操作系统上有路由跟踪程序,在中间设备也加入路由跟踪程序,如 cisco 扩展路由跟踪程序,提供详细的参数选择。单、多线程路由跟踪程序都已经面世,实现方式也各不相同,如基于记录路由选项的,基于 UDP,基于 ICMP Echo Request 的路由探测。本课题主要基于UDP协议的路由探测方法。
系统实现路由的跟踪,每经过一个路由,要求得到经过该路由节点的地址,也就是说输入目标信息,可以得到本地主机到目标经过的所有中间节点。这些中间节点用 IP 地址标识。并要求对跟踪跳数,每一跳等待时间可控。为了让系统更加完善,首先要测试目标的连通性,系统中也要实现目标探测功能,即Ping 功能。
3.系统设计
3.1.概要设计
本次编写的Traceroute程序编写环境为在Linux系统下使用C语言进行编写。当完成编写后,使用gcc编译工具进行编译,测试无误后再次使用arm-linux-gcc进行编译,移植入开发板进行测试。
由于Traceroute程序的运行需要有真实的网络环境,需要根据所需的环境来搭建并且配置路由器,在当前条件下,我们小组使用了Dynamips模拟器。
实验所需的拓扑图如下:
当在Linux系统下运行经过编译的Traceroute程序并输入需要进行追踪的IP 地址,程序会显示出到达目标主机所经过的每一个路由器。
Linux系统网络属性配置
配置好linux系统中的网络属性,将IP地址设置为与R4同一网段,网关设置为10.0.0.1,即R4,运行经过编译的Traceroute程序并输入需要进行追踪的IP地址,程序会显示出到达目标主机所经过的每一个路由器。(详见测试结果)
3.2.详细设计
3.2.1.Traceroute的实现原理
Traceroute程序的实现主要涉及IP头部生存时间(time to live,TTL)字段的使用。
设置TTL字段的目的是防止数据报由于选路错误或其他软硬件原因从而导致在网络中无休止的流动,它指定了数据报的生存时间。TTL的初始值由源主机设置,当一份数据报经过路由器时,处理该数据报的路由器都需要把TTL值减去数据报在路由器中停留的秒数。但事实上大多数路由器只是简单地将TTL值减1,因此TTL字段最终被实现为一个跳站计数器。当TTL字段的值被减为0时,路由器就不会转发该数据报,而是将其丢弃,并产生一份ICMP超时差错报文发往源主机以通知错误的发生。Traceroute程序的关键就在于返回的这份ICMP超时差错报文的源地址就是途径路由器的IP地址。由此,通过一次递增TTL字段的值,就可以得到一份数据报在其传输路径上所经过的路由信息。
Traceroute程序在具体实现时,是令其向目的主机发送一个UDP数据包,并重复递增IP头部TTL字段的值。刚开始的时候TTL等于1,这样当该数据包抵达途中的第一个路由器时,TTL的值就被减为0,导致发送超时错误,因此该路由器会返回一个ICMP超时数据包到源主机。随后,主机将数据包的TTL值递增1,以便IP报文能传递到下一个路由器,下一个路由器将会生成ICMP超时数据包返回给源主机。依此类推,将返回的每一条ICMP超时消息都收集下来,便能知道中途都经过哪些路由器,直到最后到达目标主机。当TTL值递增的足够大,可达到目标主机的时候,便会返回一条ICMP“端口无法访问”的信息,因为目标主机没有在相应端口等待的进程。至此,Traceroute整个流程便完成了。
实现Traceroute程序是可以采取一个简便的方法。只需将封装好的ICMP 数据包发送到目标主机,TTL值初始化为1,此后每次发送的数据包都递增1,在TTL值减为0超时的时候,也会返回一条ICMP错误消息。程序中只需要一个ICMP类型的原始套接字即可实现。