《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > uIP中UDP協(xié)議實(shí)現(xiàn)的改進(jìn)
uIP中UDP協(xié)議實(shí)現(xiàn)的改進(jìn)
來源:微型機(jī)與應(yīng)用2010年第21期
曹欲曉,韓 磊
(南京工程學(xué)院 計(jì)算機(jī)工程學(xué)院,江蘇 南京 211167)
摘要: uIP作為一種廣泛使用的輕量級嵌入式TCP/IP協(xié)議棧,其UDP協(xié)議的實(shí)現(xiàn)還不夠完善,目前最新的1.0版本中僅實(shí)現(xiàn)了UDP客戶端,尚沒有實(shí)現(xiàn)UDP服務(wù)端。為此,對其進(jìn)行了以下三方面的改進(jìn):UDP服務(wù)端口的初始化;接收到UDP客戶端數(shù)據(jù)包后的端口號判斷及匹配;UDP服務(wù)端發(fā)送報(bào)文后目的端口的釋放。經(jīng)過以上改進(jìn)后,實(shí)驗(yàn)證明,uIP 1.0中的UDP實(shí)現(xiàn)了服務(wù)端的功能。
Abstract:
Key words :

摘  要: uIP作為一種廣泛使用的輕量級嵌入式TCP/IP協(xié)議棧,其UDP協(xié)議的實(shí)現(xiàn)還不夠完善,目前最新的1.0版本中僅實(shí)現(xiàn)了UDP客戶端,尚沒有實(shí)現(xiàn)UDP服務(wù)端。為此,對其進(jìn)行了以下三方面的改進(jìn):UDP服務(wù)端口的初始化;接收到UDP客戶端數(shù)據(jù)包后的端口號判斷及匹配;UDP服務(wù)端發(fā)送報(bào)文后目的端口的釋放。經(jīng)過以上改進(jìn)后,實(shí)驗(yàn)證明,uIP 1.0中的UDP實(shí)現(xiàn)了服務(wù)端的功能。
關(guān)鍵詞: uIP;嵌入式TCP/IP協(xié)議棧;UDP;端口

    隨著嵌入式技術(shù)、網(wǎng)絡(luò)技術(shù)的發(fā)展,實(shí)現(xiàn)網(wǎng)絡(luò)互聯(lián)已經(jīng)成為嵌入式系統(tǒng)發(fā)展的一個(gè)必然趨勢。在目前的技術(shù)條件下,越來越多的嵌入式系統(tǒng)選擇了TCP/IP作為與其他計(jì)算機(jī)系統(tǒng)互聯(lián)的網(wǎng)絡(luò)協(xié)議。嵌入式TCP/IP協(xié)議棧已經(jīng)成為嵌入式系統(tǒng)研究與應(yīng)用中的一個(gè)重要領(lǐng)域。
    由于嵌入式系統(tǒng)的軟硬件資源都較為有限,大多數(shù)嵌入式系統(tǒng)中運(yùn)行的TCP/IP協(xié)議棧均根據(jù)嵌入式系統(tǒng)的特點(diǎn)進(jìn)行了相應(yīng)的裁剪。目前應(yīng)用比較廣泛的嵌入式TCP/IP協(xié)議棧有:ucTCP-IP、LWIP、uIP、Linux TCP/IP等。其中uIP是專為8 bit和16 bit的嵌入式微控制器設(shè)計(jì)的微型TCP/IP協(xié)議棧, 它具有良好的互操作性, 并遵循RFC標(biāo)準(zhǔn)。uIP協(xié)議棧的特點(diǎn)是具有很小的代碼量,運(yùn)行時(shí)需要的內(nèi)存很少,實(shí)現(xiàn)了常用的TCP/IP協(xié)議;代碼注釋詳盡,可以用于商業(yè)或非商業(yè)用途[1]。由于具有上述特點(diǎn),uIP被廣泛應(yīng)用在嵌入式系統(tǒng)的網(wǎng)絡(luò)互聯(lián)中。
