|
发表于 2010-3-4 14:26:45
|
显示全部楼层
本帖最后由 kkingkill 于 2010-3-4 14:40 编辑
这个问题确定很有意思
按正常理解:每经一跳TTL值减一
那为什么ping自己是TTL=128,而ping 网关却是TTL=64.
首先,先引用一段资料:
TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。
TTL:(Time To Live ) 生存时间
指定数据包被路由器丢弃之前允许通过的网段数量。
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 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 NT/2K操作系统 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。
请注意以上红字部分:
windows NT/2K/XP使用的TTL=128
freesBSD使用的TTL=255
linux使用的TTL=64
而市场上使用的宽带路由器基本上都是使用uClinux,uclinux是嵌入式Linux的一个分支,所以,TTL也应该是64。
(关于uClinux,有兴趣可以http://user.qzone.qq.com/309169119?ptlang=2052)
第二点,ICMP包分为两种:request和reply. request是你ping别人,而reply是别人响应你。
以PC ping 网关为例。你发的request包里面的TTL=128(这个可以用wireshark抓包看到),但网关回复的reply包却是TTL=64.从这里我们可以隐约可以发现一个规则:跨平台时request和reply处理机制是不太一样的,并不是简单的把request中的TTL-1就是reply中的TTL。reply包是根据目标本身的默认TTL减去经过的跳数。
故,如果你ping 目标是XP系统,则reply包中的TTL是128-跳数.如果你ping的目标是linux系统,则reply包中的TTL是64-跳数。
这也就解释了为什么你ping LAN内部是返回的TTL=128.(XP系统),而ping 网关TTL=64.(宽带路由器是uclinux系统)。
你可以进一步研究router的TTL。可以把PC与router桥接(模拟器)。PC上ping router,会发现request中的TTL=128,而reply中TTL=255。
所以,我们可以利用这点规则来基本判断你ping的目标使用的操作系统(当然,如果目标默认TTL改了就无法判断了)。
在我的电脑上我ping www.google.cn,返回的TTL=246,所以,我猜使用的可能是router或freebsd。
然后再ping www.qq.com,返回的TTL=58,所以可能是linux。
当然,以上只是我的个人见解,没有严格的理论依据。 |
|