新闻  |   论坛  |   博客  |   在线研讨会
ICMP协议(Ping)在STC51实验板上的实现
mayer | 2009-09-06 11:32:39    阅读:2919   发布文章

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

 

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

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

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

点击开大图

 

         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协议的一个复习。

 

    红线标注的前六个字节为该数据包的目的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数据报时应该还能提高不少速度,相信性能还有提升的空间。

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客