TCP/IP详解 卷I:协议 のping和traceroute

ping
目的为了测试主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待主机返回,ICMP回显哟in应答。
如果ping不到某主机并不能说明不能Telnet或者FTP到那台主机。因为一台主机的可达性不仅取决于IP层是否可达,还取决于,使用何种协议和端口,ping程序运行的结果显示主机不可达,但是我们可以利用telnet程序登陆到该台主机的某个端口。如果不能telnet到那台主机,可以用ping程序来找出问题出现在哪里。还可以根据ping的往返时间估算出主机距离。

我们发送回显请求的ping程序称为客户,被ping的主机称为服务器。大多数的TCP/IP实都在内核中支持ping服务器,这种服务器不是一个用户进程。I C M P回显请求和回显应答报文如图:
回显
回显请求和应答报文格式
U n i x系统在实现p i n g程序时是把I C M P报文中的标识符字段置成发送进程的I D号。这样
即使在同一台主机上同时运行了多个p i n g程序实例,p i n g程序也可以识别出返回的信息。
序列号从0开始,每发送一次新的回显请求就加1。p i n g程序打印出返回的每个分组的序
列号,允许我们查看是否有分组丢失、失序或重复。I P是一种最好的数据报传递服务,因此
这三个条件都有可能发生。
在局域网运行ping程序一般输出如下格式:

64 bytes from 192.168.8.1: icmp_req=1 ttl=64 time=1.04 ms
64 bytes from 192.168.8.1: icmp_req=2 ttl=64 time=1.05 ms
64 bytes from 192.168.8.1: icmp_req=3 ttl=64 time=1.06 ms
64 bytes from 192.168.8.1: icmp_req=4 ttl=64 time=1.41 ms
64 bytes from 192.168.8.1: icmp_req=5 ttl=64 time=1.41 ms
64 bytes from 192.168.8.1: icmp_req=6 ttl=64 time=1.20 ms
64 bytes from 192.168.8.1: icmp_req=7 ttl=64 time=1.42 ms
64 bytes from 192.168.8.1: icmp_req=8 ttl=64 time=0.649 ms
当返回ICMP回显应答时,要打印出序列号和TTl,并计算往返时间。Ping程序通过在ICMP报文中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,及是往返时间。
IP记录路由选项

这里写图片描述

Ping程序为我们提供了查看IP记录路由(RR)选项的机会。大多数不同版本的Ping程序都提供-R选项,以提供记录路由的功能。它使得Ping程序在发送出去的IP数据报中设置IP RR选项(该IP数据报包含ICMP回显请求报文)。这样,每个处理该数据报的路由都把他的IP地址放入选项字段中。当数据报到达目的端时,,IP地址清单应该复制到ICMP回显应答中。这样返回途中所经过的路由器地址也被加入到清单中,当Ping程序收到回显应答时,他就打印出这份IP地址清单。
这个过程听起来很简单,但存在一些缺陷。源端主机生成RR选项,中间路由器对RR选项的处理,以及把ICMP回显请求中的RR清单复制到ICMP应答中,所有这些都是选项功能。幸运的是,现在大多数路由器都支持这些选项功能,只有一些系统不把ICMP请求中的IP清单复制到ICMP应答中。
但是,最大的问题是IP首部中只有有限的空间来存放IP地址。在以上图中,我们可以看到,IP首部长度字段只有4bit,因此整个IP首部最长只能包括15个32bit长的字(及60个字节)。由于ip首部固定长度为20字节,RR宣明星用去3个字节,这样只剩下37个字节来存放IP地址清单(60-20-3),也就是说只能存放9个IP地址。

IP数据报中的RR选项格式如下:
这里写图片描述

Traceroute原理Code是一个字节,指明IP选项的类型。对应RR选项来说,他的值为7.len是RR选项总字节长度,在这种情况下为39.(尽管可以为RR选项在、设置比最大长度小的长度,但是Ping程序总是提供39字节的选项字段,最多可以记录9个IP地址,由于IP首部留给选项的空间有限,他一般情况下都设置成最大长度)

Ptr称作指针字段。他是一个基于1的指针,他指向存放下一个IP地址的位置,他的最小值为4,指向存放第一个IP地址的位置,随着每个IP地址存入清单,prt的值分别为8、12最大到36.当记录下9个IP地址之后,ptr的值为40,表示清单已满。
Traceroute程序

