新闻  |   论坛  |   博客  |   在线研讨会
基于SX单片机实现WebServer和网络协议栈
zhchxgh | 2009-07-10 17:05:01    阅读:913   发布文章

基于SX单片机实现WebServer和网络协议栈

作 者:华中师范大学 许华杰 明 健

摘 要: 讨论UBICOM公司(原SCENIX公司)的SX52BD100单片机构建WebServer的具体方案;给出硬件构成框图,并分析每一部分的作用、完成的功能以及软件流程图。为了突出这种单片机的虚拟外设的特点,特别详细地说明网络协议和协议栈的具体实现。

关键词:网络单片机 协议栈 虚拟外设 信息家电 WebServer 

前 言

  Internet的日益普及,信息共享程度的不断提高,给工作和生活带来了极大的方便。现在,上网浏览对于人们来说是一件很平常的事情。不仅如此,架构一个WebServer,做自己的主页也是司空见惯的。一般情况下,人们通过一台上网的电脑来建立WebServer。在这里将讨论另外一种方法:通过单片机来建立WebServer。之所以会想到用单片机来实现WebServer,是因为随着嵌入式系统的迅猛发展和IA(信息电器)的出现,以单片机为中心的应用系统将搭上Internet的快车逐步取代传统的以PC为中心的应用,成为未来Internet发展中的主力军。

一、 具体应用方案

1. 基于单片机的WebServer方案

  基于单片机的WebServer的硬件平台如图1所示。

 
2. 主要芯片介绍

  (1) SX52BD100

  SX52BD100 是UBICOM公司生产的一款RISC指令集的单片机,片上带有4K×16 位的Flash存储器和262×8位的RAM。由于采用CPU并行流水线方式及单时钟周期指令,在100MHz晶振驱动下指令执行速度可达100MIPS。该单片机的最大特点就是虚拟外设功能,即通过软件对I/O口进行灵活的配置,CPU执行虚拟软件模块就可以驱动普通的I/O口来模拟外设的功能,比如UART、SPI、IIC和FSK等。当然,令人惊奇的是,SX52BD100可以通过虚拟外设功能来运行网络协议栈,例如TCP、IP、HTTP以及SMTP等。

  (2)RTL8019AS

  RTL8019AS是RealTek公司出品的一种全双工以太网控制器。它自带16KB的SRAM,工作在Ethernet II和IEEE802.3、 10Base5、10Base2、10BaseT下,与NE2000兼容。

  (3)24LC256

  24LC256是Microchip公司生产的一种串行32KB的 E2PROM存储器,采用CMOS工艺,通过2根数据线和外界通信,兼容I2C总线接口,可设为硬件写保护,10万次的擦写,200年以上的数据保护。

3.工作流程和软件设计

  RJ45为此系统与局域网的接口。由于大部分局域网都采用以太网,这里的RTL8019AS就是处理以太网协议(IEEE802.3)的。数据的流向为:请求信息从局域网中来,通过RJ45送到RTL8019AS,处理后的数据包送入SX52BD100协议栈,由协议栈对数据包进行解析,得到原始请求信息。请求信息再经过SX52BD100的处理,产生回复信息。回复信息到局域网的过程与上面正好相反。

  整个系统的软件流程如图2所示。

  图1中的E2PROM 24LC256用来存储WebServer的网页信息。它可以处理Web页面、图像文件、PDF文档记忆其它文件。当然,它不能像PC上WebServer中的硬盘那样可以存储大量的页面。它的容量决定了WebServer的资源文件的大小。 
二、网络协议栈的实现

  网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统,如图3所示。每一层负责不同的功能。



  (1)数据链路层,有时也称为网络接口层。通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

  (2)网络层,有时也称作互联网层。处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议)以及IGMP 协议(Internet组管理协议)。这里主要讨论IP协议。

  (3)传输层主要为两台主机上的应用程序提供端到端的通信。TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。

  (4)应用层负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面这些应用:

  ① HTTP超文本传输控制协议;

  ② TELNET远程登录;

  ③ FTP文件传输协议;

  ④ SMTP简单邮件传送协议;

  ⑤ SNMP简单网络管理协议。

  这里主要讨论HTTP协议。

  因为数据链路层主要是网络接口卡及驱动,由RTL8019AS来实现,所以下面讨论网络层、传输层和应用层协议栈的实现。