1 uIP協(xié)議棧的體系結(jié)構(gòu)
    在使用uIP的嵌入式系統(tǒng)的軟件體系結(jié)構(gòu)中,uIP協(xié)議棧相當(dāng)于一個(gè)代碼庫,它通過一系列的函數(shù)實(shí)現(xiàn)與底層硬件和上層應(yīng)用程序的通信。uIP協(xié)議棧與系統(tǒng)底層和上層應(yīng)用之間的關(guān)系如圖1所示[2]。

    從圖1可以看出,uIP協(xié)議棧主要提供了uip_input()和uip_periodic()2個(gè)函數(shù)供系統(tǒng)底層調(diào)用。uIP協(xié)議棧與應(yīng)用程序的主要接口是UIP_APPCALL()和UIP_UDP_APPCALL()。

    uIP初始化時(shí)調(diào)用uip_init()函數(shù),它的主要功能是初始化協(xié)議棧的監(jiān)聽端口,并把所有連接設(shè)置為關(guān)閉狀態(tài)。當(dāng)網(wǎng)絡(luò)控制芯片驅(qū)動(dòng)程序接收到一個(gè)數(shù)據(jù)包時(shí),驅(qū)動(dòng)程序?qū)?shù)據(jù)包放入全局緩沖區(qū)uip_buf中,同時(shí)把包的大小賦給全局變量uip_len。然后uIP的主控部分調(diào)用uip_input()函數(shù),該函數(shù)將會根據(jù)數(shù)據(jù)包首部的協(xié)議標(biāo)識處理這個(gè)包,并在需要時(shí)調(diào)用上層應(yīng)用程序。當(dāng)uip_input()返回時(shí),一個(gè)輸出數(shù)據(jù)包被放在同一個(gè)全局緩沖區(qū)uip_buf中,其大小賦給uip_len。如果uip_len是0,則說明沒有包要發(fā)送,否則主控部分調(diào)用底層系統(tǒng)的發(fā)包函數(shù)將數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)上[3]。

    uIP周期計(jì)時(shí)用于驅(qū)動(dòng)所有的uIP內(nèi)部時(shí)鐘事件。當(dāng)周期計(jì)時(shí)激發(fā)后,每一個(gè)TCP連接都會調(diào)用uIP函數(shù)uip_periodic()。類似于uip_input()函數(shù),uip_periodic()函數(shù)返回時(shí),輸出的IP包要放到uip_buf中,供底層系統(tǒng)查詢uip_len的大小以決定是否發(fā)送。
    由于使用TCP/IP的應(yīng)用很多,因此應(yīng)用程序作為單獨(dú)的模塊由用戶實(shí)現(xiàn)。uIP提供一系列接口供用戶程序調(diào)用,其中大部分接口是作為C的宏命令出現(xiàn)的,之所以這樣做主要是考慮到速度、代碼大小、效率和堆棧的使用。用戶需要把對網(wǎng)絡(luò)數(shù)據(jù)包的處理函數(shù)作為接口提供給uIP,并將這個(gè)函數(shù)定義為宏UIP_APPCALL()或者UIP_UDP_APPCALL()。UIP_APPCALL()是用戶對TCP數(shù)據(jù)包的處理,UIP_UDP_APPCALL()是用戶對UDP數(shù)據(jù)包的處理[4]。這樣,uIP在接收到底層傳來的數(shù)據(jù)包后,在需要送到上層應(yīng)用程序處理的地方,直接調(diào)用UIP_APPCALL()或者UIP_UDP_APPCALL()即可,無需修改uIP。
2 uIP的UDP協(xié)議分析
2.1 UDP協(xié)議的實(shí)現(xiàn)

    當(dāng)uIP接收到一個(gè)UDP數(shù)據(jù)包后,首先從包頭中取出數(shù)據(jù)的長度,然后重新對包進(jìn)行校驗(yàn),如果校驗(yàn)和不對,則直接丟掉這個(gè)包。如果校驗(yàn)無誤,則對收到的包進(jìn)行解復(fù)用。此時(shí)進(jìn)行如下判斷:
