基于ARM9的UDP协议栈的设计与实现
次发送数据的时候,要知道接收端的IP 地址和端口号,还要得到对方的物理MAC 地址,因为两个终端最后通信是通过寻找对方的MAC 地址来进行的,因此首先得通过ARP 协议,把对方的IP 地址转换为MAC 地址,得到了物理地址之后才能通信.如果长时间不能得到这个物理地址,则只能说明请求失败,需要重新发送ARP 请求,ARP 的封装过程如图3(b)所示.
2. 2. 3 数据包的封装过程
UDP 协议数据包的封装在运输层进行,打好包的UDP 数据将送往网络层进行IP 协议的打包,UDP 要完成进程到进程的通信,把报文交付给正确的进程.当进程有报文要通过UDP 发送时,它就把这个报文连同一对套接字地址以及数据长度传递给UDP.UDP 收到数据后就加上UDP 首部,也就是UDP 数据包的封装如图3(c)所示.然后UDP 就把该用户数据包连同IP 加上自己首部,在协议字段使用值17,指出该数据是从UDP 协议来的,这个过程就是IP 数据包的封装过程如图3(a)所示.这个IP 数据包再传递给数据链路层.数据链路层收到IP 数据包之后,加上自己的首部(可能还有尾部),再传递给物理层.物理层把这些位编码为电信号或者光信号,然后把它发送到远程的机器.
2. 2. 4 数据的接收
系统接收数据采用的是中断模式.当网卡接收到数据时,就触发一个中断,启动中断服务程序.在中断服务程序中首先清除中断标志位,以防在接收数据的时候再次引发中断,然后判断寄存器MRMDX 的值,确定网卡是否接收到了数据,如果接收到了数据就要进行数据处理,也就是对数据包的解封,得到应用程序发送来的数据,如果没有得到数据则说明网卡初始化失败,重新初始化网卡.中断接收程序的流程图如图4所示.
在接收到以太网数据帧中,首先判断数据类型字段,如果是ARP 协议,则进入ARP 处理流程,如果是IP 协议,则进入IP 协议流程.ARP 协议处理过程:
首先判断ARP 包目的IP 地址是否与本地IP 地址一致,如果不一致,丢弃不处理;如果一致,再判断ARP类型,操作类型字段为1 时表示ARP 请求,调用ARP发送函数发送ARP 响应包.操作类型字段为2 时,记录下对方的MAC 地址,以后通信就是根据这个MAC传送数据的.
IP 协议处理过程如下所述:首先判断IP 包目的IP地址是否与本地IP 一致,如果不一致,丢弃不处理,如果一致,则再判断协议类型,是否为UDP 数据包,是就进入UDP 处理过程,不是就进入其他协议处理过程.
3 实验结果和分析
3. 1 ARP 通信测试
实验中测试了ARP 请求和UDP 通信,设置ARM开发板的IP 地址为219. 243. 50. 187,MAC 地址为0×52,0×54,0x4c,0×38,0xf7,0×42,PC 机的IP 地址为219. 243. 50. 188,MAC 地址为0×00,0×23,0x5A,0×15,0×73,0xF4.经过测试当开板向PC 发送ARP 请求时,PC 能够正确应答响应包,并且多次请求都能够得到正确的响应,证明ARP 协议能够稳定运行,实验结果如图5 所示.
当开发板得到了PC 机的MAC 地址之后,就可以与它进行正常的UDP 通信了.在中断程序之中判定协议类型,接收到的数据包是ARP 协议还是UDP 协议,当接收的是ARP 协议,则进行ARP 协议处理,得出图5 的实验结果,当得到的是UDP 协议,则进行UDP 协议处理,得出的实验结果如图6 所示.经过长时间的通信可以发现,传输的数据没有出现误码,可以说明这种通信方式比较稳定可行.
3. 2 UDP 通信测试
在UDP 通信实验中,设置两个数据终端的IP 地址和通信端口分别为219.243.50.187:6000,219.243.50.186:10005,然后发送数据,用抓包工具sniffer 抓包的结果如图6 所示.通过图中结果可以看出,SrcIP 为219. 243. 50. 87,Src Port 为6000,DestIP 为219. 243.50. 186,Dst Port 为10005,这都与设置的相同.Protocol为0×800 表示为UDP 协议类型,而且能够正确地接收到发送的数据,并且经过多次的实验,结果都是正确的,这证明系统通信稳定可靠,通过移植的协议栈能够正常的工作,达到了预期的目标.
4 结束语
文中实现了基于ARM9 和DM9000 芯片的UDP通信,成功地对TCP/ IP 协议栈裁剪移植实现UDP.ARP 等协议通信.详细介绍了DM9000 网卡驱动程序过程,并且实现了网口接收发送数据的功能,通过对大量数据的传输实验,证明了ARM9 和DM9000 构成的通信系统性能的稳定性.能够较好地解决大量数据通过UDP 协议通信的问题.
ARM9UDP协议 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)