1. 网络层

  (1) IP协议

  IP是TCP/IP 协议族中最为核心的协议。Internet所有的数据都以IP 数据报格式传输。IP协议最大的特点是提供不可靠的和无连接的数据包传送服务。

  不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。若发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP(Internet控制报文协议)消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。

  无连接(connectionless)的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此,B可能在A到达之前先到达。

  IP数据包的格式如图4所示。




  版本是指IP协议的版本号。目前的协议版本号是4, 因此IP也称作IPV4。

  首部长度指的是首部占32bit字的数目。由于它是一个4位字段,因此首部最长为60个字节。在这里,IP数据报字段的值是5。

  服务类型字段包括一个3位的优先权子字段(现在已被忽略)、4位的TOS子字段和1位未用位但必须置0。4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit 。如果所有4bit 均为0,那么就意味着是一般服务。

  总长度字段是指整个I P 数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道I P 数据报中数据内容的起始位置和长度。

  标识字段唯一地标识主机发送的每一份数据报。

  标志字段用来指定目的地址是一个完整的主机地址还是一个网络地址。

  生存时间字段设置了数据报可以经过的最多路由器数。

  首部检验和字段是根据IP首部计算的检验和码。

  源地址和目的地址都是32位的数据。

  可选项定义安全和处理限制、记录路径、时间戳、宽松的源站选路、严格的源站选路等信息。

  (2)SX协议栈对IP层的实现

  SX52BD100的协议栈中,IP层的实现就是把要发送出去的消息进行IP打包,即加上IP包头,使之符合IP数据包的格式发送到物理层;将接收到的来自物理层的数据包进行IP解包,即去掉包头,送到TCP层。应注意,协议栈不接收分片的IP包,因为它并不对接收到的数据进行重新打包。 
 传输层

  (1)TCP 协议

  TCP提供一种面向连接的、可靠的字节流传送服务。TCP数据包的结构如图5所示。



  每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP包头中的源端IP地址和目的端IP地址,唯一确定一个TCP连接。

  序号用来标识从T C P 发端向T C P 收端发送的数据字节流。它表示在这个报文段中的第一个数据字节。

  确认序号包含发送确认的一端所期望收到的下一个序号。

  首部长度给出首部中32bit字的数目。

  紧急指针是一个正的偏移量,与序号字段中的值相加表示紧急数据最后一个字节的序号。其余字段的意义和IP包中的差不多。

  为了保证TCP层的数据能有效地传输,在建立TCP连接时,用到了三向握手机制。具体过程如下(假设在A、B间通信,A、B的初始化序号为X、Y):

  ① 由A向B发出SYN信号,告诉B,A的初始化序号为X。

  ② 由B向A发出ACK和SYN信号,告诉A,B知道A的初始化序号为X,B的是Y。

  ③ 由A向B发出ACK信号,告诉B,A知道B的初始化序号是Y。

  经过这样的初始化后,TCP连接的建立就完成了,A与B之间的数据传输也可靠了。

  (2) SX协议栈对TCP层的实现

  在SX52BD100的协议栈中,对TCP层的实现是通过提供的TCP API(应用程序接口)来实现。TCP的API主要包括下面的函数和变量:

TCPApp1Init():建立第一个TCP连接的初始化函数;
TCPApp2Init():建立第二个TCP连接的初始化函数;
TCPAppTxBytes():TCP连接中发送数据的字节数;
TCPAppRxBytes():TCP连接中接收数据的字节数;
TCPAppTxData():发送数据;
TCPAppRxData():接收数据;
TCPAppTxDone():发送完毕;
TCPAppRxDone():接收完毕;
TCPAppPassiveOpen():被动TCP连接;
TCPAppActiveOpen():主动TCP连接;
Sock1RomoteIP、Sock2RomoteIP:TCP连接的远程主机的IP地址;
MyIP:本机的IP地址;
tcb1LocalPortMSB、tcb1LocalPortLSB、tcb2LocalPortMSB、tcb2LocalPortLSB:本机的TCP连接端口;
tcb1RemotePortMSB、tcb1RemotePortLSB、tcb2RemotePortMSB、tcb2RemotePortLSB:远程主机的TCP连接端口;

  TCP协议栈支持同时建立两个TCP连接:一个为主动连接,由TCPApp1Init()来控制;另一个为被动连接,由TCPApp2Init()来控制。TCP是基于连接的协议,因为必须保持对TCP连接状态的监视和状态有关的信息保存在发送控制块中;而TCP连接状态的改变由TCP的软件状态机来实现。软件状态机又由事件或用户来触发。比如,当监视到一个带有SYN标志的TCP包到达时,状态机就将TCP连接转换到接收状态;用户也可以手工控制状态机处于发送状态来建立TCP连接。

  ① 用TCP API来建立TCP被动连接