if(uip_udp_conn->lport != 0 &&
  UDPBUF->destport == uip_udp_conn->lport &&
  (uip_udp_conn->rport == 0 ||
  UDPBUF->srcport == uip_udp_conn->rport) &&
  (uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_zeroes_addr) ||
uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_ones_addr) ||      uip_ipaddr_cmp(BUF->srcipaddr, uip_udp_conn->ripaddr)))          上述代碼中用到的主要變量、數(shù)據(jù)結(jié)構(gòu)和函數(shù)的含義是:
uip_udp_conn->lport:本地UDP的源端口;
uip_udp_conn->rport:本地UDP的目的端口;
UDPBUF->srcport:接收到的數(shù)據(jù)包中的源端口;
UDPBUF->destport:接收到的數(shù)據(jù)包中的目的端口;
uip_udp_conn->ripaddr:本地UDP的目的IP地址;
BUF->srcipaddr:接收到的數(shù)據(jù)包中的源IP地址;
all_zeroes_addr:IP地址0.0.0.0;
all_ones_addr:IP地址255.255.255.255;
    uip_ipaddr_cmp:IP地址比較函數(shù),如果參加比較的兩個(gè)IP地址相等,則返回1。
    在uIP的實(shí)現(xiàn)中,如果以上判斷語句為真,則對接收到的數(shù)據(jù)包進(jìn)行處理,處理過程包括調(diào)用用戶上層處理程序UIP_UDP_APPCALL()、構(gòu)造新包的包頭、計(jì)算新包的校驗(yàn)和等,然后將構(gòu)造好的返回UDP包送到IP層進(jìn)行處理。
2.2 UDP實(shí)現(xiàn)的不足
    通過對uIP中UDP協(xié)議實(shí)現(xiàn)過程的分析可以發(fā)現(xiàn),uIP沒有提供初始化指定端口的函數(shù),僅提供了一個(gè)對給定IP地址上給定端口建立UDP連接的函數(shù),其原型是struct uip_udp_conn*uip_udp_new(uip_ipaddr_t*ripaddr,u16_t rport)。由于作為服務(wù)端運(yùn)行時(shí)必須指定監(jiān)聽端口[5],而uIP沒有提供此功能,因此要讓uIP作為服務(wù)端運(yùn)行,必須對uIP進(jìn)行改進(jìn)。
3 uIP中UDP協(xié)議的改進(jìn)
3.1 增加初始化UDP服務(wù)端口

    UDP協(xié)議作為服務(wù)端運(yùn)行時(shí),同TCP一樣,必須在某個(gè)指定端口上監(jiān)聽客戶端是否有數(shù)據(jù)包發(fā)送,如果有則還要接收數(shù)據(jù)包,這就要求在uIP記錄UDP連接的數(shù)據(jù)結(jié)構(gòu)uip_udp_conn中設(shè)置本地端口號一項(xiàng),具體實(shí)現(xiàn)步驟如圖2所示。


3.2 IP地址、端口號的判斷及匹配
    uip_process函數(shù)接收到網(wǎng)絡(luò)控制芯片驅(qū)動(dòng)程序送來的數(shù)據(jù)包后,當(dāng)判斷出收到的包是UDP包,執(zhí)行2.1中的判斷并且得到結(jié)果為真后,但還需要再做以下工作:如果uip_udp_conn中的目的端口號為0,則說明這是一個(gè)來自客戶端的首次與服務(wù)端進(jìn)行通信的數(shù)據(jù)包,服務(wù)端尚不知道此客戶端的源端口,因此要把uip_udp_conn中的目的端口號設(shè)為收到的包中的源端口號,把uip_udp_conn中的目的IP地址設(shè)為收到的包中的源IP地址,具體代碼如下:
