一種uIP TCP/IP協(xié)議棧在51系列單片機(jī)上的實(shí)現(xiàn)
一 引言
本文引用地址:http://www.ex-cimer.com/article/172581.htm隨著信息技術(shù)的不斷發(fā)展,以及人們對(duì)日常生活舒適度、方便度要求的提高,信息家電、智能儀表等產(chǎn)品越來(lái)越頻繁的出現(xiàn)在我們的生活當(dāng)中;人們也越來(lái)越熱衷于把家電、儀表等設(shè)備連接到Internet 中,從而可以方便、及時(shí)的對(duì)它們進(jìn)行遠(yuǎn)程察看、遠(yuǎn)程控制。把這些設(shè)備接入Internet ,就需要考慮TCP/IP 網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)。
51單片機(jī)是對(duì)目前所有兼容Intel 8031指令系統(tǒng)的單片機(jī)的統(tǒng)稱。該系列單片機(jī)的始祖是Intel的8031單片機(jī),后來(lái)隨著Flash rom技術(shù)的發(fā)展,8031單片機(jī)取得了長(zhǎng)足的進(jìn)展,成為目前應(yīng)用最廣泛的8位單片機(jī)之一,其代表型號(hào)是ATMEL公司的AT89系列,它廣泛應(yīng)用于工業(yè)測(cè)控系統(tǒng)之中。目前很多公司都有51系列的兼容機(jī)型推出,在目前乃至今后很長(zhǎng)的一段時(shí)間內(nèi)將占有大量市場(chǎng)。51單片機(jī)是基礎(chǔ)入門的一個(gè)單片機(jī),還是應(yīng)用最廣泛的一種。需要注意的是52系列的單片機(jī)一般不具備自編程能力。本文將簡(jiǎn)要描述uIP的實(shí)現(xiàn)方法,分析uIP協(xié)議棧的應(yīng)用接口,并討論如何將其應(yīng)用到51系列單片機(jī)上。
二 uIP協(xié)議棧的實(shí)現(xiàn)方法簡(jiǎn)述
uIP協(xié)議棧主要提供了三個(gè)函數(shù)供系統(tǒng)底層調(diào)用。即uip_init(), uip_input() 和uip_periodic()。其與應(yīng)用程序的主要接口是UIP_APPCALL( )。ip_init()是系統(tǒng)初始化時(shí)調(diào)用的,主要初始化協(xié)議棧的偵聽(tīng)端口和默認(rèn)所有連接是封閉的。當(dāng)網(wǎng)卡驅(qū)動(dòng)收到一個(gè)輸進(jìn)包時(shí),將放進(jìn)全局緩沖區(qū)uip_buf中,包的大小由全局變量uip_len約束。同時(shí)將調(diào)用uip_input()函數(shù),這個(gè)函數(shù)將會(huì)根據(jù)包首部的協(xié)議處理這個(gè)包和需要時(shí)調(diào)用應(yīng)用程序。當(dāng)uip_input()返回時(shí),一個(gè)輸出包同樣放在全局緩沖區(qū)uip_buf里,大小賦給uip_len.假如uip_len是0,則說(shuō)明沒(méi)有包要發(fā)送。否則調(diào)用底層系統(tǒng)的發(fā)包函數(shù)將包發(fā)送到網(wǎng)絡(luò)上。uIP周期計(jì)時(shí)是用于驅(qū)動(dòng)所有的uIP內(nèi)部時(shí)鐘事件。當(dāng)周期計(jì)時(shí)激發(fā),每一個(gè)TCP連接都會(huì)調(diào)用uIP函數(shù)uip_periodic()。類似于uip_input()函數(shù)。uip_periodic()函數(shù)返回時(shí),輸出的IP包要放到uip_buf中,供底層系統(tǒng)查詢uip_len的大小發(fā)送。
uIP實(shí)現(xiàn)了TCP/IP協(xié)議集的四個(gè)基本協(xié)議:ARP地址解析協(xié)議,IP網(wǎng)際互聯(lián)協(xié)議, ICMP網(wǎng)絡(luò)控制報(bào)文協(xié)議和TCP傳輸控制協(xié)議。為了在8位16位處理器上應(yīng)用,uIP協(xié)議棧在各層協(xié)議實(shí)現(xiàn)時(shí)采用有針對(duì)性的方法,保持代碼大小和存儲(chǔ)器使用量最小。
1 實(shí)現(xiàn)ARP地址解析協(xié)議時(shí)為了節(jié)省存儲(chǔ)器,ARP應(yīng)答包直接覆蓋ARP請(qǐng)求包。
2 實(shí)現(xiàn)IP網(wǎng)絡(luò)協(xié)議時(shí)對(duì)原協(xié)議進(jìn)行了極大的簡(jiǎn)化,它沒(méi)有實(shí)現(xiàn)分片和重組。
3 實(shí)現(xiàn)ICMP網(wǎng)絡(luò)控制報(bào)文協(xié)議時(shí),只實(shí)現(xiàn)echo(回響)服務(wù)。uIP在生成回響報(bào)文時(shí)并不重新分配存儲(chǔ)器空間,而是直接修改echo請(qǐng)求報(bào)文來(lái)生成回響報(bào)文。將ICMP類型字段從echo類型改變成 echo reply類型,重新計(jì)算校驗(yàn)和修改校驗(yàn)和字段。
4 uIP里的TCP沒(méi)有實(shí)現(xiàn)發(fā)送和接收數(shù)據(jù)的滑動(dòng)窗口。每個(gè)TCP連接的狀態(tài)由uip_conn結(jié)構(gòu)保存,uip_conn結(jié)構(gòu)包括當(dāng)?shù)睾瓦h(yuǎn)端的TCP端口編號(hào),遠(yuǎn)程主機(jī)的IP地址,重發(fā)時(shí)間值,上一段重發(fā)的編號(hào),和連接的段的最大尺寸等信息。一個(gè)uip_conn結(jié)構(gòu)數(shù)組用于保存所有的連接,數(shù)組的大小為支持的同時(shí)連接的最大數(shù)量。為了減少儲(chǔ)存器的使用量,在處理重發(fā)時(shí)uIP并不緩存發(fā)送的數(shù)據(jù)包,而是由應(yīng)用程序在需要重發(fā)時(shí)重新生成發(fā)送的數(shù)據(jù)。
三 uIP協(xié)議棧的接口
uIP協(xié)議棧為了具有最大的通用性,在實(shí)現(xiàn)時(shí)將底層硬件驅(qū)動(dòng)和頂層應(yīng)用層之外的所有協(xié)議集打包在一個(gè)庫(kù)里。協(xié)議棧通過(guò)接口與底層硬件和頂層應(yīng)用通信.通過(guò)這種方式,uIP具有極高的通用性和獨(dú)立性,移植到不同系統(tǒng)和實(shí)現(xiàn)不同的應(yīng)用都很方便,很好的體現(xiàn)了TCP/IP協(xié)議平臺(tái)無(wú)關(guān)性的特點(diǎn)。uIP協(xié)議棧與系統(tǒng)底層和應(yīng)用程序之間的接口關(guān)系如圖(一)所示:
1 uIP協(xié)議棧與系統(tǒng)底層的接口
uIP與系統(tǒng)底層的接口包括與設(shè)備驅(qū)動(dòng)的接口和與系統(tǒng)定時(shí)器的接口兩類。
1.1 uIP與設(shè)備驅(qū)動(dòng)接口
uIP通過(guò)函數(shù)uip_input()和全局變量uip_buf、uip_len來(lái)實(shí)現(xiàn)與設(shè)備驅(qū)動(dòng)的接口。uip_buf用于存放接收到的和要發(fā)送的數(shù)據(jù)包,為了減少存儲(chǔ)器的使用,接收數(shù)據(jù)包和發(fā)送數(shù)據(jù)包使用相同的緩沖區(qū)。uip_len表明接收發(fā)送緩沖區(qū)里的數(shù)據(jù)長(zhǎng)度,通過(guò)判斷uip_len的值是否為0來(lái)判斷是否接收到新的數(shù)據(jù),是否有數(shù)據(jù)要發(fā)送。當(dāng)設(shè)備驅(qū)動(dòng)接收到一個(gè)IP包并放到輸入包緩存里(uip_buf)后,應(yīng)該調(diào)用uip_input()函數(shù)。uip_input()函數(shù)是uIP協(xié)議棧的底層入口,由它處理收到的IP包。當(dāng)uip_input()返回,若有數(shù)據(jù)要發(fā)送,則發(fā)送數(shù)據(jù)包放在包緩沖區(qū)里。包的大小由全局變量uip_len指明。如果uip_len是0,沒(méi)有包要發(fā)送;如果uip_len大于0則調(diào)用網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)發(fā)送數(shù)據(jù)包。
tcp/ip相關(guān)文章:tcp/ip是什么
評(píng)論