简述

搭建网络环境的时候,经常有想要知道报文从源到目的所经历的所有路由节点这样的需要。此时,traceroute小程序,后续简称为tracert,就有用武之地了。

功能

tracert,最初由大神Van Jacobson设计并实现(膜拜),可以用来探测出报文在网络中从源到目的所经过的所有三层路由节点。

原理

既然tracert用来探测路径,那么问题来了:它如何确定路径?

1. 确定路径

我们知道IP报文头有一个ttl字段,用来确定IP报文的存活时间。每经过一次转发,ttl数值减一,当ttl为0时,如果报文还没有到达目的,那么协议栈就会向源端回应一个ICMP ttl超时报文。知道了这个东东后,确定路径是否就有眉目了呢?
(1)向目的发送ttl=1的UDP报文,第一个路由节点收到报文后发现ttl=0,向源端回应一个ICMP ttl超时报文,源知道了第一个路由节点。
(2)向目的发送ttl=2的UDP报文,第一个路由节点收到报文后ttl=1,继续转发给第二个路由节点,第二个路由节点收到报文后ttl=0,向源端回应一个ICMP ttl超时报文,源又知道了第二个路由节点。
(3)向目的发送ttl=3的UDP报文……

2. 确定目的

通过上面步骤可以一直发送UDP报文直到报文到达目的,那么问题来了:
(1)挖掘机技术哪家强?
(2)源如何知道报文到达了目的并停止发报文?
关于问题(1),我想大家都知道那是布鲁西特大学(blue shit)最强。
接下来重点介绍问题(2)。
我们又知道,UDP报文头有一个字段叫目的端口,用来告诉目的端这个报文要请求的是哪个服务。当目的端服务(端口)不存在时,协议栈会向源发送一个ICMP端口不可达报文,告诉源,这儿没这服务,别来烦我。源又知道了目的是不是,呵呵。

好,到此为止,问题完美解决。

有无其他方案

单纯从IP报文的角度来说,四层协议常用有三中:ICMP(经常被认为是三层协议,why,不告诉你),UDP,TCP。
前面我们介绍从源发送的是UDP报文,那么能否用ICMP或者TCP报文替换?答案必须是肯定的,否则哪里来的乐趣?

1.发送ICMP报文

确定路径的原理和前面一致,利用ttl超时。那么如何确认到达了目的?
想想ping程序的实现:发送ICMP echo报文,回应ICMP echo reply。
非常好,源持续向目的发送ttl递增的ICMP echo报文:收到ICMP ttl超时报文时认为是路径上路由节点,收到ICMP echo replay时认为到达了目的。

2.发送TCP报文

首先要明确的原理肯定和前面一致;其次要明确的是肯定不能直接发送TCP报文,why?
TCP是面向连接的协议,发送TCP报文首先要和目的建立连接,tracert哪里知道目的端有啥服务。就算知道某个目的端有某个服务,但是换个目的端怎么办?有没有通用点方案?

办法都是憋出来的,硬憋肯定能憋出来。
先来想想为啥不能发TCP报文,因为发报文前要先建立连接。
那连接咋建立的?三次握手。啥叫三次握手,简单来说跟建基友的过程是一样的:

Created with Raphaël 2.1.0 源 源 目的 目的 嘿,我要当你基友,你说好不好?(syn报文) 目的想了一下,说: 恩,好啊;那我也要当你基友,你说好不好?(ack + syn报文) 源非常happy 恩,好!(ack报文)

就是这么简单,so easy,一对好基友非常友好非常暧昧的开始交往。
回到正题:既然不能发TCP报文的原因是它要先建立连接,那么,怎样才能不建立连接?
tracert直接开始第三次握手。也就是说,源向目的发送“恩,好!(ack报文)”这个消息。
目的端收到这个消息后心想,哪个白痴连握手都不会。然后它就告诉源咱俩得重新开始握手(rst报文)。

好了,问题解决:源持续向目的发送ttl递增的ack报文,收到超时回应后认为是路径上的路由节点,收到rst报文后认为到达目的端。

备注:
1. UDP及ICMP方式实现的tracert是经过先贤们验证的可行方案,TCP方式是我自己琢磨出来的(应该还有其他人琢磨出来,但是我没看过),还未实现,不确定能否成功,需要实现验证一下。
2. 具体的实现代码(c语言)等我完成后会贴出来。