if(uip_udp_conn->rport==0)
{
    uip_udp_conn->rport=UDPBUF->srcport;                memcpy(uip_udp_conn->ripaddr,UDPBUF->srcipaddr,sizeof(uip_ipaddr_t ));
}
3.3 UDP服務(wù)端目的端口的釋放
    UDP服務(wù)端的端口應(yīng)該可以為來自多個(gè)客戶端的請求提供服務(wù),而UDP本身是一種無連接的傳輸層協(xié)議,因此在每次uIP作為服務(wù)端的UDP通信結(jié)束之后,還要釋放uip_udp_conn中記錄的目的端口號,以便下次接收來自不同IP、不同端口的新請求,否則當(dāng)來自其他端口的請求到達(dá)時(shí),uIP會不予響應(yīng)。
    在uIP的官方網(wǎng)站上下載到uIP 1.0的源代碼之后,按照本文給出的幾個(gè)步驟對uIP 1.0進(jìn)行改造之后,利用gcc編譯器把uIP 1.0編譯成S3C2410上的可執(zhí)行代碼,把基于S3C2410的開發(fā)板作為UDP服務(wù)器,運(yùn)行Windows XP的PC機(jī)作為客戶端,兩者通過一條交叉網(wǎng)線相聯(lián),在PC機(jī)上的測試程序發(fā)出UDP請求后,運(yùn)行在S3C2410上的uIP可以對PC通過UDP協(xié)議發(fā)出的數(shù)據(jù)進(jìn)行處理,并給PC作出正確的回復(fù)。實(shí)驗(yàn)證明,通過對uIP進(jìn)行本文所述的改進(jìn)之后,uIP具有了作為UDP服務(wù)端的能力。
