|
相信很多人对TCP/IP协议感兴趣,但对其用资源非常有限的51兼容系列单片机实现感到不可理解。下面就谈谈作者在以太网上用Winbond
的51兼容高速单片机W77E58实现TCP/IP协议的思路。
TCP/IP协议首先要解决硬件问题,即协议的物理层。这些通常只要选用适当的网卡芯片即可实现,我们不必在此花太多时间。现在嵌入式系统应用最广泛的就是NE2000兼容系列网卡,它具有接口方便,驱动简单,占用资源少等优点,特别适合嵌入式系统。我们选用性能较好,供货比较稳定的RTL8019AS
作为我们实现TCP/IP协议的物理层。
TCP/IP协议采用分层结构,因此,我们实现TCP/IP协议也采用分层实现的方法。首先是物理层,具体到程序实现就是网卡驱动程序,解决以太网络数据包的收发。这是最基本也是最重要的,其实现的好坏直接影响协议的性能。大多数人认为我们现在就可以实现IP协议了,其实不然,由于以太网数据包的收发必须依赖物理地址,而IP协议采用IP地址,这就关系到两种地址相互转换的问题,即需要我们实现地址解析协议
ARP,ARP实现并不复杂,只要向局域网广播ARP请求,接收ARP应答,并响应ARP请求即可。但ARP设计者为提高ARP协议的效率,减少网络中广播包的数量,对协议做了些优化。要求协议建立ARP
表对地址进行缓存及ARP表的动态更新,即地址老化。很多简单TCP/IP 协议没有实现这一功能,但作者完全实现协议要求。有了这些协议的实现我们可以完成IP协议了。IP协议对其适当简化后实现也比较简单,关键是实现一个效率高且通用的IP校验程序。实现了IP通讯协议和通用校验程序,就不难写ICMP、UDP等程序了。ICMP
协议有很多种数据包格式,我们实现其最常用的回应请求与应答报文。具体讲就是实现ping命令来测试信宿机的可到达性。测试数据包的往返时间是ping的难点,很多简单协议去掉了这部分内容。作者在此介绍一个小技巧来测试报文来回时间,我们知道,ping报文并没有规定数据的内容,而对方收到ping报文后要原样返回,这就给我们测试提供了依据。即在数据包中加入当前时间,返回后与现在时间相减即得报文往返时间,给出本机与信宿机连接速度的评估。UDP
是一个非面向连接的不可靠的数据传输协议,和TCP 相比其效率高,系统开销小,因此也得到广泛的应用。UDP和TCP校验是比较特殊的地方,其并不遵循严格的分层模型,要加上一个取自IP层的伪头标一起校验,这点应特别注意。完成UDP
协议后,我们就可以做一些基于UDP协议的应用层协议了,比如简单文本传输协议 TFTP。和文件传输协议FTP相比,TFTP是基于不可靠的数据传输协议UDP的,因此协议要靠超时重传来保证数据的正确接收。数据包的长度限制为512
字节,没有路径的概念,只用于简单文件传送。说起文件传输,就得考虑文件的存放。系统硬件采用大容量的EEPROM AT24C512
来存放文件,因此就需要一个简单的EEPROM文件系统来管理文件。本程序通过TFTP协议实现了PC和开发板的双向文件传输,网页文件正是通过这种机制动态更新的。
如果说以上这些协议都很容易实现的话,那么,TCP/IP协议中最复杂,最难实现就是面向连接的可靠数据传输协议TCP
协议了。这是单片机实现TCP/IP协议的难点。由于很多应用层协议都采用TCP作为传输层协议,因此,TCP是协议栈的灵魂,其好坏直接影响到整个协议栈的成败。但在单片机这样的系统中,资源十分有限,不可能也没有必要实现协议的所有内容。对协议的适当简化不但可以节约硬件成本,而且能提高数据吞吐率。完成TCP
协议后,就可以进入激动人心的WEB服务器了。说明白些就是接收HTTP请求并完成HTTP响应。
以上简单介绍了作者用单片机实现TCP/IP协议的过程,具体还有很多细节没能一一介绍,希望进一步探讨。作者程序还有超级终端命令解释程序,串口通讯程序,高速IIC读写程序等其他辅助程序。整个程序包括20个源程序文件,其中4个头文件,3个51汇编文件,其他均为C51程序文件,可以用Keil
C51编译。程序结构清晰,注释详尽。欢迎一切形式的合作开发!谢谢!
|