物聯(lián)網(wǎng)高手必備:網(wǎng)絡(luò)協(xié)議棧LwIP(一)
需求:
在物聯(lián)網(wǎng)設(shè)備中,TCP/IP網(wǎng)絡(luò)協(xié)議棧是一個非常重要的軟件組成部分,沒有TCP/IP網(wǎng)絡(luò)協(xié)議棧,物聯(lián)網(wǎng)設(shè)備就無法連接到互聯(lián)網(wǎng)中。TCP/IP網(wǎng)絡(luò)協(xié)議協(xié)議本身比較復(fù)雜。物聯(lián)網(wǎng)出現(xiàn)之前的TCP/IP實現(xiàn)代碼量都非常的龐大。但對于物聯(lián)網(wǎng)設(shè)備來說,內(nèi)存非常有限,處理器的性能也非常有限,這就需要一個輕量級的TCP/IP網(wǎng)絡(luò)協(xié)議棧來運行,使用非常小的內(nèi)存,把一些不必要的功能舍棄掉,保留主要的功能。由于這些需求,產(chǎn)生了幾種嵌入式的TCP/IP的協(xié)議棧,常見的有以下幾種:μC/ TCP-IP,LwIP,UIP。
常見的嵌入式TCP/IP協(xié)議棧
1. μC/ TCP-IP:
μC/ TCP-IP是Micrium公司自己的操作系統(tǒng)UC/OS的一個組件,同時支持IPv4和IPv6,支持BSD套接字API,具有最流行的套接字選項。這個協(xié)議棧是緊湊,可靠,高性能的TCP / IP協(xié)議棧,針對嵌入式系統(tǒng)進行了優(yōu)化。μC/ TCP-IP完全自主編碼,具有高質(zhì)量,可擴展性和可靠性,可快速配置所需的網(wǎng)絡(luò)選項,從而最大限度地縮短產(chǎn)品上市時間,MicriumμC/ TCP-IP嵌入式協(xié)議棧允許根據(jù)設(shè)計要求調(diào)整內(nèi)存占用。μC/ TCP-IP可以配置為僅包括系統(tǒng)所需的那些網(wǎng)絡(luò)組件。未使用組件時,它可以不包含在協(xié)議棧中,從而節(jié)省寶貴的內(nèi)存空間。
2. LwIp網(wǎng)絡(luò)協(xié)議棧:
LwIP是由瑞典科學研究院的Adam Dunkels開發(fā)的一套小型的TCP / IP協(xié)議組件,實現(xiàn)的主要目標是減少資源使用,同時仍然具有全面的TCP功能。這使得lwIP適用于具有10Kb字節(jié)空閑RAM的嵌入式系統(tǒng),并且可以容納大約40Kb的代碼ROM。從開始發(fā)展到現(xiàn)在LwIP被移植到多個嵌入式操作系統(tǒng),包括流行的FreeRTOS,還有阿里云的物聯(lián)網(wǎng)操作系統(tǒng)AliOS Things,華為的物聯(lián)網(wǎng)操作系統(tǒng)LiteOS等等。
3. uIP網(wǎng)絡(luò)協(xié)議棧:
uIP主要用于8位和16位微控制器的小型嵌入式網(wǎng)絡(luò)協(xié)議棧。最初,uIP 網(wǎng)絡(luò)協(xié)議棧由瑞典計算機科學院的Adam Dunkels 開發(fā),其源代碼由C 語言編寫,并完全開源。uIP協(xié)議棧最大的優(yōu)勢就是短小精悍,F(xiàn)lash和RAM需求小,去掉了完整的TCP/IP 中不常用的功能,簡化了通訊流程,但保留了網(wǎng)絡(luò)通信必須使用的協(xié)議,重點放在了IP/TCP/ICMP/UDP/ARP 這些網(wǎng)絡(luò)層和傳輸層協(xié)議上,保證了其代碼的通用性和結(jié)構(gòu)的穩(wěn)定性。
LwIP協(xié)議棧功能
- IP協(xié)議(Internet協(xié)議,支持IPv4和IPv6),并且支持多個網(wǎng)絡(luò)接口的數(shù)據(jù)包轉(zhuǎn)發(fā)。
- 支持ICMP(Internet控制消息協(xié)議),用于網(wǎng)絡(luò)維護和調(diào)試。
- 支持IGMP(因特網(wǎng)組管理協(xié)議),用于多播流量管理的。
- 支持 MLD(IPv6的多播偵聽器發(fā)現(xiàn))。參考RFC 2710標準,但不支持MLDv2。
- 支持IPv6的鄰居發(fā)現(xiàn)協(xié)議(ND)和無狀態(tài)地址自動配置。參考標準RFC4861(鄰居發(fā)現(xiàn))和RFC 4862(地址自動配置)。
- 支持 DHCP,AutoIP / APIPA(Zeroconf)和(無狀態(tài))DHCPv6。
- 支持UDP(用戶數(shù)據(jù)報協(xié)議),包括最新的UDP-lite擴展協(xié)議(差錯不敏感UDP)
- 支持包括擁塞控制,RTT估算和快速恢復(fù)和快速轉(zhuǎn)發(fā)的TCP協(xié)議。
- 提供性能較高的原始API,當用戶需要較高性能時候使用這個接口。
- 可選Berkeley-socket API,最通用網(wǎng)絡(luò)編程接口。
- 支持 TLS。
- PPPoS和PPPoE(串口/以太網(wǎng)上的點對點協(xié)議)。
- 支持DNS(域名解析器),包括mDNS(組播DNS)。
- 6LoWPAN,基于IPv6的IEEE 802.15.4,物理層是低功耗藍牙(BLE)或者ZigBee。
從這部分看,LwIP支持的功能是非常多的,除了傳統(tǒng)的TCPIP,還支持了很多最新的協(xié)議(如mDNS,UDP-lite,6LoWPAN等)
整體架構(gòu)
LwIP架構(gòu)
從上圖看到,IwIP按照TCP/IP的分層分為4層,分別是鏈路層,網(wǎng)絡(luò)層,傳輸層和應(yīng)用層。
協(xié)議棧的數(shù)據(jù)處理流程主要有以下三種:
- 每個層是一個獨立的進程,鏈路層是一個進程,IP層也是一個進程,傳輸層是一個進程,這樣設(shè)計的好處是每一層都非常清楚,代碼容易理解,調(diào)試也較方便。但這種處理的方法的缺點是當層和層之間傳遞數(shù)據(jù)的時候,需要進行上下文的切換和內(nèi)存拷貝。對于操作系統(tǒng)來說,進程之間的切換和內(nèi)存拷貝都需要耗費時間,當出現(xiàn)大量的報文進行傳輸?shù)臅r候,會導(dǎo)致頻繁的切換和內(nèi)存拷貝,從而轉(zhuǎn)發(fā)的效率較低。
- TCP IP協(xié)議棧在操作系統(tǒng)的內(nèi)核當中,應(yīng)用程序通過系統(tǒng)調(diào)用來和協(xié)議棧進行通訊,這種方式必須實現(xiàn)各個功能的系統(tǒng)調(diào)用,相對也比較復(fù)雜。
- 所有的TCP/IP協(xié)議的處理都在一個進程之中,每一層之間沒有明顯的界限,各層都可以訪問共享的內(nèi)存空間,因為各層都可以訪問共享內(nèi)存,就避免了每層之間的內(nèi)存拷貝帶來的性能損失,lwIP協(xié)議就是這種實現(xiàn),為的就是提高傳輸速度和資源利用率。
數(shù)據(jù)包的收發(fā)需要基于郵箱和信號量的支持,如果基于操作系統(tǒng),這些機制操作系統(tǒng)都可以提供,移植起來只需要把基于郵箱和信號的函數(shù)加以封裝即可,如果是沒有操作系統(tǒng)的裸機移植則需要使用中斷或者輪詢方式實現(xiàn)收發(fā)數(shù)據(jù),工作量相對要比沒有操作系統(tǒng)要大。
源碼架構(gòu)
LwIP協(xié)議棧主目錄
我們用最新的2.1 版本為例,LwIP的文件夾主要有三個,doc,src和test三個目錄。
Doc是存儲的幫助文檔,和之前的1.4版本的幫助文檔的文本文件不同,它使用了doxygen工具根據(jù)源代碼的注釋生成HTML格式的幫助文檔。src是LwIP的主要源代碼目錄,test目錄是測試腳本和一些測試協(xié)議棧的程序。
LwIP協(xié)議棧的src目錄
src目錄是協(xié)議棧的源碼目錄,包括api、 core、include、netif四個文件夾,其中core是協(xié)議棧的核心,include是頭文件目錄,netif提供了網(wǎng)絡(luò)接口層的驅(qū)動代碼,api目錄提供了socket、tcp、內(nèi)存管理的API接口。(未完待續(xù))