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