① 由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连接后,才可以发送数据。
3. 应用层
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文件系统。
参考文献
1 SX52BD100 Data Sheet. UBICOM Corporation,2000
2 SX52BD100 User Manual. UBICOM Corporation,2000
3 Ethernet SX-Stack Internet Connectivity. UBICOM Corporation,2000
4 Web Server & Send Email Client Implementation with Ethernet as the Physical Layer. UBICOM Corporation,2000