_TCPApp2Init
_bank TCB2_BANK
mov tcb2LocalPortLSB, #HTTP_PORT_LSB ;  设置TCP的服务端口
mov tcb2LocalPortMSB, #HTTP_PORT_MSB
bank HTTP_BANK
clr httpParseState
clr httpURIHash
setb flags2.TCP_SOCK ;  显示TCP2的连接状态
jmp @TCPAppPassiveOpen ;  跳转到TCP被动连接子程序,进行端口侦听
retp
② 用TCP API建立TCP主动连接
_TCPApp1Init
test switch ;  条件触发
sz
retp ;  没有触发,退出
_bank HTTP_BANK
mov w, #HTTP_CONNECT ;  启动HTTP状态机
mov httpState, w
_bank TCB1_BANK
mov tcb1LocalPortLSB, #80 ;  设置本机TCP连接服务端口
mov tcb1LocalPortMSB, #80 
mov tcb1RemotePortLSB, #HTTP_PORT_LSB ;  设置远程主机TCP连接服务端口
mov tcb1RemotePortMSB, #HTTP_PORT_MSB
_bank TCPSOCKET_BANK
mov sock1RemoteIP3,#SMTP_SERVER_IP3 ;  设置远程主机的IP地址
mov sock1RemoteIP2,#SMTP_SERVER_IP2
mov sock1RemoteIP1,#SMTP_SERVER_IP1
mov sock1RemoteIP0,#SMTP_SERVER_IP0
clrb flags2.TCP_SOCK ;  显示TCP主动连接的状态
jmp @TCPAppActiveOpen ;  在指定的端口建立TCP连接
retp

  ③ 用TCP API发送数据和接收数据

  一旦建立了TCP连接,那就只有两种情况:发送数据或接收数据。接收数据时,从IP层来的数据经过状态机去掉TCP包头后再送到应用层;发送数据时,软件状态机会在数据前面加上TCP包头再发送到IP层。

  接收数据时,需要用到的TCP API函数为TCPAppRxBytes()、TCPAppRxData()和TCPAppRxDone();发送数据时,有一点值得关注:为了防止接收缓冲区的溢出,相对于发送数据包,协议栈给予接收数据包以更高的优先级。也就是说,协议栈软件会一直处理接收的数据包,直到接收缓冲区中没有任何数据。

  发送数据时,需要用到的TCP API函数为TCPAppTxBytes()、TCPAppTxData()和TCPAppTxDone()。必须注意,只有在建立了TCP连接后,才可以发送数据。

. 应用层

  HTTP是WWW上的协议。当用户要浏览服务器上的一个网页时,一个HTTP 请求就会从用户的浏览器发到HTTP服务器。服务器响应这个请求,把指定的网页传送回来,用户才看到了网页。

  下面是一个典型的客户端向服务器发送请求的例子:

GET Destination_IP/index.html http/1.0

  GET代表客户端的请求命令,而服务器也受理这个命令;
  Destination_IP代表远程主机的IP地址;index.html是客户端请求的资源;
  http/1.0是HTTP协议的版本。

  (1)SX协议栈对HTTP层的实现

  因为HTTP层的下面是TCP层,也就是说HTTP把TCP作为它的传输协议,所以那两个TCP连接也为WebServer所用。理所当然,TCP API的发送和接收函数也用来实行WebServer的请求和相应命令。

  所有的服务器资源都存放在外部的E2PROM中,HTTP使用统一资源定位器来指定返回给客户端的网络资源。统一资源定位器就像一个带有目录的文件路径一样,指定资源的路径和扩展名。SX协议栈并没有像普通的解决方案那样使用一般的文件系统来管理外部存储器中的资源,而是采用了一种称之为智能信息表来解决这个问题。当一个请求到来时,一个8位的无用信息对统一资源定位器进行运算(8位字符加运算),再将得到的数据乘以2,并把这个结果作为一个索引区中的一个值。如果在E2PROM中已经建立了查找表,凭着这个值在E2PROM中去查表,找到相应的资源并返回。用这种方法的好处是可以避免繁琐的字符串的比较和将统一资源定位器直接存放在服务器中。这种文件系统的结构如图6所示。


  (2)E2PROM的编程

  在WebServer启动以前,要先把资源文件下载到E2PROM中。在这个方案中采用RS232端口从电脑上传输资源文件。下载程序自动从电脑中载入磁盘的目录结构并在E2PROM中创建E2PROM文件系统。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客