原创 ICMP协议(Ping)在STC51实验板上的实现

2009-9-2 09:02 4967 8 11 分类: MCU/ 嵌入式

    今天跟大家讲一下ICMP协议及Ping程序在我的STC51实验板上的实现情况。开始还是介绍协议的基本知识,以下内容摘自TCP/IP详解第一卷第六章:


         ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCPUDP)使用。一些ICMP报文把差错报文返回给用户进程。


         ICMP报文是在IP数据报内部被传输的,如下图所示。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />6e7c4847-48b2-4370-bd66-fbce4679a3bb.JPG


点击开大图


 


         ICMP报文的格式如上图所示。所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。下面我们将逐个介绍各种报文格式。类型字段可以有15个不同的值,以描述特定类型的ICMP报文。


点击看大图


 


    从上面的表格可以看到Ping程序就是利用ICMP中请求回显和回显应答的两种ICMP报文。“Ping”这个名字源于声纳定位操作。Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答


(上图列出了所有的ICMP报文类型)。


    一般来说,如果不能Ping到某台主机,那么就不能Telnet或者FTP到那台主机。反过来,如果不能Telnet到某台主机,那么通常可以用Ping程序来确定问题出在哪里。Ping程序还能测出到这台主机的往返时间,以表明该主机离我们有“多远”。


    我的目标是,用PC Ping通我的板子。为此我首先编写了一段单片机程序,让我的板子接收所有的数据包,并通过串口打印出来,这样得到数据就便于分析了。当然,因为没有对数据进行任何处理所以也就没有任何响应了,它就好比是网络上的一个监听者。下面是板子上电后收到的一系列数据包,由于我在其间执行了PC上得Ping程序,所以显示的数据包中就包括PC发来的Ping报文。(这里使用了大虾电子网的SSCOM串口调试工具)


点击开大图


   


通过人工筛选(就是一个一个字节的与TCP/IP协议对照啦),找到了Ping报文(ICMP请求回显),下面我们来具体解读一下每个字段的含义,也算是对TCP/IP协议的一个复习。


 


87ece8ac-6b2c-4d0f-8b27-631f98c2dc62.JPG


    红线标注的前六个字节为该数据包的目的MAC地址,接下来的蓝线标注的为源MAC地址。8  0(绿线)表明这是一个IP包,后面的十几个Byte在这里可以不管。


    第二行褐色线标注的是源IP地址,橙色为目的IP地址。这些属于IP包头部分。下面的部分就属于ICMP报文了。


    第三行绿线标注的8  0ICMP包的类型、代码(回显请求),紫色的为ICMP校验和(2字节),后面的为ICMP报文内容。最后4个字节为整个数据包的CRC校验码(由网络控制器自动生成)。


    知道了这个报文的含义后,组织回显应答报文就不是什么难事了。


    首先,变换源、目的MAC地址和IP地址;


    然后,将ICMP的类型字段由8改为0


    最后,校验和字段要加上8(因为类型字段减了8),这样才是正确的校验和。


    其他内容不变,原封不动Copy即可。


    经过上面三步,我们就得到了ICMP回显应答报文了,只要通过网络控制器发出去就OK了。下面就是用PC Ping我的板子的结果。


 


点击开大图


 

    我这个STC51+DM9000A板子,响应时间=1ms。这点还是比较振奋的,因为记得看过一般51+RTL8019做的板子ping的延时是十几ms。抛开架构不谈,这些年51 MCU的速度还是提高了不少。现在还没有做什么优化,如果用上STC单片机的双DPTR,在copy数据报时应该还能提高不少速度,相信性能还有提升的空间。


 

文章评论3条评论)

登录后参与讨论

用户1588142 2011-9-9 00:53

好!!!

用户176832 2011-4-12 17:32

不知道要没有板子卖?

用户412065 2009-10-29 10:50

不错 我也想做一个 可以放点详细的资料吗?

用户161326 2008-8-13 15:06

din g
相关推荐阅读
用户412121 2015-09-11 09:59
我今年的作品:智能家居物联网实验板(STM32+ESP8266)
去年就开始关注物联网和智能家居了。一开始看到不少用路由器方案做的智能插座,感觉太浪费芯片资源了。直到有一天无意中看到了ESP8266,感觉这是一个适合单片机的wifi解决方案,应该可以做不少好玩的...
用户412121 2013-10-29 11:41
STM32迷你核心板运行ST emWin + FreeRTOS成功
新板子做好后受到了很多人的关注, 比如板上有哪些资源,有哪些例程等等。有的人还会问是否能外接LCD等等,对于我这些,我的板子都预留了接口肯定是没有问题的。但是口说无凭还是实实在在 的测一次才能令人信服...
用户412121 2013-10-15 14:11
新版STM32迷你核心板做好了
之前也跟大家多多少少介绍过了,这次做的新版就是对前一版不满意地方的小修补(比如印字,焊盘尺寸等等),另外对外扩IO做了微调,可以保证F407的每 种外设都可以扩展(之前是按照F103设计的兼容407但...
用户412121 2013-09-22 22:58
在STM32上运行FreeRTOS操作系统(基于STM32 V3.5.0固件库)
很久以前就想实用FreeRTOS了,优点就不必说了,网上可以搜到一大堆它和ucos-ii以及其他几种嵌入式操作系统的比较。最重要的一点它是免费的,不想ucos那样商业使用需要收费。只是之前本人比较忙而...
用户412121 2013-08-13 11:00
华美A5无线3G路由器升级内存,flash,刷openwrt成功
Hame A5(华美A5)号称最小的3G无线路由器,可惜只有16M SDRAM, 4M FLASH虽然理论上可以刷openwrt,但是限于硬件资源太少运行起来很卡,到最后几乎死机。 于是我尝试给...
用户412121 2013-05-08 17:29
我的STM32核心板升级到F4了(目前可以运行u-boot)
年初做的这个可以跑uCLinux的STM32核心板用的是STM32F103ZET6(http://bbs.ednchina.com/BLOG_ARTICLE_3010701.HTM),当时已经考虑...
我要评论
3
8
关闭 站长推荐上一条 /2 下一条