全部博文(69)
分类: 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所示:
图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数据包则交给ARP层arp_handle()处理,arp_handle()会判断是ARP请求包还是ARP应答包,若为ARP请求包,则将自己的MAC地址包装在ARP数据包中,然后交给MAC层eth_send()发送出去,若为ARP应答包则将宿主机的MAC地址保存起来。如果不是ARP包,而是IP包,则由IP层ip_handle()处理,ip_handle()会判断是不是UDP数据包,若是,则将其去掉IP头,交给UDP层的udp _handle()处理,udp _handle()会判断是不是tftp数据包,若是,则去掉UDP头,交给TFTP层tftp_handle()处理,而在tftp_handle()函数中会进行数据的接收存
我们将MAC层协议、IP/ARP层协议、UDP层协议放在一个文件net _core.c中实现,而将DM9000驱动单独放在dm9000.c中实现,主要是为了实现协议与硬件的分离,使得底层不是DM9000网卡时,我们只需将dm9000.c换成相应的网卡驱动即可,而上层协议的实现并不需要改变,从而使代码具有良好的可移植性。
附件: