我离baidu.com有几跳
一、背景
最近,读了网易游戏面试经验(三) - cotyb - 博客园之后,自己尝试着在windows下tracert了一下baidu.com,结果如下图一所示,发现从tracert的结果看,似乎一直到30跳之后都没有达到baidu.com(220.181.57.217)。然而如果ping baidu.com是可以ping通的,心想30跳也到不了baidu.com似乎有点远,于是有了下面的尝试。
尝试一:指定ttl为29,ping,可以ping通
尝试二:比较ping和tracert抓包结果
ping包的内容
tracert包的内容
二、初步结论
对比ping和tracert包之后发现,ping包的内容里有abcdef...等字符,而tracert的icmp包则是全0。猜测是baidu.com对icmp包的内容进行了识别。为了验证这一点,下面通过scapy,构造不同icmp包进行验证。
三、验证
1)scapy发送64个字节全零报文,wireshark抓包显示没有收到应答:
a=64*"\x00"
send(IP(dst="220.181.57.217")/ICMP()/a)
2)发送内容为“abcdefghjklmnopq”、“abcdefghjklmnopqr”的报文,都收到了应答。
send(IP(dst="220.181.57.217")/ICMP()/“abcdefghjklmnopq”)
四、一个可以输出距离baidu.com有几跳的小脚本
一些复杂的场景比如,不同ping baidu.com得到不同地址没有考虑。修改这个小程序,读取ping的输出的话,能够得到和每一跳的IP地址。
import os n=30 i=1 while i<n: a=os.popen('ping -n 2 -i '+str(i)+' baidu.com').read() if "TTL=" in a: print "success" break i=i+1 #print a if i<n: print "distance is %d hops"%i