適合於物聯網的TCP/IP協議棧(LwIP)

LwIP:是瑞典計算機科學院(SICS)的Adam Dunkels 開發的一個小型開源的TCP/IP協議棧。實現的重點是在保持TCP協議主要功能的基礎上減少對RAM 的佔用。

uIP:超小型的TCP/IP協議棧

爲什麼不用Linux上的TCP/IP協議棧?

因爲代碼太龐大,而且Linux上的網絡管理功能豐富,有很多功能在物聯網設備上是不需要的,如HTTP,因爲不需要WEB服務。

Linux的TCP/IP協議棧的很多協議都可以去掉,然後留下下面協議,基本上可以滿足物聯網設備。

  • IP協議
  • TCP協議
  • UDP協議
  • ARP協議
  • ICMP協議

LwIP簡介

LwIP是Light Weight (輕型)IP協議,有無操作系統的支持都可以運行。LwIP實現的重點是在保持TCP協議主要功能的基礎上減少對RAM 的佔用,它只需十幾KB的RAM和40K左右的ROM就可以運行,這使LwIP協議棧適合在低端的嵌入式系統中使用。 [1] 

lwIP協議棧主要關注的是怎麼樣減少內存的使用和代碼的大小,這樣就可以讓lwIP適用於資源有限的小型平臺例如嵌入式系統。爲了簡化處理過程和內存要求,lwIP對API進行了裁減,可以不需要複製一些數據。

lwip提供三種API:1)RAW API 2)lwip API 3)BSD API。

RAW API把協議棧和應用程序放到一個進程裏邊,該接口基於函數回調技術,使用該接口的應用程序可以不用進行連續操作。不過,這會使應用程序編寫難度加大且代 碼不易被理解。爲了接收數據,應用程序會向協議棧註冊一個回調函數。該回調函數與特定的連接相關聯,當該關聯的連接到達一個信息包,該回調函數就會被協議 棧調用。這既有優點也有缺點。優點是既然應用程序和TCP/IP協議棧駐留在同一個進程中,那麼發送和接收數據就不再產生進程切換。主要缺點是應用程序不 能使自己陷入長期的連續運算中,這樣會導致通訊性能下降,原因是TCP/IP處理與連續運算是不能並行發生的。這個缺點可以通過把應用程序分爲兩部分來克 服,一部分處理通訊,一部分處理運算。

lwip API把接收與處理放在一個線程裏面。這樣只要處理流程稍微被延遲,接收就會被阻塞,直接造成頻繁丟包、響應不及時等嚴重問題。因此,接收與協議處理必須 分開。LwIP的作者顯然已經考慮到了這一點,他爲我們提供了 tcpip_input() 函數來處理這個問題, 雖然他並沒有在 rawapi 一文中說明。 講到這裏,讀者應該知道tcpip_input()函數投遞的消息從哪裏來的答案了吧,沒錯,它們來自於由底層網絡驅動組成的接收線程。我們在編寫網絡驅動時, 其接收部分以任務的形式創建。 數據包到達後, 去掉以太網包頭得到IP包, 然後直接調用tcpip_input()函數將其 投遞到mbox郵箱。投遞結束,接收任務繼續下一個數據包的接收,而被投遞得IP包將由TCPIP線程繼續處理。這樣,即使某個IP包的處理時間過長也不 會造成頻繁丟包現象的發生。這就是lwip API。

BSD API提供了基於open-read-write-close模型的UNIX標準API,它的最大特點是使應用程序移植到其它系統時比較容易,但用在嵌入式系統中效率比較低,佔用資源多。這對於我們的嵌入式應用有時是不能容忍的

 

LwIP簡單架構

網絡編程接口RAW IP和socket該怎麼選擇

  RAW API Netconn/Socket API
是否需要操作系統 不需要 需要
控制基於 PCB Socket
接口調用方式 回調 接近windows或Linux 的API
結構 核心API 高等級API
應用

降低內存設備

沒有操作系統應用程序

開發者擁有更多的控制權

更高的存儲設備

移植來自linux/windows的協議或應用程序

複雜度
內存

常用的是基於Socket APIS

那我用什麼操作系統好呢?

常見的物聯網設備操作系統介紹

  • vxWork
  • uC/OS-III和uC/OS-II
  • uCLinux
  • RT-thread
  • Huwei LiteOs
  • Alios Things
  • FreeRTOS

般會選擇FreeRTOS,開源而且簡單。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章