基于SF0020芯片的嵌入式TCP/IP協(xié)議族設(shè)計(jì)與實(shí)現(xiàn)
1、 引言
TCP/IP起源于60年代末美國(guó)政府資助的一個(gè)分組交換網(wǎng)絡(luò)研究項(xiàng)目,到現(xiàn)今已發(fā)展成為計(jì)算機(jī)之間最常應(yīng)用的組網(wǎng)形式。盡管標(biāo)準(zhǔn)的TCP/IP協(xié)議族在數(shù)據(jù)傳輸?shù)目煽啃耘c數(shù)據(jù)流量的控制上作的很好,但是8位微控制器性能的限制下,標(biāo)準(zhǔn)的TCP/IP協(xié)議族的實(shí)現(xiàn)占用大量系統(tǒng)資源是實(shí)際應(yīng)用所不允許的。因此要在不改變TCP/IP協(xié)議族標(biāo)準(zhǔn)的前提下對(duì)其進(jìn)行裁剪,使其實(shí)時(shí)性提高同時(shí)保證可靠性以滿足嵌入式系統(tǒng)的要求。
SF0020是NEC公司推出的兼容80C51的8位微控制器芯片。根據(jù)系統(tǒng)在網(wǎng)絡(luò)監(jiān)控系統(tǒng)控制終端應(yīng)用的需要,外部接25MHz晶體,內(nèi)部倍頻至50MHz。該芯片內(nèi)嵌有10M/100Mbps的MAC模塊并提供MII界面,可與外部的Ethernet PHY芯片方便連接。芯片有256字節(jié)內(nèi)部數(shù)據(jù)存儲(chǔ)器,外部可擴(kuò)充至512K字節(jié)。具備的DMA通道實(shí)現(xiàn)了在RAM中和在MAC與RAM之間進(jìn)行快速數(shù)據(jù)傳輸?shù)墓δ?;支持校?yàn)和模塊,在實(shí)現(xiàn)TCP/IP時(shí)可以節(jié)省控制器運(yùn)算開銷。指令周期為4個(gè)時(shí)鐘周期(標(biāo)準(zhǔn)80C51為12時(shí)鐘周期/指令周期)。其性能滿足實(shí)現(xiàn)嵌入式TCP/IP協(xié)議族的基本要求。
2、 協(xié)議族總體框架設(shè)計(jì)與裁剪策略
為了實(shí)現(xiàn)在局域網(wǎng)環(huán)境中作為客戶端控制前端監(jiān)控設(shè)備(硬盤錄像機(jī)、編碼器、解碼、視頻服務(wù)器等)的應(yīng)用要求,必須在有限的硬件資源的條件下保證數(shù)據(jù)傳輸?shù)目煽啃院蛯?shí)時(shí)性。因此數(shù)據(jù)鏈路層采用目前應(yīng)用最為廣泛的以太網(wǎng)協(xié)議;上層利用TCP/IP的實(shí)現(xiàn)采用在運(yùn)輸層直接采用可靠的TCP協(xié)議,然后對(duì)其進(jìn)行適當(dāng)裁剪的方法。這是因?yàn)榭紤]到通用性、兼容性和通信的可靠程度,而沒有使用在應(yīng)用層加入控制策略運(yùn)輸層使用簡(jiǎn)單UDP協(xié)議的方案。本地?cái)?shù)據(jù)的流動(dòng)要實(shí)現(xiàn)向應(yīng)用程序提供可靠的數(shù)據(jù),與底層以太網(wǎng)驅(qū)動(dòng)程序交互數(shù)據(jù)報(bào)功能。
協(xié)議族系統(tǒng)結(jié)構(gòu)框架如下圖1所示,其中虛線部分是本文所要完成的,包括socket子層、運(yùn)輸層的TCP協(xié)議、網(wǎng)絡(luò)層的IP和ICMP協(xié)議、ARP協(xié)議和以太網(wǎng)子層。
500)this.style.width=500;" border="0" />
圖1 協(xié)議族系統(tǒng)框架
2.1 接口子層實(shí)現(xiàn)
以太網(wǎng)子層提供了與以太網(wǎng)驅(qū)動(dòng)程序的接口,其實(shí)現(xiàn)驅(qū)動(dòng)程序存儲(chǔ)空間和協(xié)議空間之間數(shù)據(jù)搬移的功能;以及數(shù)據(jù)報(bào)流入的分路和流出的封裝處理。
Socket(插口)子層向上層提供了創(chuàng)建一個(gè)socket描述符,將本地的IP地址與端口號(hào)綁定到一個(gè)socket上,TCP連接的建立、斷開,數(shù)據(jù)的接收與發(fā)送的功能。
2.2 網(wǎng)絡(luò)層實(shí)現(xiàn)
網(wǎng)絡(luò)層實(shí)現(xiàn)包括IP協(xié)議(Internet Protocol網(wǎng)際協(xié)議)和基于IP協(xié)議的ICMP協(xié)議(Internet Control Messages Protocol控制報(bào)文協(xié)議)。圖1中該層下部的ARP(Address Resolution Protocol 地址解析協(xié)議)為IP提供動(dòng)態(tài)地址解析服務(wù)。
IP是TCP/IP協(xié)議族中最為核心的協(xié)議。所有的網(wǎng)絡(luò)層和運(yùn)輸層數(shù)據(jù)都以IP數(shù)據(jù)報(bào)格式傳輸。為了減小TCP/IP協(xié)議族的負(fù)擔(dān),接收時(shí)首先要檢查數(shù)據(jù)報(bào)的正確性,其次還要過濾目的地址不是本機(jī)的報(bào)文;此外如果收到被IP分片的數(shù)據(jù)報(bào)立即丟棄。最后判斷協(xié)議交給TCP或ICMP協(xié)議處理。因?yàn)榻笽P層分片可以提高通信的效率和可靠性,根據(jù)以太網(wǎng)最大傳輸單元(MTU)的限制,socket子層控制了用戶每次傳輸分組的最大字節(jié)數(shù)。同樣服務(wù)端也對(duì)IP分片加以限制使IP無需把有限的系統(tǒng)資源消耗在IP報(bào)文重裝上,這正是丟棄被分片的IP數(shù)據(jù)報(bào)的原因。
ICMP提供主機(jī)或路由器報(bào)告差錯(cuò)或提供查詢信息的服務(wù)。ICMP報(bào)文可以分成兩類:差錯(cuò)和查詢。查詢報(bào)文是用一對(duì)請(qǐng)求和回答定義的。ICMP差錯(cuò)報(bào)文通常包含了引起錯(cuò)誤的IP數(shù)據(jù)報(bào)的第一個(gè)分片的IP首部(和選項(xiàng)),加上該分片數(shù)據(jù)部分的前8個(gè)字節(jié)。由于運(yùn)輸層僅僅使用TCP協(xié)議,ICMP也進(jìn)行了裁剪。協(xié)議支持ping命令請(qǐng)求回顯應(yīng)答,用于檢查協(xié)議族的運(yùn)行狀況;差錯(cuò)控制全部交給運(yùn)輸層TCP協(xié)議處理。
ARP協(xié)議為IP地址和硬件地址之間提供映射。ARP報(bào)文分為請(qǐng)求和應(yīng)答兩種報(bào)文,通過這兩種報(bào)文實(shí)現(xiàn)ARP緩存的更新。ARP高速緩存在它的運(yùn)行過程中非常關(guān)鍵。由于微控制器硬件資源限制ARP高速緩存只定義了8組,因此查找采用線性搜索的方法對(duì)最終性能并沒有影響。緩存只包含以下4項(xiàng)既可以實(shí)現(xiàn)ARP協(xié)議又可以節(jié)省硬件資源:IP地址、MAC地址、寫入時(shí)間、標(biāo)志位。
2.3 運(yùn)輸層實(shí)現(xiàn)
運(yùn)輸層僅僅實(shí)現(xiàn)了TCP(Transfer Control Protocol傳輸控制協(xié)議)。該協(xié)議提供了全雙工高可靠性的通信,因此應(yīng)用層和網(wǎng)絡(luò)層可以忽略相關(guān)細(xì)節(jié)。TCP是TCP/IP體系中面向連接的運(yùn)輸層協(xié)議,它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分組交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組,設(shè)置發(fā)送最后確認(rèn)分組的超時(shí)時(shí)鐘等。
每當(dāng)本地發(fā)出連接建立請(qǐng)求后,創(chuàng)建一個(gè)對(duì)應(yīng)的傳輸控制模塊TCB(Transmission Control Block).它存儲(chǔ)了該連接中的重要信息。和ARP高速緩存一樣其數(shù)據(jù)保存在片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)來提高協(xié)議的運(yùn)行效率。本文中TCB的實(shí)現(xiàn)只包含以下內(nèi)容:IP地址、雙方端口號(hào)、雙方序列號(hào)、對(duì)方應(yīng)答序號(hào)、當(dāng)前連接狀態(tài)、定時(shí)器、指向下一個(gè)有效數(shù)據(jù)區(qū)的指針、窗口大小。此外通過對(duì)TCP首部的選項(xiàng)字段的配置,即保證在局域網(wǎng)內(nèi)部傳輸時(shí)IP層傳輸時(shí)不會(huì)分片使MMS(Maximum Segment Size 最大報(bào)文段長(zhǎng)度)盡可能大,可以提高TCP傳輸效率。 同時(shí)考慮到作為客戶端應(yīng)用,在不影響正常工作的前提下TCP有限狀態(tài)機(jī)實(shí)現(xiàn)中去掉了服務(wù)端的兩個(gè)狀態(tài)LISTEN(監(jiān)聽)、SYN_RCVED(接收SYN狀0態(tài))如下圖2所示。
500)this.style.width=500;" border="0" />
圖2 TCP有限狀態(tài)機(jī)
由于網(wǎng)絡(luò)中數(shù)據(jù)傳輸必然會(huì)產(chǎn)生數(shù)據(jù)丟失,TCP錯(cuò)誤重傳和數(shù)據(jù)重組尤為重要。錯(cuò)誤重傳是在發(fā)送了需對(duì)端確認(rèn)的報(bào)文段后設(shè)置重傳定時(shí)器,如果在定時(shí)器時(shí)限內(nèi)未收到ACK該報(bào)文段被重發(fā)。因此當(dāng)數(shù)據(jù)發(fā)送之后要等到ACK確認(rèn)報(bào)文才能丟棄。數(shù)據(jù)重組是基于面向字節(jié)的序列號(hào),實(shí)現(xiàn)重復(fù)數(shù)據(jù)的丟棄、亂序報(bào)文的重組。
3、協(xié)議族實(shí)現(xiàn)關(guān)鍵技術(shù)
3.1 協(xié)議族定時(shí)器的實(shí)現(xiàn)
ARP實(shí)現(xiàn)需要兩個(gè)定時(shí)器。重傳需要一個(gè)定時(shí)器,如果ARP報(bào)文發(fā)送后1秒中內(nèi)沒有應(yīng)答則再次發(fā)送,本文實(shí)現(xiàn)連續(xù)4次重傳后ARP將放棄;ARP高速緩存數(shù)據(jù)存儲(chǔ)時(shí)間需要一個(gè)定時(shí)器,緩存內(nèi)容保存時(shí)間為20分鐘,同時(shí)允許管理員創(chuàng)建永久節(jié)點(diǎn)作為代理節(jié)點(diǎn)。
TCP實(shí)現(xiàn)為當(dāng)前連接建立了如下六個(gè)定時(shí)器:連接建立定時(shí)器,重傳定時(shí)器,延遲ACK定時(shí)器,持續(xù)定時(shí)器, FIN_WAIT_2定時(shí)器,TIME_WAIT定時(shí)器;去掉了?;疃〞r(shí)器,因?yàn)樵摱〞r(shí)器僅是TCP連接的可選配置,在監(jiān)控中的需要有應(yīng)用程序?qū)崿F(xiàn)更加嚴(yán)格的連接保持定時(shí)。本文根據(jù)實(shí)際監(jiān)控網(wǎng)絡(luò)情況修改了標(biāo)準(zhǔn)協(xié)議族定義的超時(shí)時(shí)間,使實(shí)時(shí)性得以提高。
3.2 協(xié)議族的內(nèi)存管理策略
傳入的分組是保存在內(nèi)存中并將其傳遞給適當(dāng)?shù)膮f(xié)議作進(jìn)一步處理的。同時(shí),應(yīng)用程序產(chǎn)生的數(shù)據(jù)也必須以分組的形式存儲(chǔ)在內(nèi)存中,并最終將其交給網(wǎng)絡(luò)硬件設(shè)備傳送出去。因此協(xié)議的高效性取決于如何管理保存這些分組的存儲(chǔ)空間。本文對(duì)內(nèi)存管理用以下兩種方法做到快速分配存儲(chǔ)空間,并且避免分組在各層協(xié)議之間移動(dòng)時(shí)的數(shù)據(jù)復(fù)制。
發(fā)送數(shù)據(jù)報(bào)時(shí)采用大緩沖區(qū)方案:即將緩沖區(qū)劃分的足夠大(1514字節(jié)),提前留出協(xié)議首部字節(jié)的大小,能夠存儲(chǔ)最長(zhǎng)的分組。接收數(shù)據(jù)報(bào)時(shí)采用鏈表方案:為了避免內(nèi)存碎片的產(chǎn)生該緩沖區(qū)采用固定大小。鏈表的特點(diǎn)是允許快速封裝而無需數(shù)據(jù)的復(fù)制,也就是說當(dāng)接收到遞交上來的數(shù)據(jù)報(bào)后,就分配一個(gè)新緩沖區(qū),填寫其中的內(nèi)容后將新緩沖區(qū)插入保存此信息的鏈接列表中,這樣就可以很容易的在某個(gè)信息的前面插入附加字節(jié),而無需移動(dòng)已經(jīng)存在的數(shù)據(jù)。采用此方法可以優(yōu)化TCP數(shù)據(jù)報(bào)的重組。
采用以上兩種方法可以最大限度實(shí)現(xiàn)TCP/IP協(xié)議族內(nèi)數(shù)據(jù)公用,無需額外數(shù)據(jù)搬移。
3.3 協(xié)議族數(shù)據(jù)流程
如下圖3所示,用戶待發(fā)送的數(shù)據(jù)首先通過socket接口程序進(jìn)入TCP/IP協(xié)議族,分別進(jìn)行TCP與IP的數(shù)據(jù)封裝后查詢ARP高速緩存,如果存在當(dāng)前目的IP與硬件地址的映射則填充以太網(wǎng)幀頭部信息后拷貝至以太網(wǎng)驅(qū)動(dòng)程序空間立即發(fā)送,否則發(fā)出ARP查詢報(bào)文,將當(dāng)前用戶數(shù)據(jù)拷貝至發(fā)送等待緩沖,進(jìn)入接收狀態(tài)等待ARP查詢報(bào)文的應(yīng)答。
由于輸入操作發(fā)生在中斷期間,此時(shí)設(shè)備驅(qū)動(dòng)程序是不能調(diào)用任何過程來處理分組,也就是說中斷服務(wù)程序并不直接調(diào)用IP,而是使用了消息傳遞的方式。當(dāng)一個(gè)IP分組到達(dá)之后用消息通知主循環(huán),由主循環(huán)調(diào)用協(xié)議族進(jìn)行數(shù)據(jù)處理。如下圖4所示,首先通過以太網(wǎng)子層分路到達(dá)幀,如果是ARP報(bào)文則檢查更新ARP緩沖,收到ARP請(qǐng)求立即應(yīng)答,若是應(yīng)答報(bào)文則檢查本地發(fā)送等待隊(duì)列如有數(shù)據(jù)立即發(fā)送;如果是IP報(bào)文首先判定其協(xié)議類型,ICMP報(bào)文中的ping命令請(qǐng)求回顯則立即應(yīng)答,源站抑制報(bào)文交給TCP處理;若是TCP協(xié)議進(jìn)入有限狀態(tài)機(jī)進(jìn)行解析最后將有效數(shù)據(jù)通過socket接口遞交上層。
500)this.style.width=500;" border="0" />
圖3 協(xié)議族數(shù)據(jù)發(fā)送處理框圖 圖4 協(xié)議族數(shù)據(jù)接收處理框圖
4、 結(jié)論
經(jīng)過裁剪的嵌入式TCP/IP協(xié)議族,結(jié)構(gòu)精簡(jiǎn),實(shí)時(shí)性強(qiáng),可以在SF0020芯片上穩(wěn)定運(yùn)行,基于該協(xié)議族的網(wǎng)絡(luò)監(jiān)控系統(tǒng)控制終端通過了專項(xiàng)測(cè)試達(dá)到期望的要求。