Chinaunix首页 | 论坛 | 博客
  • 博客访问: 393056
  • 博文数量: 69
  • 博客积分: 1992
  • 博客等级: 上尉
  • 技术积分: 1162
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 19:50
文章分类
文章存档

2015年(1)

2011年(55)

2010年(13)

分类: LINUX

2011-04-10 21:03:13

在我们的TCP/IP协议栈中,根据实际情况的需求,我们在四层体系结构中仅实现了我们需要的协议,分别如下:网际接口层我们实现了DM9000驱动和MAC层协议;网际层实现了IP/ARP协议;运输层实现了UDP协议;应用层实现了tftp协议。

       DM9000驱动分为三个部分:DM9000初始化,DM9000发送函数,DM9000接收函数,各自的流程图分别如图1所示:

 1 DM9000初始化/发送/接收数据流程图

我们将MAC层协议、IP/ARP层协议、UDP层协议放在一个文件net _core.c中实现,而将DM9000驱动单独放在dm9000.c中实现,主要是为了实现协议与硬件的分离,使得底层不是DM9000网卡时,我们只需将dm9000.c换成相应的网卡驱动即可,而上层协议的实现并不需要改变,从而使代码具有良好的可移植性。

刚开始时,目标板向宿主机请求所需要的文件,它首先会向目标板发送一个ARP请求包,获得宿主机的MAC地址,宿主机在收到ARP请求包时,会将自己的MAC地址发给目标板,同时也向目标板发送一个ARP请求包,目标板对宿主机的ARP请求包会回应一个ARP应答包,里面包含了目标板的MAC地址,这样双方就可以获得对方的MAC地址,之后双方之间就可以根据MAC地址建立通信链路,实现互传数据。整个协议工作的框架图如图2所示:

 TCP/IP协议栈工作流程

首先,目标板会通过tftp_down_load()函数向宿主机发一个读文件请求,这个tftp数据包在UDP层将会加上UDP数据头由udp_send()函数发向IP层,在IP层会加上IP数据头发向MAC层,在MAC层则会加上MAC头,最终由网卡驱动层dm9000_send_packet()发送数据;其次,当网卡驱动层dm9000_receive_packet()收到 数据包时,会交给MAC层处理,MAC层将去掉MAC头,并判断是IP数据包还是ARP数据包,若为ARP数据包则交给ARParp_handle()处理,arp_handle()会判断是ARP请求包还是ARP应答包,若为ARP请求包,则将自己的MAC地址包装在ARP数据包中,然后交给MACeth_send()发送出去,若为ARP应答包则将宿主机的MAC地址保存起来。如果不是ARP包,而是IP包,则由IPip_handle()处理,ip_handle()会判断是不是UDP数据包,若是,则将其去掉IP头,交给UDP层的udp _handle()处理,udp _handle()会判断是不是tftp数据包,若是,则去掉UDP头,交给TFTPtftp_handle()处理,而在tftp_handle()函数中会进行数据的接收存
储。


我们将MAC层协议、IP/ARP层协议、UDP层协议放在一个文件net _core.c中实现,而将DM9000驱动单独放在dm9000.c中实现,主要是为了实现协议与硬件的分离,使得底层不是DM9000网卡时,我们只需将dm9000.c换成相应的网卡驱动即可,而上层协议的实现并不需要改变,从而使代码具有良好的可移植性。






附件:


 mini-boot_v2.0.rar   

阅读(3902) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

kangear2013-08-10 20:14:37

值得学习!!!!