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