随着因特网的迅速发展,Web应用越来越广泛。由于Web技术的开放性和独立平台特性,大大降低了软件系统和通信系统的设计、维护工作量,节省了人员培训费用,提高了现场测试和控制设备的管理水平。而嵌入式Web服务器将Web服务器引入到现场测试和控制设备中,在相应的硬件平台和软件系统的支持下,使传统的测试和控制设备转变为具备了以TCP/IP为底层通信协议,Web技术为核心的基于互联网的网络测试和控制设备,有着一般Web服务器所不具有优势。本文就嵌入式Web服务器在通信协议的选择方面做了具体的研究。
1 嵌入式Web服务器的结构分析
嵌入式Web服务器运行的目标系统大多是各类专用设备,内存资源和存储器资源非常有限,它通常作为一种监控、管理手段去控制和配置各种电子设备,实现设备的智能化和信息化。嵌入式Web服务器的应用系统框架如下图所示:
图1 嵌入式Web服务器的应用系统框架
图1虚线框中的是嵌入式Web服务器的框架结构,用户接口库是嵌入式Web服务器和其他设备的控制接口。内嵌于设备的Web服务器可以向任何接入它所在网络的合法用户提供统一的基于浏览器方式的操作和控制界面,浏览器成了设备的前端控制板。而HTTP引擎是Web服务器的核心,Web服务器同Web浏览器之间的通信是通过HTTP协议进行的,这一通用的、无状态的、面向对象的协议是Web浏览器和Web服务器之间的应用层协议,是建构在TCP/IP协议基础之上的。因此在嵌入式Web服务器中,TCP/IP协议栈的实现是整个系统的基石。
2 入式Web服务器的TCP/IP协议栈设计
嵌入式系统最先利用轻型工业网络进行互连,比如CAN,PROFIBUS,MODBUS等组织的工业网络能够进行各工业设备间的互访和信息交流,但是这些工业网络协议之间标准不统一,通信半径也比较短,推广的前景不乐观。TCP/IP协议作为一种成熟的网际互联手段和事实标准,毫无疑问成为了嵌入式系统连入互联网的首选协议。但是在嵌入式系统中,硬件资源较少,通常缺乏足够的处理器和存储器资源以支持整个TCP/IP协议族,因此嵌入式的TCP/IP技术与常规的TCP/IP实现有很大的不同。
2.1 嵌入式TCP/IP协议栈概述
嵌入式系统中实现的协议要根据系统自身的特点及功能来设计自己的协议族,因此,在嵌入式Web服务器中并非TCP/IP协议族中所有的协议都要实现,必须针对不同的网络应用对协议栈进行删减,保留其基本功能,以满足网络应用的需要。
考虑到嵌入式Web服务器的硬件处理速度慢并且存储容量相对较小的条件限制,在TCP/IP协议栈中主要能够实现ARP,IP,ICMP,TCP协议即可。具体分析如下:以太网数据的传输是采用MAC地址来识别的,而ARP协议提供IP地址和数据链路层使用的MAC地址之间的转换功能,为了保证系统在以太网的通信,首先要实现ARP协议;由于嵌入式Web服务器要能在Internet上通信,在网络层一定要实现IP协议,还要实现能报告数据传送差错等情况的ICMP协议;同时,Web服务器同Web浏览器之间的通信是通过HTTP协议进行的,在传输层采用TCP协议,能保证可靠的数据传输,进而实现其基础之上的HTTP协议。
嵌入式TCP/IP协议栈结构如图2所示。
图2 嵌入式TCP/IP协议栈
2.2 嵌入式TCP/IP协议栈数据处理流程
嵌入式TCP/IP协议栈处理数据流程如图3所示。
系统初始化后,进入主程序循环部分。主程序循环包括两大部分:对接收到的以太网数据帧进行解包和对欲发送的数据进行封装并发送。对接收到的以太网数据帧进行解包,供应用程序使用;对欲发送的数据进行打包,将数据以以太网数据帧的格式发送出去,使采用TCP/IP协议的以太网内所有计算机能收到此数据帧。
详细过程为:先检查是否收到以太网数据帧,若己收到以太网数据帧,则检测以太网数据帧首部,判断所载数据类型,然后对接收到的数据进行相应处理:若接收到的以太网数据帧中包含ARP数据,则调用ARP处理程序;若接收到的以太网数据帧中包含IP数据报,则针对其是否为ICMP、TCP协议格式分别进行相应的解包处理。若不包含IP数据报,则丢弃此数据帧。
若未收到以太网数据帧,此时若有数据要发送,则对数据进行打包,将数据以以太网数据帧的格式发送出去。若无数据要发送,则回到主程序循环。
图3 嵌入式TCP/IP协议栈主流程图
3 嵌入式Web服务器中TCP/IP栈的实现
3.1 ARP协议实现
嵌入式Web服务器中ARP协议主要功能是进行IP地址与以太网地址之间的转换,当系统收到发送数据请求时,协议栈就需要返回IP数据报,所有的IP数据报都要进一步封装成以太网帧才能发送给网络控制器,而所加的以太网首部中就包含了由ARP协议解析目的IP地址所得来的对应的物理地址。
首先ARP程序检测以太网帧的类型字段以判断其协议类型。以太网标准规定,当一个以太网帧携带一个ARP消息时,类型字段必须包含十六进制值0806。接着,检测消息中的操作字段以确认是一个请求消息还是一个应答消息。若是一个请求消息,ARP程序比较目标IP地址与自己的IP地址,如果一样,则要回发一个应答消息。对接收到的来自远程主机的任何试图解析Web服务器地址的ARP请求,Web服务器都会做出回应。
当Web服务器向客户机发送一个ARP消息时,此消息是嵌入一个以太网帧中广播给网上的所有计算机,每台计算机收到这个请求后都会检测其中的IP地址。与该IP地址匹配的计算机发送一个应答,这个应答消息被放进一个帧中直接发回给Web服务器,而其他的计算机则会丢弃收到的请求,不发任何应答。这种方式虽然对网络造成一定的压力,但节省嵌入式设备的宝贵资源。在等待应答的时间里,ARP将到达的TCP包丢弃,一旦收到应答,ARP高速缓存就用目的以太网地址更新,然后等待分组就用高速缓存中的目的以太网地址更新,分组就被发送了。
3.2 IP协议实现
IP协议主要功能是用于主机之间发送数据报的传输,实现比较复杂,但对于Web服务器来说,只需完成IP协议两项最基本的功能:第一,处理接收到的IP数据报,向上层网络提交。第二,负责对TCP报文、ICMP报文进行封装,交给数据链路层进行装帧。
当Web服务器收到发给自己的数据帧后,需要对以太网首部中的帧类型字段进行判断,如果该字段为0x0800,说明后面的数据是IP数据报,将此数据提交IP层处理。IP协议判断此数据报的IP头部中目的IP地址字段与本地IP地址是否一致,若不一致,则丢弃该数据报;若一致,进行IP头部校验和检查,当证明数据在传输中没有出现错误时,去掉IP头部,将IP数据提交上层处理,即根据IP首部中的协议字段决定交给ICMP协议还是TCP协议处理。在程序运行时,当所接收的数据被判定为IP数据报后,IP处理程序将严格按照以上的过程接收处理数据并进行处理。
IP协议还要查询是否有上层数据要发送,如果有数据发送,则将上层数据进行IP封装,交给数据链路层装帧发送。
3.3 ICMP协议实现
ICMP提供了一种让互联网中的路由报告错误或提供有关意外情况信息的报文机制。它不是独立的,是IP的一部分,在每个IP实现中必须有它。虽然它提供的信息十分丰富,但在嵌入式Web服务器应用中,只要实现回送请求(echo request)和回送应答(echo reply)就足够了。
3.4 TCP协议实现
TCP是嵌入式Web服务器的核心。在设计嵌入式Web服务器时,系统应用层只需支持HTTP协议。嵌入式系统把要传送的数据,参数等存入网页的相关位置。对于任何TCP连接,每次只需支持HTTP协议发送网页服务。在单片机这样的系统中,资源十分有限,因此要精简TCP协议,简化的原则有两个:第一,不能改变其面向连接的特性;第二,简化必须能配合其所采用的应用层协议。
作为嵌入式Web服务器,TCP连接时只需处于被动服务的状态,所以将标准的TCP有限状态机的主动创建连接的SYN-SENT状态,主动关闭连接的FIN-WAIT1,FIN-WAIT2,
CLOSING,TIME-WAIT状态都省去,在设计中,还可以舍弃CLOSED状态,让它开始就处于LISTEN状态来监听客户端的连接请求。这样,TCP的三次握手机制中,建立连接的过程时,嵌入式系统作为监听状态的服务器,始终为被动方,相当于被动打开后的LISTEN状态,等待对方发起连接。当它接收到SYN数据片,它发出SYN+ACK数据片并确认它己经收到对方的SYN,此时变为SYN_RECEIVED状态。再接收到对方返回的一个仅含ACK的空数据片,则三次握手完成,进入ESTABLISHED状态,之后可以进行TCP数据通讯。这样,既节省了系统开销,同时也保证了所有的数据段都能安全正确地到达目的端。
4 结语
本文的创新之处在于对应用于嵌入式Web服务器的TCP/IP协议栈进行了精简,既兼顾了TCP/IP协议的主要功能的实现,又照顾到嵌入式系统本身的弱点,利用嵌入式TCP/IP协议栈能扩展许多非智能设备的网络功能,使之方便接入Internet,具有很高的实用价值