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)行路由選擇,可能選擇不同的路線,因此,B可能在A到達(dá)之前先到達(dá)。
IP數(shù)據(jù)包的格式如圖4所示。
版本是指IP協(xié)議的版本號(hào)。目前的協(xié)議版本號(hào)是4,因此IP也稱作IPV4。
首部長(zhǎng)度指的是首部占32bit字的數(shù)目。由于它是一個(gè)4位字段,因此首都最長(zhǎng)為60個(gè)字節(jié)。在這里,IP數(shù)據(jù)報(bào)字段的值是5。
服務(wù)類型字段包括一個(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è)IP數(shù)據(jù)報(bào)的長(zhǎng)度,以字節(jié)為單位。利用首都長(zhǎng)度字段和總長(zhǎng)度字段,這可以知道IP數(shù)據(jù)服中數(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í)間戳、寬松的源站遠(yuǎn)路、嚴(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í)從TCP發(fā)端向TCP收端發(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連續(xù)的建立就完成了,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ù)和變量;
TCPApplInit():建立第一個(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連接;
TCPAppActiveOpen():主動(dòng)TCP連接;
Sock1RomoteIP、Sock2RomoteIP:TCP連接的遠(yuǎn)程主機(jī)的IP地址;
MyIP:本機(jī)的IP地址;
tcblLocalPortMSB、tcb1LocalPortLSB、tcb2LocalPortMSB、tcb2LocalPortLSB:本機(jī)的TCP連接端口;
tcb1RemotePortMSB、tcb1RemotePortLSB、tcb2RemotePortMSB、tcb2RemotePortLSB:遠(yuǎn)程主機(jī)的TCP連接端口;
TCP協(xié)議棧支持同時(shí)建立兩個(gè)TCP連接:一個(gè)為主動(dòng)連接,由TCPApp1nit()來(lái)控制;另一個(gè)為被動(dòng)連接,由TCPApp2Init()來(lái)控制。TCP是基于連接的協(xié)議,因?yàn)楸仨毐Wo(hù)對(duì)TCP連接狀態(tài)的監(jiān)視和狀態(tài)有關(guān)的信息保存在發(fā)送控制塊中;而TCP連接狀態(tài)的改變由TCP的軟件狀態(tài)機(jī)來(lái)實(shí)現(xiàn)。軟件狀態(tài)機(jī)又由事件或用戶來(lái)觸發(fā)。比如,當(dāng)監(jiān)視到一個(gè)帶有SYN標(biāo)志的TCP包到達(dá)時(shí),狀態(tài)機(jī)就將TCP連接轉(zhuǎn)換到接收狀態(tài);用戶也可以手工控制狀態(tài)機(jī)處于發(fā)送狀態(tài)來(lái)建立TCP連接。
①用TCP API來(lái)建立TCP被動(dòng)連接
_TCPApp2lint
bank TCB2BANK
mov tcb2LocalPortLSB,#HTTP_PORT_LSB ;設(shè)置TCP的服務(wù)端口
mov tcb2LocalPortMSB,#HTTP_PORT_MSB
bank HTTP_BANK
clr httpParseState
clr httpURIHash
setb flags2.TCP_SOCK ;顯示TCP2的連接狀態(tài)
jmp @TCPAppPassiveOpen ;跳轉(zhuǎn)到TCP被動(dòng)連接子程序,進(jìn)行端口偵聽(tīng)
retp
②用TCP API建立TCP主動(dòng)連接
_TCPApp1lnit
test switch ;條件觸發(fā)
sz
retp ;沒(méi)有觸發(fā),退出
bank HTTPBANK
mov w,#HTTP_CONNECT ;啟動(dòng)HTTP狀態(tài)機(jī)
mov httpState,w
bank TCB1_BANK
mov tcb1LocalPortLSB,#80 ;設(shè)置本機(jī)TCP連接服務(wù)端口
mov tcb1LocalPortMSB,#80
mov tcb1RemotePortLSB,#HTTP_PORT_LSB ;設(shè)置遠(yuǎn)程主機(jī)TCP連接服務(wù)端口
mov tcb1RemotePortMSB,#HTTP_PORT_MSB
bank TCPSOCKET_BANK
mov sock1RemoteIR3,#SMTP_SERVER_IP3 ;設(shè)置遠(yuǎn)程主機(jī)的IP地址
mov sock1RemoteIP2,#SMTP_SERVER_IP2
mov sock1RemoteIP1,#SMTP_SERVER_IP1
mov sock1RemoteIP0,#SMTP_SERVER_IP0
clrb flags2.SOCK ;顯示TCP主動(dòng)連接的狀態(tài)
jmp @TCPAppActiveOpen ;在指定的端口建立TCP連接
retp
③用TCP API發(fā)送數(shù)據(jù)和接收數(shù)據(jù)
一旦建立了TCP連接,那就只有兩種情況:發(fā)送數(shù)據(jù)或接收數(shù)據(jù)。接收數(shù)據(jù)時(shí),從IP層來(lái)的數(shù)據(jù)經(jīng)過(guò)狀態(tài)機(jī)去掉TCP包頭后再送到應(yīng)用層;發(fā)送數(shù)據(jù)時(shí),軟件狀態(tài)機(jī)會(huì)在數(shù)據(jù)前面加上TCP包頭再發(fā)送IP層。
接收數(shù)據(jù)時(shí),需要用到的TCP API函數(shù)為TCPAppRxBytes()、TCPAppRxData()和TCPAppRxDone():發(fā)送數(shù)據(jù)時(shí),有一點(diǎn)值得關(guān)注:為了防止接收緩沖區(qū)的溢出,相對(duì)于發(fā)送數(shù)據(jù)包,協(xié)議棧給予接收數(shù)據(jù)包以更高的優(yōu)先組。也就是說(shuō),協(xié)議棧軟件會(huì)一直處理接收的數(shù)據(jù)包,直到接收緩沖區(qū)中沒(méi)有任何數(shù)據(jù)。
發(fā)送數(shù)據(jù)時(shí),需要用到的TCP API函數(shù)為TCPAppTxBytes()、TCPAppTxData()和TCPAppTxDone()。必須注意,只有在建立了TCP連接后,才可以發(fā)送數(shù)據(jù)。
3.應(yīng)用層
HTTP是WWW上的協(xié)議。當(dāng)用戶要瀏覽服務(wù)器上的一個(gè)網(wǎng)頁(yè)時(shí),一個(gè)HTTP請(qǐng)求就會(huì)從而用戶的瀏覽器發(fā)到HTTP服務(wù)器。服務(wù)器響應(yīng)這個(gè)請(qǐng)求,把指定的網(wǎng)頁(yè)傳送回來(lái),用戶才看到了網(wǎng)頁(yè)。
下面是一個(gè)典型的客戶端向服務(wù)器發(fā)送請(qǐng)求的例子:
GET Destination_IP/index.html http/1.0
GET代表客戶端的請(qǐng)求命令,而服務(wù)器也受理這個(gè)命令;Destination_IP代表遠(yuǎn)程主機(jī)的IP地址;index.html是客戶端請(qǐng)求的資源;http/1.0是HTTP協(xié)議版本。
(1)SX協(xié)議棧對(duì)HTTP層的實(shí)現(xiàn)
因?yàn)镠TTP層的下面是TCP層,也就是說(shuō)HTTP把TCP作為它的傳輸協(xié)議,所以那兩個(gè)TCP連接也為WebServer所用。理所當(dāng)然,TCP API的發(fā)送和接收函數(shù)也用來(lái)實(shí)行WebServer的請(qǐng)求和相應(yīng)命令。
所而的服務(wù)器資源都存放在外部的E2PROM中,HTTP使用統(tǒng)一資源定位器來(lái)指定返回給客戶端的網(wǎng)絡(luò)資源。統(tǒng)一資源定位器就像一個(gè)帶而目錄的文件路徑一樣,指定資源的路徑和擴(kuò)展名。SX協(xié)議棧并沒(méi)而像普通的解決方案那樣使用一般的文件系統(tǒng)來(lái)管理外部存儲(chǔ)器中的資源,而是采用了一種稱之為智能信息表來(lái)解決這個(gè)問(wèn)題。當(dāng)一個(gè)請(qǐng)求到來(lái)時(shí),一個(gè)8位的無(wú)用信息對(duì)統(tǒng)一資源定位器進(jìn)行運(yùn)算(8位字符加運(yùn)算),再將得到的數(shù)據(jù)乘以2,并把這個(gè)結(jié)果作為一個(gè)索引區(qū)中的一個(gè)值。如果在E2PROM中已經(jīng)建立了查找表,憑著這個(gè)值在E2PROM中去查表,找到相應(yīng)的資源并返回。用這種方法的好處是可以避免繁瑣的字符串的比較和將統(tǒng)一資源定位直接存放在服務(wù)器中。這種文件系統(tǒng)的結(jié)構(gòu)如圖6所示。
(2)E2PROM的編程
在WebServer啟動(dòng)以前,要先把資源文件下載到E2PROM中。在這個(gè)方案中采用RS232端口從電腦上傳輸資源文件。下載程序自動(dòng)從電腦中載入磁盤的目錄結(jié)構(gòu)并在E2PROM中創(chuàng)建E2PROM文件系統(tǒng)。





