1. 相关ICMP协议概述
    这里只讲解与tracert有关的ICMP消息类型,网关发送超时报文(type = 11),主机发送目标不可达报文(type = 3),基本格式如下:
    超时报文

其中code = 0,表示由网关发送
    目标主机不可达报文

其中code = 3,表示在目的主机,端口不可用

2. Tracert流程
     首先明确TTL是IP报头中的字段,TTL表示了数据包的time to live,即还能经由多少跳,所以TTL = 1表示数据包将在下个路由或主机被丢弃,并发送超时报文;
     其次为了明确已到达主机,发送时目的端口设为非法端口(如58127),这样主机收到报文后会发送目标不可达报文。
下面是tracert的流程:
     1> 构造UDP数据包,设置TTL = 1
     2> 发送UDP数据包,记录发送时间t1
     3> 接收ICMP差错包,如果是超时报文,则是经过的中间路由,记录路由信息,记录接收时间t2,计算时间(t2 - t1);如果是目标不可达报文,则抵达目的主机,记录势头收时间t2,打印信息,退出
     4> 构造UDP数据包,设置TTL += 1,返回第二步
其中,TTL的每个数值(如TTL = 1)发送3次UDP包,即重复2~3步3次;
   接收超时,打印"*"表示报文丢失

3. 模拟tracert实现tracerty
     • 发送使用UDP报文,每次发送只需设置IP报头的TTL字段

// create send socket if((sndsock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("Create Send UDP Socket Fail!/n"); return 0; } if(bind(sndsock, (struct sockaddr *)&laddr, sizeof(laddr)) == -1) { perror("Bind UDP Socket Fail!/n"); return 0; }

• 接收使用SOCK_RAW

// create receive socket if((rcvsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) { printf("Create Receive RAW Socket Fail!/n"); return 0; }

• 对收到数据包处理
      首先从IP报头得到IP报头长度

int hlen = ip->ip_hl << 2;       // total ip header length

然后定位到ICMP报头,检查各字段合法性,对超时报文处理

// icmp time out packet if(icmp->icmp_type == 11 && icmp->icmp_code == 0) { struct ip *iip = (struct ip *)&icmp->icmp_ip; int ihlen = iip->ip_hl << 2; struct udphdr *udp = (struct udphdr *)((u_char *)iip + ihlen); if(iip->ip_p == IPPROTO_UDP && udp->source == htons(SRCPORT) && udp->dest == htons(DSTPORT)) return 1; }

对目标不可达报文处理

// icmp not reachable packet if(icmp->icmp_type == 3 && icmp->icmp_code == 3) { struct ip *iip = (struct ip *)&icmp->icmp_ip; int ihlen = iip->ip_hl << 2; struct udphdr *udp = (struct udphdr *)((u_char *)iip + ihlen); if(iip->ip_p == IPPROTO_UDP && udp->source == htons(SRCPORT) && udp->dest == htons(DSTPORT)) return 1; }

4. 程序源代码

http://download.csdn.net/source/2194656

5. 最终效果

ICMP协议之tracert实现相关推荐

  1. ping程序和tracert(traceroute)背后的故事--ICMP协议

    为路由器生,为交换机死,为了Ping通奋斗一辈子-----tracert.cn 上面是一个网络工程师的个人定位,很有意思,哈哈!那么我们来看看ping和tracert都是什么吧 PING (Packe ...

  2. ICMP协议的ping和tracert应用

    一.实验目的 1.掌握基于ICMP协议的ping和tracert的基本使用方法. 二.实验内容 1.完成ping命令的使用方法和结果演示. 2.完成tracert命令的使用方法和结果演示. 三.实验过 ...

  3. PING的原理以及ICMP协议

    主要内容: 1.ping的原理以及工作过程 2.ICMP协议 3.ICMP的应用:ping,traceroute 1.ping的原理以及工作过程  ping的原理  ping 程序是用来探测主机到主机 ...

  4. TCP/IP详解--学习笔记(4)-ICMP协议,ping和Traceroute

    1.IMCP协议介绍 前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成.其中一个重要的模块就是ICMP(网络控制报文)协议. 当传送 ...

  5. ping 原理与ICMP协议---转

    http://blog.csdn.net/inject2006/article/details/2139149 ping 的原理 ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某 ...

  6. 【CyberSecurityLearning 16】单臂路由与DHCP中继+ ICMP协议+VTP

    目录 一.单臂路由 单臂路由引入: 单臂路由实验演示: 单臂路由缺点: 二.ICMP协议 单臂路由练习实验:(★) 单臂路由缺点: 三.VTP(VLAN Trunking Protocol) VTP概 ...

  7. [计算机网络]探索ICMP协议

    探索计算机网络ICMP协议 本文通过wireshark抓包ICMP报文进行ICMP协议的探索,将探索一下几个方面: Ping程序产生的ICMP消息. 由Traceroute程序产生的ICMP消息. I ...

  8. tcptracerte参数_TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute【转】

    1.IMCP协议介绍 前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成.其中一个重要的模块就是ICMP(网络控制报文)协议. 当传送 ...

  9. 《TCP/IP详解》学习笔记(四):ICMP 协议、ping 和 Traceroute

    ICMP 协议介绍 前面讲到了,IP 协议并不是一个可靠的协议,它不保证数据被成功送达,那么自然的,保证数据送达的工作应该由其他的模块来完 成.其中一个重要的模块就是 ICMP(网络控制报文)协议. ...

最新文章

  1. LeetCode(1.俩数之和)JAVA
  2. linux bash中too many arguments问题的解决方法
  3. 线程池,这一篇或许就够了
  4. 1.4激活函数-带隐层的神经网络tf实战
  5. 节省大量教科书的三种潜在风险方法
  6. 2021上饶市高考中考成绩查询,2021年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口...
  7. tensor转换为图片_pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
  8. Hexo+Github博客搭建教程
  9. 一文读懂AlphaGo Zero算法
  10. 工作中使用到的单词(软件开发)_2022-06-01备份
  11. matlab 仿真光学实验报告,基于matlab的光学实验仿真毕业论文.doc
  12. 拼接图像亮度均匀调整_浅析液晶拼接屏为什么适合应用于安防显示
  13. Android4.1
  14. 统计学中三大相关系数
  15. 十年Java经验让我总结出了这些,什么是真正的架构设计?
  16. 【年度盘点】10大最热门Python项目回顾
  17. 十三、Linux目录结构
  18. 闪存类型测试软件,轻松测闪存类型 测试软件P10Check上架谷歌商店
  19. 冯端:漫谈物理学的过去、现在与未来
  20. c莫比乌斯函数_数论——容斥原理、莫比乌斯函数

热门文章

  1. 嵌入式 课程设计指导书
  2. 实现摄氏度与华氏度之间的转换
  3. 配置secureCRT
  4. 【shaderforge小实例】 轮廓内发光
  5. 业界最全,阿里云混合云灾备服务上线!
  6. CSO关注:企业安全遭受攻击的15个迹象
  7. 几大实时同步工具比较
  8. 刷脸支付是顺应时代和科技发展趋势的创新
  9. 接口测试管理平台手册
  10. easyUI,radio控制select