參考文獻(xiàn)
[1] http://www. sics. se/~adam/uip/index. php/Main_Page.
[2] ADAM D. The uIP embedded TCP/IP stack the uIP 1.0 reference manual. June 2006.
[3] ADAM D. Full TCP/IP for 8-bit architectures[C]. In Proceedings of the First International Conference on Mobile Applications, Systems and Services(MOBISYS 2003), San Francisco, May 2003.
[4] ADAM D, OLIVER S, THIEMO V, et al. Protothreads: simplifying event-driven programming of memory-constrained embedded systems[C]. In Proceedings of the Fourth ACM Conference on Embedded Networked Sensor Systems (SenSys 2006), Boulder, Colorado, USA, November 2006.
[5] FOROUZAN B A, FEGAN S C著. TCP/ZP協(xié)議簇[M]. 謝希仁等,譯.北京:清華大學(xué)出版社,2006.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
午夜久久影院| 99精品视频一区| 亚洲精品国产拍免费91在线| 国产区亚洲区欧美区| 国产精品区二区三区日本| 欧美日韩人人澡狠狠躁视频| 欧美激情四色| 欧美jizzhd精品欧美巨大免费| 老色鬼精品视频在线观看播放| 久久久久久网址| 久久嫩草精品久久久精品| 久久狠狠亚洲综合| 久久久久久久久综合| 欧美一区成人| 欧美一区午夜精品| 欧美在线免费视频| 欧美伊人久久久久久午夜久久久久 | 亚洲视频一区在线| 一区二区三区国产盗摄| 正在播放欧美一区| 亚洲欧美日本国产专区一区| 午夜精品在线观看| 欧美在线1区| 久久久最新网址| 欧美不卡视频一区发布| 欧美激情国产日韩| 欧美日韩亚洲成人| 国产精品美女诱惑| 国产色视频一区| 国产一二精品视频| 狠狠综合久久av一区二区小说| 一区二区三区在线免费视频| 亚洲国产日韩欧美在线图片| 99riav国产精品| 亚洲欧美日韩视频二区| 久久精品国产亚洲a| 亚洲免费成人av| 亚洲伊人一本大道中文字幕| 欧美在线网站| 美女视频黄 久久| 欧美日韩亚洲综合| 国产欧美精品国产国产专区| 亚洲成人在线网站| 一本色道精品久久一区二区三区| 亚洲在线免费观看| 亚洲福利国产| 亚洲图片欧美日产| 久久精品亚洲精品国产欧美kt∨| 欧美国产先锋| 国产精品美女一区二区在线观看| 国内精品视频在线观看| 亚洲美女网站| 欧美一区二区三区电影在线观看| 91久久久亚洲精品| 亚洲欧美日韩一区在线| 久久免费国产| 欧美视频专区一二在线观看| 国内精品福利| 在线综合亚洲| 亚洲国产精品成人精品 | 宅男精品导航| 久久久久久一区| 欧美日韩一区视频| 国内视频一区| 中文在线一区| 亚洲国产精品视频一区| 亚洲综合色丁香婷婷六月图片| 久久性色av| 国产精品美女主播在线观看纯欲| 在线成人www免费观看视频| 一区二区三区欧美视频| 久久精品视频免费| 亚洲欧美在线观看| 欧美成人精品不卡视频在线观看| 国产精品国产亚洲精品看不卡15| 亚洲大胆av| 午夜视频在线观看一区二区| 99国产精品一区| 久久一区二区三区超碰国产精品| 欧美精品一区二区三区在线播放| 黄色一区二区在线| 亚洲综合丁香| 亚洲视频专区在线| 欧美二区乱c少妇| 国产日韩欧美综合一区| 99热免费精品在线观看| 亚洲第一区在线观看| 亚洲欧美制服另类日韩| 免费不卡欧美自拍视频| 国产无遮挡一区二区三区毛片日本| 99伊人成综合| 日韩视频在线观看一区二区| 久久综合狠狠| 国产情侣久久| 亚洲香蕉伊综合在人在线视看| 99精品国产一区二区青青牛奶| 美女视频黄 久久| 国产在线拍偷自揄拍精品| 亚洲欧洲99久久| 亚洲男人第一网站| 欧美日韩精品免费观看视一区二区 | 1000精品久久久久久久久 | 久久国产主播| 久久久精品午夜少妇| 国产精品视频精品视频| 一区二区国产精品| 99精品福利视频| 欧美经典一区二区三区| 亚洲国产精品一区二区尤物区 | 欧美亚洲免费在线| 国产精品成人在线| 一区二区欧美视频| 一区二区三区四区国产| 欧美精品一区二区视频| 亚洲国产成人精品女人久久久 | 亚洲最新视频在线播放| 欧美高清视频www夜色资源网| 伊人蜜桃色噜噜激情综合| 欧美专区在线播放| 久久精品综合一区| 国产专区一区| 亚洲电影在线看| 母乳一区在线观看| 亚洲高清视频的网址| 亚洲日本成人网| 欧美电影免费| 亚洲区免费影片| 一本大道久久精品懂色aⅴ | 亚洲欧美视频一区| 欧美一区二区三区久久精品| 国产精品一区二区在线观看| 午夜精品网站| 久久香蕉国产线看观看av| 在线观看日韩www视频免费| 91久久精品日日躁夜夜躁国产| 欧美刺激性大交免费视频| 亚洲欧洲在线一区| 亚洲视频在线观看网站| 国产精品免费一区二区三区在线观看| 中文欧美日韩| 欧美一区激情| 在线播放中文字幕一区| 亚洲精品一区久久久久久| 欧美日韩精品免费在线观看视频| 99视频在线精品国自产拍免费观看 | 亚洲激情视频| 亚洲视频大全| 国产伦精品一区二区三区视频孕妇| 欧美亚洲视频在线观看| 麻豆亚洲精品| 日韩视频久久| 欧美一区二区三区四区在线观看| 国内外成人在线| 一区二区三区www| 国产精品日韩二区| 久久精品视频在线看| 欧美精品首页| 亚洲在线一区二区| 久久综合精品一区| 亚洲伦伦在线| 久久精品在这里| 亚洲精品一区二区三区婷婷月| 午夜精品福利一区二区三区av| 国内精品福利| 中文久久精品| 国产专区欧美专区| 一区二区高清视频| 国产欧美日韩亚洲精品| 亚洲欧洲美洲综合色网| 欧美日韩中文字幕| 欧美一级淫片播放口| 欧美区二区三区| 亚洲欧美综合网| 欧美激情一区二区久久久| 亚洲综合日韩| 欧美激情一区二区三区在线视频| 亚洲自拍另类| 欧美精品99| 欧美影院成年免费版| 欧美日韩二区三区| 欧美在线观看网址综合| 欧美日韩美女| 久久精品123| 国产精品久久久久久福利一牛影视 | 日韩亚洲欧美综合| 国产中文一区二区| 亚洲欧美国产不卡| 亚洲国产精选| 久久久久久电影| 一区二区高清视频| 欧美成人一区二区三区在线观看| 亚洲视频在线一区| 欧美国产精品久久| 午夜视频在线观看一区二区三区| 欧美日韩高清在线观看| 亚洲成人自拍视频| 国产精品欧美久久| 日韩午夜精品| 在线观看一区二区精品视频| 久久成人免费电影|