微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于SX单片机实现WebServer和网络协议栈

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

时间:03-14 来源:互联网 点击:

)的意思是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包,因为它并不对接收到的数据进行重新打包。

2. 传输层

(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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top