當(dāng)前位置:首頁 > 物聯(lián)網(wǎng) > 網(wǎng)絡(luò)協(xié)議
[導(dǎo)讀]   1、LWIP的結(jié)構(gòu)   lwip是瑞典計(jì)算機(jī)科學(xué)院(SICS)的Adam Dunkels 開發(fā)的一個(gè)小型開源的TCP/IP協(xié)議棧。實(shí)現(xiàn)的重點(diǎn)是在保持TCP協(xié)議主要功能的基礎(chǔ)上減少對(duì)R

  1、LWIP的結(jié)構(gòu)

  lwip是瑞典計(jì)算機(jī)科學(xué)院(SICS)的Adam Dunkels 開發(fā)的一個(gè)小型開源的TCP/IP協(xié)議棧。實(shí)現(xiàn)的重點(diǎn)是在保持TCP協(xié)議主要功能的基礎(chǔ)上減少對(duì)RAM 的占用。

  LWIP(Light weight internet protocol)的主要模塊包括:配置模塊、初始化模塊、NeTIf模塊、mem(memp)模塊、netarp模塊、ip模塊、udp模塊、icmp 模塊、igmp模塊、dhcp模塊、tcp模塊、snmp模塊等。下面主要對(duì)我們需要關(guān)心的協(xié)議處理進(jìn)行說明和梳理。

  配置模塊:

  配置模塊通過各種宏定義的方式對(duì)系統(tǒng)、子模塊進(jìn)行了配置。比如,通過宏,配置了mem管理模塊的參數(shù)。該配置模塊還通過宏,配置了協(xié)議棧所支持的協(xié)議簇,通過宏定制的方式,決定了支持那些協(xié)議。主要的文件是opt.h。

  初始化模塊:

  初始化模塊入口的文件為tcpip.c,其初始化入口函數(shù)為: void tcpip_init(void (* initfunc)(void *), void *arg)

  該入口通過調(diào)用lwip_init()函數(shù),初始化了所有的子模塊,并啟動(dòng)了協(xié)議棧管理進(jìn)程。同時(shí),該函數(shù)還帶有回調(diào)鉤子及其參數(shù)??梢栽谛枰牡胤竭M(jìn)行調(diào)用。

  協(xié)議棧數(shù)據(jù)分發(fā)管理進(jìn)程負(fù)責(zé)了輸入報(bào)文的處理、超時(shí)處理、API函數(shù)以及回調(diào)的處理,原型如下:

  staTIc void tcpip_thread(void *arg)

  NeTIf模塊:

  NeTIf模塊為協(xié)議棧與底層驅(qū)動(dòng)的接口模塊,其將底層的一個(gè)網(wǎng)口設(shè)備描述成協(xié)議棧的一個(gè)接口設(shè)備(net interface)。該模塊的主要文件為netif.c。其通過鏈表的方式描述了系統(tǒng)中的所有網(wǎng)口設(shè)備。

  Netif的數(shù)據(jù)結(jié)構(gòu)描述了網(wǎng)口的參數(shù),包括IP地址、MAC地址、link狀態(tài)、網(wǎng)口號(hào)、收發(fā)函數(shù)等等參數(shù)。一個(gè)網(wǎng)口設(shè)備的數(shù)據(jù)收發(fā)主要通過該結(jié)構(gòu)進(jìn)行。

  Mem(memp)模塊:

  Mem模塊同一管理了協(xié)議棧使用的內(nèi)容緩沖區(qū),并管理pbuf結(jié)構(gòu)以及報(bào)文的字段處理。主要的文件包括mem.c、memp.c、pbuf.c。

  netarp模塊:

  netarp模塊是處理arp協(xié)議的模塊,主要源文件為etharp.c。其主要入口函數(shù)為: err_t ethernet_input(struct pbuf *p, struct netif *netif)

  該入口函數(shù)通過判斷輸入報(bào)文p的協(xié)議類型來決定是按照arp協(xié)議進(jìn)行處理還是將該報(bào)文提交到IP協(xié)議。如果報(bào)文是arp報(bào)文,該接口則調(diào)用etharp_arp_input,進(jìn)行arp請(qǐng)求處理。

  如果是ip報(bào)文,該接口就調(diào)用etharp_ip_input進(jìn)行arp更新,并調(diào)用ip_input接口,將報(bào)文提交給ip層。

  在該模塊中,創(chuàng)建了設(shè)備的地址映射arp表,并提供地址映射關(guān)系查詢接口。同時(shí)還提供了arp報(bào)文的發(fā)送接口。如下

  err_t etharp_output(struct netif *netif, struct pbuf *q, struct ip_addr *ipaddr)

  該接口需要注冊(cè)到netif的output字段,ip層在輸出報(bào)文時(shí),通過該接口獲取目標(biāo)機(jī)的MAC地址,組合最終報(bào)文后,由該接口調(diào)用底層設(shè)備的驅(qū)動(dòng)接口發(fā)送數(shù)據(jù)。

  在etharp_output接口中,判斷報(bào)文類型,如果是廣播包或者組播包,就調(diào)用etharp_send_ip(組裝目標(biāo)mac和源mac)接口,etharp_send_ip調(diào)用netif結(jié)構(gòu)中的設(shè)備驅(qū)動(dòng)注冊(cè)的linkoutput鉤子函數(shù)發(fā)送最終報(bào)文。如果是單播包,etharp_output接口就調(diào)用etharp_query進(jìn)行ip地址和MAC地址的映射,來獲取到目標(biāo)機(jī)的MAC地址。并在etharp_query中調(diào)用etharp_send_ip來發(fā)送最終組合報(bào)文。

  ip模塊:

  ip模塊實(shí)現(xiàn)了協(xié)議的ip層處理,主要文件為ip.c。其主要入口函數(shù)為: err_t ip_input(struct pbuf *p, struct netif *inp)

  該接口通過判斷輸入報(bào)文的協(xié)議類型,將其輸入到相應(yīng)的上層協(xié)議模塊中去。比如,將udp報(bào)文送到udp_input。

  該模塊另外一個(gè)接口是輸入函數(shù),原型如下:

  err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t

  tos, u8_t proto)

  該接口通過路由表或者傳輸ip后,調(diào)用netif的output字段函數(shù)鉤子發(fā)送報(bào)文。

  udp模塊:

  udp模塊實(shí)現(xiàn)了udp協(xié)議層的協(xié)議處理,主要文件為udp.c。該模塊通過PCB控制塊將應(yīng)用端口跟應(yīng)用程序做了綁定。在接收到新報(bào)文時(shí),分析其對(duì)應(yīng)的PCB,找到對(duì)應(yīng)的處理鉤子,進(jìn)行應(yīng)用的處理。主要入口函數(shù)為:

  void udp_input(struct pbuf *p, struct netif *inp) 該模塊負(fù)責(zé)輸出的接口如下:

  err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)

  該模塊負(fù)責(zé)將一個(gè)PCB跟一個(gè)本地端口進(jìn)行綁定的接口如下:

  err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) 該模塊負(fù)責(zé)將一個(gè)PCB跟一個(gè)遠(yuǎn)端端口綁定的接口如下:

  err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

  igmp模塊:

  igmp模塊負(fù)責(zé)分組管理。其主要的接口函數(shù)如下:

  void igmp_input(struct pbuf *p, struct netif *inp, struct ip_addr *dest) 該接口負(fù)責(zé)IGMP協(xié)議報(bào)文的處理,比如分析當(dāng)前報(bào)文是請(qǐng)求還是應(yīng)答。 err_t igmp_joingroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) 該接口將一個(gè)網(wǎng)口加入一個(gè)組。

  err_t igmp_leavegroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) 該接口將一個(gè)網(wǎng)口從一個(gè)組中移出。

  dhcp模塊:

  dhcp模塊用于獲取設(shè)備ip地址的相關(guān)信息。其處理入口主要有這么幾個(gè):dpch的啟動(dòng)、dpch的接收?qǐng)?bào)文處理以及定時(shí)器模塊的處理。

  主要的接口原型如下:

  err_t dhcp_start(struct netif *netif)

  該接口用于設(shè)備啟動(dòng)dhcp模塊,主要是客戶端的功能。該模塊實(shí)現(xiàn)設(shè)備dhcp描述結(jié)構(gòu)生成,并將dhcp的端口綁定到udp協(xié)議中,以及將本dhcp模塊跟遠(yuǎn)端服務(wù)器端口進(jìn)行綁定。最后啟動(dòng)dhcp申請(qǐng)。

  static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)

  該接口為一個(gè)注冊(cè)接口,用于dhcp報(bào)文接收。在start dhcp時(shí),該接口通過dhcp的udp pcb注冊(cè)到udp協(xié)議層。Udp進(jìn)行報(bào)文處理后,根據(jù)端口調(diào)用該注冊(cè)接口。該接口中,實(shí)現(xiàn)dhcp報(bào)文的協(xié)議處理。

  Void dhcp_fine_tmr() Void dhcp_coarse_tmr()

  這兩個(gè)函數(shù)接口實(shí)現(xiàn)了dhcp的相關(guān)超時(shí)處理監(jiān)控。上面一個(gè)用于請(qǐng)求應(yīng)答超時(shí)處理。下面一個(gè)用于地址租用情況的到期處理。

  從源碼分析看,上述的接口在應(yīng)用lwip的協(xié)議棧時(shí),需要重點(diǎn)關(guān)注。對(duì)于小內(nèi)存應(yīng)用的場(chǎng)合,該協(xié)議棧的內(nèi)存管理以及pbuf應(yīng)用部分需要自行改寫。

  2、lwip特征

 ?。?)支持多網(wǎng)絡(luò)接口下的IP轉(zhuǎn)發(fā);

  (2)支持ICMP協(xié)議;

 ?。?)包括實(shí)驗(yàn)性擴(kuò)展的UDP(用戶數(shù)據(jù)報(bào)協(xié)議);

 ?。?)包括阻塞控制、RTT 估算、快速恢復(fù)和快速轉(zhuǎn)發(fā)的TCP(傳輸控制協(xié)議);

 ?。?)提供專門的內(nèi)部回調(diào)接口(Raw API),用于提高應(yīng)用程序性能;

 ?。?)可選擇的Berkeley接口API (在多線程情況下使用) 。

  (7)在最新的版本中支持ppp

 ?。?) 新版本中增加了的IP fragment的支持。

 ?。?) 支持DHCP協(xié)議,動(dòng)態(tài)分配ip地址.

  3、LWIP的協(xié)議流程

  下面這張圖比較清楚的描述了lwip的報(bào)文處理流程,呵呵,借用一下。不過,其對(duì)netif-》output描述不夠。從代碼看,該output實(shí)際是arp層的輸出,最后通過arp層調(diào)用netif中的底層輸出接口發(fā)送報(bào)文。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