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