网络探测工具(二)——traceroute相关推荐

  1. Linux centos7 NMAP网络探测工具安装过程以及使用示例!

    NMAP网络探测工具 1.nmap安装 RZ上传! 解压: tar jxvf nmap-7.60.tar.bz2 配置: ./configure 出现了一个小火龙! 编译: make 再安装gcc-c ...

  2. 10.21 nmap:网络探测工具和安全/端口扫描器

    nmap命令 是一款开放源代码的网络探测和安全审核工具,是Network Mapper的缩写.其设计目标是快速地扫描大型网络.nmap可以发现网络上有哪些主机,主机提供了什么服务(应用程序名称和版本号 ...

  3. nmap:网络探测工具和安全/端口扫描器

    一.语法 onlylove@ubuntu:~$ nmap -help Nmap 7.80 ( https://nmap.org ) Usage: nmap [Scan Type(s)] [Option ...

  4. nmap — 网络探测工具和安全/端口扫描器

    简介: Nmap("网络映射器")是一个免费的开源(许可) 用于网络发现和安全审计的实用程序.许多系统和网络管理员还发现它对于网络库存.管理服务升级计划以及监控主机或服务正常运行时 ...

  5. 网络探测和诊断工具 - mtr

    概述 最近研究 traceroute 和 mtr 主要是网络监控的需要,需要通过这些工具探测出整个公司的网络拓扑和端到端之间的网络状况. 一般情况,我们使用ping,traceroute,nslook ...

  6. 这款网络排查工具,堪称神器!

    作者:苏欣 链接:https://cloud.tencent.com/developer/article/1491610 常用的 ping,tracert,nslookup 一般用来判断主机的网络连通 ...

  7. 网口监视报文工具_真是神器!这款网络排查工具!

    常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Linux 下有一个更好用的网络联通性判断工具,它可以结合ping nslookup tracert 来判断网络 ...

  8. GitHub上这款网络排查工具,堪称神器!

    点击上方"Github爱好者社区",选择星标 回复"资料",获取小编整理的一份资料 作者:苏欣 链接:https://cloud.tencent.com/dev ...

  9. 探测工具nmap简介及使用说明

    1. 前言: 在前一遍Jmeter模拟多IP访问中,提到当前网络中可用ip,如何查找查看当前可用ip,nmap就是一个不错的开源免费的探测主机是否在网的工具. 另外当我们在构建环境或排查问题时,常常是 ...

最新文章

  1. 软考培训 - 2014年3月1日信息系统项目管理师开班
  2. sql语句中嵌套2层循环
  3. Java面试题:如何将字符串反转?(翻转字符串)
  4. 大数据WEB阶段 Maven与SSM框架整合
  5. WebRTC安全体系架构的8个组件
  6. P1196 ssl1225-银河英雄传说【图论,并查集】
  7. 音频信号发生器_1957年,DIY的Hi-Fi 电唱机单电子管音频发生器的音质保真度高...
  8. 突发!哈佛要求本科生5天内搬走,国际学生恐无家可归
  9. java在原数组中追加一个元素
  10. 算法系列之选择排序算法
  11. mysql 的命令行操作
  12. country-converter官方文档----机翻人工确认
  13. ppt如何替换其他mo ban_如何制作PPT教程:PPT排版格式技巧汇总
  14. 自己动手写一个分库分表中间件(一)
  15. php文字转语音amr,Android插件,TTS语音合成(文字转化语音)。
  16. pyecharts 模块的简单使用
  17. Hive-获取本月的第一天,本月的最后一天,本月的天数
  18. 习题 5.9 编程序找出1000之内的所有完数。
  19. nacos 一直访问本地地址
  20. 电脑和树莓派之间传输文件

热门文章

  1. WindML、FreeType和TrueType三者相结合实现矢量字体的显示
  2. 你只管善良,剩下交给时间
  3. Response的用法
  4. 180721 逆向-极客巅峰(Re)
  5. SPSS纵向数据格式转换为横向数据格式时变量不是自己想要
  6. android是硬件还是软件,浅谈Android软硬件巧妙整合的开发技巧
  7. App/QoE-Based Congestion control
  8. 堆排序小根堆 大根堆 迭代 递归 总结 完整代码
  9. 循环函数:while循环和for循环及函数定义
  10. 软件测试工作流程概括及总结(建议收藏)