Traceroute程序可以让我们看到IP数据报从以太主机传到另外一台主机所经过的路由。

Traceroute程序的操作

既然有IP记录路由选项(RR),为什么不使用这个路由选项,而要另外开发一个新的应用程序呢?主要有三个方面的原因,首先,以前并不是所有的路由器都支持记录路由选项,因此该选项在某些路径上不能使用。

其次,记录路由一般是单项的选项。发送端设置了该选项,那么接收端不得不从收到的IP首部中提取出所有的信息,然后全部返回给发送端。大多数Ping服务器的实现把接收到的RR清单返回但是这样使得记录下来的IP地址翻了一番。

最后一个原因也是最主要的原因,IP首部中留给选项的空间有限,不能存放当前大多数的路径。

Traceroute程序原理
Traceroute程序使用ICMP报文和和IP首部中的TTL字段(生存周期)。

每个处理数据报的路由器都要把TTL的值减去1或者减去数据报在路由器中停留的秒数。由于大多数的路由器转发数据报的延时都小于1秒钟,因此TTL最终成为一个跳站的计数器,所经过的每个路由器都将其值减1.

TTL字段的目的是防止数据报在选路时无休止的在网络中流动。例如,当路由器瘫痪或者两个路由器之间的连接丢失时,选路协议有时回去检查丢失的路由器并一直进行下去。TTL字段就是在这些寻暖传递的数据报上加上一个生存上限。

当路由器收到一份IP数据报,如果TTL字段是0或者1,则路由器不转发该数据报(接收到这种数据报的目的主机可以将它交给应用程序,这是因为不需要转发该数据报。但是,在通常情况下系统不应该接收TTL字段为0的数据报)。通常情况下是,路由器将该数据报丢弃,并给信源主机发送一份ICMP超时信息。Tracerouter程序的关键在于,这份ICMP超时信息包含了该路由器的地址。

那么,Tracerouter就通过发送一份TTL字段为1的IP数据报给目的主机。处理这份数据报的第一个路由器将TTL值减去1,丢弃该数据报,并回发一份超时ICMP报文。这样就得到了该路径中的第一个路由器的IP地址。然后Tracerouter发送一份TTL为2的数据报,这样就得到了第二个路由器的IP地址。那么,继续这个过程,直到达到目的主机。即使目的主机接收到一份TTL值为1的数据报也不会丢弃该数据报并产生一份ICMP报文,因为已经到达最终目的地。这个时候,Tracerouter程序发送一份UDP数据报给目的主机,但选择一个不可能的值作为目的端口号(大于30000),使得目的主机的任何一个程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的UDP模块产生一份“端口不可达”错误的ICMP报文,这样Tracerouter程序要做的就是区分搜到的ICMP报文是是超时还是端口不可达,以判断什么时候结束。

DDU ICMP controls consist of 3 controls : TDDUOSPING - A non blocking PING protocolTDDUOSTRACEROUTE - A non blocking TraceRoute ProtocolTDDUOSDNS - A non blocking ARP/RARP controlAbout TDDUOSDNS :Host names are resolved to IP addresses, and IP address can be resolved to host names. If you enter an IP into the ADDRESS property, the HOST property will be completed, and the OnHostLookup event will occur. If you enter an IP or a HOST name into the HOST property, the ADDRESS property will be completed, and the OnAddressLookup event will occure. The runtime property OK can be queried to see if the lookup was successful. To reduce lookup overhead, an IP/Hostname cache can be used by setting the UseIPCache property to true. The cache is only persistent for the current session, and maynot be saved between sessions. You can use FlushIPCache method to clear the cache.When combined with the other controls in this package, the delay normally associated with connecting a socket can be avoided. Each control must have a unique TDDUOSDNS control.About the Demo :The demo project shows how to use each control. The TDDUOSDNS control is shown both in combination with other controls, and used independantly. DNS not an ICMP protocol, but it is included to prevent the windows application from blocking.Blocking is when your windows program stops responding to messages, waiting for a call to return. Normally, all calls blocks for a very short time, and is not noticable - but when you have to wait for 5 or 10 seconds or even longer, the application can appear to be crashed. By using threads, callback messages, and events, I have illustrated how it is possible to avoid blocking in an application.These controls form a custom set of TCP/IP controls I have been developing over the past year. The ICMP controls were written over the period of a week, and I consulted several references for information. I would like to thank Quinn Shute for his excellent book "Windows Socket Network Programming&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值