ICMP:internet Control Message Protcol 网络控制报文协议
TTL:生存时间,是IP协议包中的一个值,它告诉网络,数据包在网络中的时间是否太长而应被舍弃。有很多原因使包在一定时间内不能被传递到目的地。解决方法就是在一段时间后丢弃这个包,然后给发送者一个报文,由发送者决定是否要重发。TTL的初值通常是系统缺省值,是包头中的8位的域。TTL的最初设想是确定一个时间范围,超过此事件就把包丢弃。由于每个路由器都至少要把TTL域减一,TTL通常表示包在被丢弃前最多能经过的路由器个数。当计数到0时,路由器决定丢弃改包,并发送一个ICMP报文给最初的发送者。
指定数据包被路由器丢弃之前允许通过的网端数量。
TTL是由发送主机设置的,以防止数据包不断在互联网上永不终止地循环。转发IP数据包时,要求路由器至少将TTL减小1。
使用ping时涉及到的ICMP报文类型
一个是ICMP请求回显(ICMP Echo Request)
一个为ICMP回显应答(ICMP Echo Reply)
TTL字段值可以帮助我们识别操作系统类型。
UNIX 及类 UNIX操作系统 ICMP 回显应答的 TTL 字段值为 255 Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64 Windows 7 ICMP 回显应答的 TTL 字段值为 64 WINXP-32bit 回显应答的 TTL 字段值为 128 微软 Windows NT/2K/2003操作系统 ICMP 回显应答的 TTL 字段值为 128 微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32 当然,返回的TTL值是相同的 但有些情况下有所特殊 LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64 FreeBSD 4.1, 4.0, 3.4; Sun Solaris 2.5.1, 2.6, 2.7, 2.8; OpenBSD 2.6, 2.7, NetBSD HP UX 10.20 ICMP 回显应答的 TTL 字段值为 255 Windows 95/98/98SE Windows ME ICMP 回显应答的 TTL 字段值为 32 Windows NT4 WRKS Windows NT4 Server Windows 2000 Windows XP ICMP 回显应答的 TTL 字段值为 128 这样,我们就可以通过这种方法来辨别操作系统 TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255。
举例来说: 以下是ping66.235.204.42的返回值: C:\Documents and Settings\user>ping Pinging [66.235.202.42] with 32 bytes of data: Reply from 66.235.202.42: bytes=32 time=254ms TTL=51 Reply from 66.235.202.42: bytes=32 time=256ms TTL=51 Request timed out. Reply from 66.235.202.42: bytes=32 time=260ms TTL=51 Ping statistics for 66.235.202.42: Packets: Sent = 4, Received = 3, Lost = 1 (25% loss), Approximate round trip times in milli-seconds: Minimum = 254ms, Maximum = 260ms, Average = 256ms 从结果中可以看出所用的时间是256ms等,那TTL等于51是什么意思呢? TTL是生存时间的意思,就是说这个ping的数据包能在网络上存在多少时间。当对网络上的主机进行ping操作的时候,本地机器会发出一个数据包,数据包经过一定数量的路由器传送到目的主机,但是由于很多的原因,一些数据包不能正常传送到目的主机,那如果不给这些数据包一个生存时间的话,这些数据包会一直在网络上传送,导致网络开销的增大。当数据包传送到一个路由器之后,TTL就自动减1,如果减到0了还是没有传送到目的主机,那么就自动丢失。默认情况下,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。(这个是从网络上找到的),目的主机是采用FreeBSD系统的(可能已经更换),在这里可能TTL值是64,而不是UNIX主机的255,所以在从这里到目的主机经过了64-51=13个路由。当不知道目的主机的操作系统的时候我们可以根据TTL来猜测,但是不一定100%准确,如果目的主机是windows,但是经过了比如75个路由器,那么TTL的返回值是128-75=53,那么你可能认为这个目的主机是Linux系统,但是一般不会经过那么多的路由器,所以通过TTL来判断目的主机的操作系统还是有一定的依据的。