淺談uIP中UDP協(xié)議改進(jìn)方案
出處:維庫(kù)電子市場(chǎng)網(wǎng) 發(fā)布于:2023-06-25 11:18:13
UDP協(xié)議的全稱是用戶數(shù)據(jù)包協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理,數(shù)據(jù)包。在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層。UDP有不提供數(shù)據(jù)包分組、組裝和不能對(duì)數(shù)據(jù)包進(jìn)行排序的缺點(diǎn),也就是說,當(dāng)報(bào)文發(fā)送之后,是無(wú)法得知其是否安全完整到達(dá)的。UDP用來支持那些需要在計(jì)算機(jī)之間傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用。包括網(wǎng)絡(luò)視頻會(huì)議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都需要使用UDP協(xié)議。UDP協(xié)議從問世至今已經(jīng)被使用了很多年,雖然其初的光彩已經(jīng)被一些類似協(xié)議所掩蓋,但是即使是在今天,UDP仍然不失為一項(xiàng)非常實(shí)用和可行的網(wǎng)絡(luò)傳輸層協(xié)議。
由于嵌入式系統(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é)議棧,運(yùn)行時(shí)需要的內(nèi)存很少,實(shí)現(xiàn)了常用的TCP/IP協(xié)議;代碼注釋詳盡,可以用于商業(yè)或非商業(yè)用途。由于具有上述特點(diǎn),uIP被廣泛應(yīng)用在嵌入式系統(tǒng)的網(wǎng)絡(luò)互聯(lián)中。
1 uIP協(xié)議棧的體系結(jié)構(gòu)
uIP協(xié)議棧往掉了完整的TCP/IP中不常用的功能,簡(jiǎn)化了通訊流程,但保存了網(wǎng)絡(luò)通訊必須使用的協(xié)議,設(shè)計(jì)重點(diǎn)放在了IP/TCP/ICMP/UDP/ARP這些網(wǎng)絡(luò)層和傳輸層協(xié)議上,保證了其代碼的通用性和結(jié)構(gòu)的穩(wěn)定性。
由于uIP協(xié)議棧專門為嵌進(jìn)式系統(tǒng)而設(shè)計(jì),因此還具有如下優(yōu)越功能:
(1) 代碼非常少,其協(xié)議棧代碼不到6K,很方便閱讀和移植。
(2) 占用的內(nèi)存數(shù)非常少,RAM占用僅幾百字節(jié)。
(3) 其硬件處理層、協(xié)議棧層和應(yīng)用層共用一個(gè)全局緩存區(qū),不存在數(shù)據(jù)的拷貝,且發(fā)送和接收都是依靠這個(gè)緩存區(qū),極大的節(jié)省空間和時(shí)間。
(4) 支持多個(gè)主動(dòng)連接和被動(dòng)連接并發(fā)。
(5) 其源代碼中提供一套實(shí)例程序:web服務(wù)器,web客戶端,電子郵件發(fā)送程序(SMTP客戶端),Telnet服務(wù)器, DNS主機(jī)名解析程序等。通用性強(qiáng),移植起來基本不用修改就可以通過。
(6) 對(duì)數(shù)據(jù)的處理采用輪循機(jī)制,不需要操縱系統(tǒng)的支持。
由于uIP對(duì)資源的需求少和移植輕易,大部分的8位微控制器都使用過uIP協(xié)議棧, 而且很多的著名的嵌進(jìn)式產(chǎn)品和項(xiàng)目(如衛(wèi)星,Cisco路由器,無(wú)線傳感器網(wǎng)絡(luò))中都在使用uIP協(xié)議棧。
在使用uIP的嵌入式系統(tǒng)的軟件體系結(jié)構(gòu)中,uIP協(xié)議棧相當(dāng)于一個(gè)代碼庫(kù),它通過一系列的函數(shù)實(shí)現(xiàn)與底層硬件和上層應(yīng)用程序的通信。
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)。然后uIP的主控部分調(diào)用uip_input()函數(shù),該函數(shù)將會(huì)根據(jù)數(shù)據(jù)包首部的協(xié)議標(biāo)識(shí)處理這個(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連接都會(huì)調(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)。用戶需要把對(duì)網(wǎng)絡(luò)數(shù)據(jù)包的處理函數(shù)作為接口提供給uIP,并將這個(gè)函數(shù)定義為宏UIP_APPCALL()或者UIP_UDP_APPCALL()。UIP_APPCALL()是用戶對(duì)TCP數(shù)據(jù)包的處理,UIP_UDP_APPCALL()是用戶對(duì)UDP數(shù)據(jù)包的處理[4]。這樣,uIP在接收到底層傳來的數(shù)據(jù)包后,在需要送到上層應(yīng)用程序處理的地方,直接調(diào)用UIP_APPCALL()或者UIP_UDP_APPCALL()即可,無(wú)需修改uIP。
2 uIP的UDP協(xié)議分析
2.1 UDP協(xié)議的實(shí)現(xiàn)
當(dāng)uIP接收到一個(gè)UDP數(shù)據(jù)包后,首先從包頭中取出數(shù)據(jù)的長(zhǎng)度,然后重新對(duì)包進(jìn)行校驗(yàn),如果校驗(yàn)和不對(duì),則直接丟掉這個(gè)包。如果校驗(yàn)無(wú)誤,則對(duì)收到的包進(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)中,如果以上判斷語(yǔ)句為真,則對(duì)接收到的數(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)的不足
通過對(duì)uIP中UDP協(xié)議實(shí)現(xiàn)過程的分析可以發(fā)現(xiàn),uIP沒有提供初始化指定端口的函數(shù),僅提供了一個(gè)對(duì)給定IP地址上給定端口建立UDP連接的函數(shù),其原型是struct uip_udp_conn*uip_udp_new(uip_ipaddr_t*ripaddr,u16_t rport)。
3 uIP中UDP協(xié)議的改進(jìn)
3.1 增加初始化UDP服務(wù)端口
UDP協(xié)議使用端口號(hào)為不同的應(yīng)用保留其各自的數(shù)據(jù)傳輸通道。UDP和TCP協(xié)議正是采用這一機(jī)制實(shí)現(xiàn)對(duì)同一時(shí)刻內(nèi)多項(xiàng)應(yīng)用同時(shí)發(fā)送和接收數(shù)據(jù)的支持。數(shù)據(jù)發(fā)送一方(可以是客戶端或服務(wù)器端)將UDP數(shù)據(jù)報(bào)通過源端口發(fā)送出去,而數(shù)據(jù)接收一方則通過目標(biāo)端口接收數(shù)據(jù)。有的網(wǎng)絡(luò)應(yīng)用只能使用預(yù)先為其預(yù)留或注冊(cè)的靜態(tài)端口;而另外一些網(wǎng)絡(luò)應(yīng)用則可以使用未被注冊(cè)的動(dòng)態(tài)端口。因?yàn)閁DP報(bào)頭使用兩個(gè)字節(jié)存放端口號(hào),所以端口號(hào)的有效范圍是從0到65535。一般來說,大于49151的端口號(hào)都代表動(dòng)態(tài)端口。
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è)置本地端口號(hào)一項(xiàng)。
3.2 IP地址、端口號(hào)的判斷及匹配
uip_process函數(shù)接收到網(wǎng)絡(luò)控制芯片驅(qū)動(dòng)程序送來的數(shù)據(jù)包后,當(dāng)判斷出收到的包是UDP包,執(zhí)行2.1中的判斷并且得到結(jié)果為真后,但還需要再做以下工作:如果uip_udp_conn中的目的端口號(hào)為0,因此要把uip_udp_conn中的目的端口號(hào)設(shè)為收到的包中的源端口號(hào),把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è)客戶端的請(qǐng)求提供服務(wù),而UDP本身是一種無(wú)連接的傳輸層協(xié)議,因此在每次uIP作為服務(wù)端的UDP通信結(jié)束之后,還要釋放uip_udp_conn中記錄的目的端口號(hào),以便下次接收來自不同IP、不同端口的新請(qǐng)求,否則當(dāng)來自其他端口的請(qǐng)求到達(dá)時(shí),uIP會(huì)不予響應(yīng)。
在uIP的網(wǎng)站上到uIP 1.0的源代碼之后,按照本文給出的幾個(gè)步驟對(duì)uIP 1.0進(jìn)行改造之后,利用gcc編譯器把uIP 1.0編譯成S3C2410上的可執(zhí)行代碼,把基于S3C2410的開發(fā)板作為UDP服務(wù)器,運(yùn)行在S3C2410上的uIP可以對(duì)PC通過UDP協(xié)議發(fā)出的數(shù)據(jù)進(jìn)行處理,并給PC作出正確的回復(fù)。UDP協(xié)議使用報(bào)頭中的校驗(yàn)值來保證數(shù)據(jù)的安全。校驗(yàn)值首先在數(shù)據(jù)發(fā)送方通過特殊的算法計(jì)算得出,在傳遞到接收方之后,還需要再重新計(jì)算。如果某個(gè)數(shù)據(jù)報(bào)在傳輸過程中被第三方篡改或者由于線路噪音等原因受到損壞,發(fā)送和接收方的校驗(yàn)計(jì)算值將不會(huì)相符,由此UDP協(xié)議可以檢測(cè)是否出錯(cuò)。這與TCP協(xié)議是不同的,后者要求必須具有校驗(yàn)值。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 工業(yè)5G技術(shù)在智能制造中的應(yīng)用與實(shí)踐解析2025/12/31 10:57:21
- 工業(yè)以太網(wǎng)交換機(jī)選型與現(xiàn)場(chǎng)應(yīng)用技術(shù)指南2025/12/18 10:48:14
- 無(wú)線傳輸電路基礎(chǔ),射頻前端設(shè)計(jì)、天線匹配與鏈路預(yù)算計(jì)算2025/10/27 13:55:50
- ASK 解調(diào)的核心要點(diǎn)與實(shí)現(xiàn)方式2025/9/5 16:46:17
- 雙偶極子天線:結(jié)構(gòu)、特性與應(yīng)用全解析2025/9/3 10:29:21
- 高速PCB信號(hào)完整性(SI)設(shè)計(jì)核心實(shí)操規(guī)范
- 鎖相環(huán)(PLL)中的環(huán)路濾波器:參數(shù)計(jì)算與穩(wěn)定性分析
- MOSFET反向恢復(fù)特性對(duì)系統(tǒng)的影響
- 電源IC在惡劣環(huán)境中的防護(hù)設(shè)計(jì)
- 連接器耐腐蝕性能測(cè)試方法
- PCB電磁兼容(EMC)設(shè)計(jì)與干擾抑制核心實(shí)操規(guī)范
- 用于相位噪聲測(cè)量的低通濾波器設(shè)計(jì)與本振凈化技術(shù)
- MOSFET在高頻開關(guān)中的EMI問題
- 電源IC在便攜式設(shè)備中的設(shè)計(jì)要點(diǎn)
- 連接器結(jié)構(gòu)設(shè)計(jì)常見問題分析









