基于SX單片機(jī)WebServer和網(wǎng)絡(luò)協(xié)議棧的實(shí)現(xiàn)
四階TLT電壓增益公式推導(dǎo)及其特性日益普及,信息共享程度的不斷提高,給工作和生活帶來(lái)了極大的方便?,F(xiàn)在,上網(wǎng)瀏覽對(duì)于人們來(lái)說(shuō)是一件很平常的事情。不僅如此,架構(gòu)一個(gè)WebServer,做自己的主頁(yè)也是司空見(jiàn)慣的。一般情況下,人們通過(guò)一臺(tái)上網(wǎng)的電腦來(lái)建立WebServer。在這里將討論另外一種方法:通過(guò)單片機(jī)來(lái)建立WebServer。之所以會(huì)想到用單片機(jī)來(lái)實(shí)現(xiàn) WebServer,是因?yàn)殡S著嵌入式系統(tǒng)的迅猛發(fā)展和IA(信息電器)的出現(xiàn),以單片機(jī)為中心的應(yīng)用系統(tǒng)將搭上Internet的快車(chē)逐步取代傳統(tǒng)的以 PC為中心的應(yīng)用,成為未來(lái)Internet發(fā)展中的主力軍。
一、 具體應(yīng)用方案
1. 基于單片機(jī)的WebServer方案
基于單片機(jī)的WebServer的硬件平臺(tái)如圖1所示。
2. 主要芯片介紹
(1) SX52BD100
SX52BD100 是UBICOM公司生產(chǎn)的一款RISC指令集的單片機(jī),片上帶有4K×16 位的Flash存儲(chǔ)器和262×8位的RAM。由于采用CPU并行流水線(xiàn)方式及單時(shí)鐘周期指令,在100MHz晶振驅(qū)動(dòng)下指令執(zhí)行速度可達(dá) 100MIPS。該單片機(jī)的最大特點(diǎn)就是虛擬外設(shè)功能,即通過(guò)軟件對(duì)I/O口進(jìn)行靈活的配置,CPU執(zhí)行虛擬軟件模塊就可以驅(qū)動(dòng)普通的I/O口來(lái)模擬外設(shè)的功能,比如UART、SPI、IIC和FSK等。當(dāng)然,令人驚奇的是,SX52BD100可以通過(guò)虛擬外設(shè)功能來(lái)運(yùn)行網(wǎng)絡(luò)協(xié)議棧,例如TCP、IP、 HTTP以及SMTP等。
(2)RTL8019AS
RTL8019AS是ReaLTEk公司出品的一種全雙工以太網(wǎng)控制器。它自帶16KB的SRAM,工作在Ethernet II和IEEE802.3、 10Base5、10Base2、10BaseT下,與NE2000兼容。
(3)24LC256
24LC256是MicroChip公司生產(chǎn)的一種串行32KB的 E2PROM存儲(chǔ)器,采用CMOS工藝,通過(guò)2根數(shù)據(jù)線(xiàn)和外界通信,兼容I2C總線(xiàn)接口,可設(shè)為硬件寫(xiě)保護(hù),10萬(wàn)次的擦寫(xiě),200年以上的數(shù)據(jù)保護(hù)。
3.工作流程和軟件設(shè)計(jì)
RJ45為此系統(tǒng)與局域網(wǎng)的接口。由于大部分局域網(wǎng)都采用以太網(wǎng),這里的RTL8019AS就是處理以太網(wǎng)協(xié)議(IEEE802.3)的。數(shù)據(jù)的流向?yàn)椋赫?qǐng)求信息從局域網(wǎng)中來(lái),通過(guò)RJ45送到RTL8019AS,處理后的數(shù)據(jù)包送入SX52BD100協(xié)議棧,由協(xié)議棧對(duì)數(shù)據(jù)包進(jìn)行解析,得到原始請(qǐng)求信息。請(qǐng)求信息再經(jīng)過(guò)SX52BD100的處理,產(chǎn)生回復(fù)信息。回復(fù)信息到局域網(wǎng)的過(guò)程與上面正好相反。
整個(gè)系統(tǒng)的軟件流程如圖2所示。
圖1中的E2PROM 24LC256用來(lái)存儲(chǔ)WebServer的網(wǎng)頁(yè)信息。它可以處理Web頁(yè)面、圖像文件、PDF文檔記憶其它文件。當(dāng)然,它不能像PC上WebServer中的硬盤(pán)那樣可以存儲(chǔ)大量的頁(yè)面。它的容量決定了WebServer的資源文件的大小。
二、網(wǎng)絡(luò)協(xié)議棧的實(shí)現(xiàn)
網(wǎng)絡(luò)協(xié)議通常分不同層次進(jìn)行開(kāi)發(fā),每一層分別負(fù)責(zé)不同的通信功能。一個(gè)協(xié)議族,比如TCP/IP,是一組不同層次上的多個(gè)協(xié)議的組合。TCP/IP通常被認(rèn)為是一個(gè)四層協(xié)議系統(tǒng),如圖3所示。每一層負(fù)責(zé)不同的功能。
(1)數(shù)據(jù)鏈路層,有時(shí)也稱(chēng)為網(wǎng)絡(luò)接口層。通常包括操作系統(tǒng)中的設(shè)備驅(qū)動(dòng)程序和計(jì)算機(jī)中對(duì)應(yīng)的網(wǎng)絡(luò)接口卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理接口細(xì)節(jié)。
(2)網(wǎng)絡(luò)層,有時(shí)也稱(chēng)作互聯(lián)網(wǎng)層。處理分組在網(wǎng)絡(luò)中的活動(dòng),例如分組的選路。在TCP/IP協(xié)議族中,網(wǎng)絡(luò)層協(xié)議包括IP協(xié)議(網(wǎng)際協(xié)議)、ICMP 協(xié)議(Internet互聯(lián)網(wǎng)控制報(bào)文協(xié)議)以及IGMP 協(xié)議(Internet組管理協(xié)議)。這里主要討論IP協(xié)議。
(3)傳輸層主要為兩臺(tái)主機(jī)上的應(yīng)用程序提供端到端的通信。TCP為兩臺(tái)主機(jī)提供高可靠性的數(shù)據(jù)通信。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組,設(shè)置發(fā)送最后確認(rèn)分組的超時(shí)時(shí)鐘等。由于運(yùn)輸層提供了高可靠性的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)。
(4)應(yīng)用層負(fù)責(zé)處理特定的應(yīng)用程序細(xì)節(jié)。幾乎各種不同的TCP/IP實(shí)現(xiàn)都會(huì)提供下面這些應(yīng)用:
① HTTP超文本傳輸控制協(xié)議;
② TELNET遠(yuǎn)程登錄;
③ FTP文件傳輸協(xié)議;
④ SMTP簡(jiǎn)單郵件傳送協(xié)議;
⑤ SNMP簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議。
因?yàn)閿?shù)據(jù)鏈路層主要是網(wǎng)絡(luò)接口卡及驅(qū)動(dòng),由RTL8019AS來(lái)實(shí)現(xiàn),所以下面討論網(wǎng)絡(luò)層、傳輸層和應(yīng)用層協(xié)議棧的實(shí)現(xiàn)。
1. 網(wǎng)絡(luò)層
(1) IP協(xié)議
IP是TCP/IP 協(xié)議族中最為核心的協(xié)議。Internet所有的數(shù)據(jù)都以IP 數(shù)據(jù)報(bào)格式傳輸。IP協(xié)議最大的特點(diǎn)是提供不可靠的和無(wú)連接的數(shù)據(jù)包傳送服務(wù)。
不可靠(unreliable)的意思是它不能保證IP數(shù)據(jù)報(bào)能成功地到達(dá)目的地。IP僅提供最好的傳輸服務(wù)。若發(fā)生某種錯(cuò)誤時(shí),如某個(gè)路由器暫時(shí)用完了緩沖區(qū),IP有一個(gè)簡(jiǎn)單的錯(cuò)誤處理算法:丟棄該數(shù)據(jù)報(bào),然后發(fā)送ICMP(Internet控制報(bào)文協(xié)議)消息報(bào)給信源端。任何要求的可靠性必須由上層來(lái)提供(如TCP)。
無(wú)連接(connectionless)的意思是IP并不維護(hù)任何關(guān)于后續(xù)數(shù)據(jù)報(bào)的狀態(tài)信息。每個(gè)數(shù)據(jù)報(bào)的處理是相互獨(dú)立的。這也說(shuō)明,IP數(shù)據(jù)報(bào)可以不按發(fā)送順序接收。如果一信源向相同的信宿發(fā)送兩個(gè)連續(xù)的數(shù)據(jù)報(bào)(先是A,然后是B),每個(gè)數(shù)據(jù)報(bào)都是獨(dú)立地進(jìn)行路由選擇,可能選擇不同的路線(xiàn),因此, B可能在A到達(dá)之前先到達(dá)。
IP數(shù)據(jù)包的格式如圖4所示。
版本是指IP協(xié)議的版本號(hào)。目前的協(xié)議版本號(hào)是4, 因此IP也稱(chēng)作IPV4。
首部長(zhǎng)度指的是首部占32bit字的數(shù)目。由于它是一個(gè)4位字段,因此首部最長(zhǎng)為60個(gè)字節(jié)。在這里,IP數(shù)據(jù)報(bào)字段的值是5。
服務(wù)類(lèi)型字段包括一個(gè)3位的優(yōu)先權(quán)子字段(現(xiàn)在已被忽略)、4位的TOS子字段和1位未用位但必須置0。4bit的TOS分別代表:最小時(shí)延、最大吞吐量、最高可靠性和最小費(fèi)用。4bit中只能置其中1bit 。如果所有4bit 均為0,那么就意味著是一般服務(wù)。
總長(zhǎng)度字段是指整個(gè)I P 數(shù)據(jù)報(bào)的長(zhǎng)度,以字節(jié)為單位。利用首部長(zhǎng)度字段和總長(zhǎng)度字段,就可以知道I P 數(shù)據(jù)報(bào)中數(shù)據(jù)內(nèi)容的起始位置和長(zhǎng)度。
標(biāo)識(shí)字段唯一地標(biāo)識(shí)主機(jī)發(fā)送的每一份數(shù)據(jù)報(bào)。
標(biāo)志字段用來(lái)指定目的地址是一個(gè)完整的主機(jī)地址還是一個(gè)網(wǎng)絡(luò)地址。
生存時(shí)間字段設(shè)置了數(shù)據(jù)報(bào)可以經(jīng)過(guò)的最多路由器數(shù)。
首部檢驗(yàn)和字段是根據(jù)IP首部計(jì)算的檢驗(yàn)和碼。
源地址和目的地址都是32位的數(shù)據(jù)。
可選項(xiàng)定義安全和處理限制、記錄路徑、時(shí)間戳、寬松的源站選路、嚴(yán)格的源站選路等信息。
(2)SX協(xié)議棧對(duì)IP層的實(shí)現(xiàn)
SX52BD100的協(xié)議棧中,IP層的實(shí)現(xiàn)就是把要發(fā)送出去的消息進(jìn)行IP打包,即加上IP包頭,使之符合IP數(shù)據(jù)包的格式發(fā)送到物理層;將接收到的來(lái)自物理層的數(shù)據(jù)包進(jìn)行IP解包,即去掉包頭,送到TCP層。應(yīng)注意,協(xié)議棧不接收分片的IP包,因?yàn)樗⒉粚?duì)接收到的數(shù)據(jù)進(jìn)行重新打包。
2. 傳輸層
(1)TCP 協(xié)議
TCP提供一種面向連接的、可靠的字節(jié)流傳送服務(wù)。TCP數(shù)據(jù)包的結(jié)構(gòu)如圖5所示。
每個(gè)TCP段都包含源端和目的端的端口號(hào),用于尋找發(fā)端和收端應(yīng)用進(jìn)程。這兩個(gè)值加上IP包頭中的源端IP地址和目的端IP地址,唯一確定一個(gè)TCP連接。
序號(hào)用來(lái)標(biāo)識(shí)從T C P 發(fā)端向T C P 收端發(fā)送的數(shù)據(jù)字節(jié)流。它表示在這個(gè)報(bào)文段中的第一個(gè)數(shù)據(jù)字節(jié)。
確認(rèn)序號(hào)包含發(fā)送確認(rèn)的一端所期望收到的下一個(gè)序號(hào)。
首部長(zhǎng)度給出首部中32bit字的數(shù)目。
緊急指針是一個(gè)正的偏移量,與序號(hào)字段中的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)。其余字段的意義和IP包中的差不多。
為了保證TCP層的數(shù)據(jù)能有效地傳輸,在建立TCP連接時(shí),用到了三向握手機(jī)制。具體過(guò)程如下(假設(shè)在A、B間通信,A、B的初始化序號(hào)為X、Y):
① 由A向B發(fā)出SYN信號(hào),告訴B,A的初始化序號(hào)為X。
② 由B向A發(fā)出ACK和SYN信號(hào),告訴A,B知道A的初始化序號(hào)為X,B的是Y。
③ 由A向B發(fā)出ACK信號(hào),告訴B,A知道B的初始化序號(hào)是Y。
經(jīng)過(guò)這樣的初始化后,TCP連接的建立就完成了,A與B之間的數(shù)據(jù)傳輸也可靠了。
(2) SX協(xié)議棧對(duì)TCP層的實(shí)現(xiàn)
在SX52BD100的協(xié)議棧中,對(duì)TCP層的實(shí)現(xiàn)是通過(guò)提供的TCP API(應(yīng)用程序接口)來(lái)實(shí)現(xiàn)。TCP的API主要包括下面的函數(shù)和變量:
TCPApp1Init():建立第一個(gè)TCP連接的初始化函數(shù);
TCPApp2Init():建立第二個(gè)TCP連接的初始化函數(shù);
TCPAppTxBytes():TCP連接中發(fā)送數(shù)據(jù)的字節(jié)數(shù);
TCPAppRxBytes():TCP連接中接收數(shù)據(jù)的字節(jié)數(shù);
TCPAppTxData():發(fā)送數(shù)據(jù);
TCPAppRxData():接收數(shù)據(jù);
TCPAppTxDone():發(fā)送完畢;
TCPAppRxDone():接收完畢;
TCPAppPassiveOpen():被動(dòng)TCP連接;
TCPApPACtiv