[TCP/IP] 到达目的的方式(关于ping和traceroute)

我想于工程师而言,Reading the code是最好的交流方式,所以那个在芬兰的大叔说:Talk is cheap, show me the code.所以我想说:Talk is cheap, I will read your code.Talk并不是完全不必要,但某些时候,阅读代码,看代码中种种令人拍案的实现或注释,或许才能深刻体会作者的心境.

ping和traceroute是Linux中的两个系统工具, 用来判断某主机是否可达.单看功能,这两个工具似乎是重复的,更进一步,ping的功能更加丰富,traceroute似乎有点多余.事实真是这样吗?很多时候,事物的表象下面隐藏着更深入的真理,怀疑精神亦非常重要,只是在此处,我们应该选择相信集成这些工具的人是这个世界上一等一聪明的懒人,他们最不想做的事情就是重复的多余工作.我们也应该相信,写这些工具的人更是推动这个世界进步的先驱,他们的行为必有其目的.而凡人如我,亦以可以探究其背后的故事为乐.

那么,ping和traceroute有什么不同呢?你会说traceroute用来记录路由路径,但是ping -R也可以记录路由路径,而且ping可以做更多的事情,我们为什么还需要一个traceroute?

TCP/IP是逐跳传输,理论上来说,获取路由路径最简单的做法,是在发送端想目标端发送一个请求包,并令其记录下每hop的地址,目标端发送回应包时,将请求包记录的路由路径返回,则可获取完整路由路径.理论很完美.实作上有什么问题呢?实作上,每hop的地址都会被存储在请求包头的选项区域,此选项区域来自最早的ARPANET网络,那个时候,网络只局限于特殊人群使用,任意两台计算机连接需要的路径较短,因此,用来记录路由路径的选项区域被限定为36 byte.点分十进制记录的每个地址占用4 byte,选项区域只能存储9个地址.ping -R的实现,依赖于记录路由选项,而在RFC的定义中,此实现为可选项,那意味着路由器或者主机可以实现此选项,也可以不实现,一切依赖于产品经理当时的心情.这是一个不可靠的方法,而在数字世界,需要的便是可靠,可重复.

traceroute摒弃了这种实现方式,选取了较为复杂也较为可靠的方式.在TCP/IP中,ICMP协议可用于检测目的主机是否可达.ping和traceroute的实现都依赖于ICMP协议,但和ping不同的是, traceroute总是依赖于下一hop是否可达,来检测目的主机是否可达.traceroute同样会想目的主机发送请求包,与ping不同的是,traceroute会向每个下一hop发送请求包,通过每个下一hop的回应包,来获取到达目的主机的路由路径.实现上,则通过逐渐增加的ttl(请求包生命周期)来达成.traceroute先发送一个ttl为1的请求包,得到其下一跳地址,再发送一个ttl为2的请求包,得到下二跳地址,重复此操作,直到到达目的主机.可是其中存在另外一个问题:traceroute是通过下一跳将ttl减1后为0,后发回的超时响应来判定下一跳地址,目的主机当然也可以发回此超时回应,traceroute如何判定最终到达的是某一跳还是目的主机?traceroute采取了一种聪明的做法,向目的主机的某个不可达端口,发送请求包.如果为中间路径,则ttl将被减1后继续传送,直至最终timeout,如果到达目的主机,则主机会发挥端口不可达错误.凡此种种,皆依赖于ICMP协议的良好设计达成.

以上,为研究TCP/IP内容:ICMP, ping, traceroute记录.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值