TCP/IP协议详解卷1学习笔记系列二

TCP/IP协议详解卷1学习笔记系列二
【TCP/IP协议详解卷1学习笔记系列二】卷1第七、八章
第七章是Ping程序的基本原理,第八章是traceroute( Win2000下是tracert)的原理 。主要介绍的是一些原理性的东西,并以实际的tcpdump的抓包的内容作解释 。
ping 程序是利用icmp的回复请求来探测远端主机是否可达 。(并不能继续判定端口是否可达 。要想查看端口,就要使用扫描器了 。)win2000里的网络库里已经提供网络函数库(icmp.dll)可以实现利用icmp来探测远端主机 。相比起使用管道来读ping的结果,或者嵌入ping源码,这个是最简单的方法了(没办法,人懒) 。ping其实还有一个R选项,用来记录经过的路由,以前一直不知道 。(ping www.Google.com -r 7)记录经过的7个路由器 。按照分析,根据所在环境限制最多可以记录8~9个项目 。
除了回显请求外,还可以利用icmp来实现时间请求 。在icmp的数据包中可以包含发送时间,目的主机收到后再附上自身当时时间才发回 。这样可以做一个时间校验,并可以判定源与目的之间的通讯速度 。由于具体的内容部分比较烦,类型太多,一下子记不住各个类型的意思 。
一般用ping的时候只是用了它的最简单的功能:检查主机能不能连到 。其实使用它所提供的其他选项,可以实现许多细节上的控制,例如数据包长度,TTL,路由记录,宽/严路由经过路由等 。
tracetroute,也就是 trace route,跟踪路由 。这个程序最早是Van Jacobson实现的 。源码在网上可以找到,不过我还没有去找 。主要的原理是IP路由过程中对数据包TTL(Time to Live,存活时间)的处理 。当路由器收到一个IP包时,会修改IP包的TTL(及由此造成的头部检验和checksum变化) 。每收到一个包,检查这个的TTL是否是0或1 。假如是,表明这个包还没有到达目的地,而且剩余时间不多了,肯定是到不了目的地了 。这样路由器就简单地丢弃这个包,并给源主机发送 ICMP通知,说这个包已经超时了 。ICMP的通知信息里包含当前路由器发送时所用的IP 。
这样就可以通过构造数据包,来间接检查到达一个主机时经过了哪些路由 。一开始发送一个TTL为1的包,这样到达第一个路由器的时候就已经超时了,第一个路由器就发通知说包超时,这样就可以记录下所经过的第一个路由器的IP 。然后TTL加1,安全通过第一个路由器,而第二个路由器的的处理与第一个相同,丢包,发通知说包超时了,这样记录下第二个路由器IP,由此可以一直进行下去,直到这个数据包到达目标主机,由此打印出所有经过的路由器 。
在通信中,IP层只负责数据的路由与传输,并不处理数据包的内容 。例如ICMP,或TCP,UDP,这些协议是依靠IP层的传输功能来传送数据的 。在通信双方的主机中,收到这些协议的数据包后,一般在通信的对应主机上,会有程序来处理这些数据 。而直接的IP数据报是没有用处的(win2000的驱动层可以直接使用IP报而不需要加上其他协议,但是一般是不会这样用的) 。因此traceroute程序发送一个UDP包来试探 。对路由器来说,UDP数据报只是IP数据报的一种,它并不关心UDP数据报的具体内容 。直到这个包到达目的端的主机会,目的主机的内核会解析UDP数据报,并查找数据报中要求端口是否已经有进程在使用 。假如找到,则通知进程有数据到达 。而假如找不到,则发送一个“目的端口不可达”的ICMP错误数据回到源主机 。
这样就可以完全确定下来 。trcertroute建立一个UDP数据包,不断修改TTL值并发送出去,假如收到“超时错”,表示刚刚到达的是路由器,而假如收到的是“端口不可达”错误,表示刚刚到达的就是目的主机 。这样路由跟踪完成,程序结束 。

推荐阅读