1. 程式人生 > 其它 >【lwip】01-簡介筆記

【lwip】01-簡介筆記

目錄

前言

本系列筆記主要記錄學習LWIP時的簡單筆記。
方便以後用到可以快速學習瞭解。

李柱明部落格:https://www.cnblogs.com/lizhuming/p/15487034.html

1.1 優缺點

LwIP 具有主要特性:

  1. 支援 ARP 協議(乙太網地址解析協議)。
  2. 支援 ICMP 協議(控制報文協議),用於網路的除錯與維護。
  3. 支援 IGMP 協議(網際網路組管理協議),可以實現多播資料的接收。
  4. 支援 UDP 協議(使用者資料報協議)。
  5. 支援 TCP 協議(傳輸控制協議),包括阻塞控制、RTT 估算、快速恢復和快速轉發。
  6. 支援 PPP 協議(點對點通訊協議),支援 PPPoE。
  7. 支援 DNS(域名解析)。
  8. 支援 DHCP 協議,動態分配 IP 地址。
  9. 支援 IP 協議,包括 IPv4、IPv6 協議,支援 IP 分片與重灌功能,多網路介面下的資料包轉發。
  10. 支援 SNMP 協議(簡單網路管理協議)。
  11. 支援 AUTOIP,自動 IP 地址配置。
  12. 提供專門的內部回撥介面(Raw API),用於提高應用程式效能。
  13. 提供可選擇的 Socket API、NETCONN API (在多執行緒情況下使用) 。

LwIP 在嵌入式中使用有以下優點:

  1. 資源開銷低,即輕量化。LwIP 核心有自己的記憶體管理策略和資料包管理策略, 使得核心處理資料包的效率很高。另外,LwIP 高度可剪裁,一切不需要的功能都可以通過巨集編譯選項去掉。 LwIP 的流暢執行需要 40KB 的程式碼 ROM 和幾十 KB 的 RAM,這讓它非常適合用在記憶體資源受限的嵌入式裝置中。
  2. 支援的協議較為完整。幾乎支援 TCP/IP 中所有常見的協議,這在嵌入式裝置中早已夠用。
  3. 實現了一些常見的應用程式:DHCP 客戶端、DNS 客戶端、HTTP 伺服器、MQTT 客戶端、TFTP 伺服器、SNTP 客戶端等等。
  4. 同時提供了三種程式設計介面:RAW API、NETCONN API(注:NETCONN API 即為 Sequential API)和 Socket API。這三種 API 的執行效率、易用性、可移植性以及時空間的開銷各不相同,使用者可以根據實際需要,平衡利弊,選擇合適的 API 進行網路應用程式的開發。
  5. 高度可移植。其原始碼全部用 C 實現,使用者可以很方便地實現跨處理器、跨編譯器的移植。 另外,它對核心中會使用到作業系統功能的地方進行了抽象,使用了一套自定義的 API, 使用者可以通過自己實現這些 API,從而實現跨作業系統的移植工作。
  6. 開源、免費,使用者可以不用承擔任何商業風險地使用它。
  7. 相比於嵌入式領域其它的 TCP/IP 協議棧,比如 uC-TCP/IP、FreeRTOS-TCP 等, LwIP 的發展歷史要更悠久一些,得到了更多的驗證和測試。LwIP 被廣泛用在嵌入式網路裝置中, 國內一些物聯網公司推出的物聯網作業系統,其 TCP/IP 核心就是 LwIP;物聯網知名的 WiFi 模組 ESP8266,其 TCP/IP 韌體,使用的就是 LwIP。

缺點:

  1. 相比於 Linux 和 Windows 系統自帶的 TCP/IP 協議棧,LwIP 的功能不算完整和強大。

1.2 檔案說明

1.2.1 獲取 lwip 原始碼檔案

LwIP 的專案主頁:http://savannah.nongnu.org/projects/lwip/

關注其:project homepage 和 download area 這兩個點即可:

  • project homepage:LwIP 的使用注意、 資料的拷貝、系統初始化流程、多執行緒中要注意的問題、優化方法、核心模組的分類介紹、 核心資料結構、核心重要全域性變數、核心原始碼檔案等。
  • download area:下載頁面。推薦:http://download-mirror.savannah.gnu.org/releases/lwip/

說明:contrib 包裡面裝的是移植和應用 LwIP 的一些 demo。

1.2.2 lwip 資料夾說明

1.2.2.1 總目錄

下載兩個包:lwip-2.1.2.zip(原始碼包)和 contrib-2.1.0.zip(contrib 包)

1.2.2.2 lwip 包

  • doc 是一些應用文件和移植 LwIP 的指南。(有點混亂,不建議參考)
  • src 是 LwIP 原始碼檔案。
  • test 是測試 LwIP 核心效能的原始碼,將它們和 LwIP 原始碼加入到工程中一起編譯,呼叫它們提供的函式,可以獲得許多與 LwIP 核心效能有關的指標。
  • CHANGELOG 版本升級記錄。
  • COPYING LwIP 這個開源軟體的 license。
  • FILES 介紹當前目錄下的目錄資訊。
  • README LwIP 的一個簡單的介紹。
  • UPGRADING 記錄了 LwIP 每個大版本的更新,會對使用者使用和移植 LwIP 造成的影響。

1.2.2.3 lwip\src 核心原始碼

  • api 資料夾裡面裝的是 NETCONN API 和 Socket API 相關的原始檔,只有在作業系統的環境中,才能被編譯。
  • apps 資料夾裡面裝的是應用程式的原始檔,包括常見的應用程式,如 httpd、mqtt、tftp、sntp、snmp 等。
  • core 資料夾裡面是 LwIP 的核心原始檔。
  • include 資料夾裡面是 LwIP 所有模組對應的標頭檔案。
  • netif 資料夾裡面是與網絡卡移植有關的檔案,這些檔案為我們移植網絡卡提供了模板,我們可以直接使用。

LwIP 核心是由一系列模組組合而成的,這些模組包括:

  • TCP/IP 協議棧的各種協議
  • 記憶體管理模組;
  • 資料包管理模組;
  • 網絡卡管理模組;
  • 網絡卡介面模組;
  • 基礎功能類模組;
  • API 模組。

每個模組是由相關的幾個原始檔和標頭檔案組成的,通過標頭檔案對外宣告一些函式、巨集、資料型別,使得其它模組可以方便地呼叫此模組的功能。而構成每個模組的標頭檔案都被組織在了 include 目錄中,而原始檔則根據型別被分散地組織在 api、apps、core、netif 目錄中。

部分檔案說明:

  • def.c 檔案定義了一些基礎類函式,比如主機序和網路序的轉換、字串的查詢和比較、整數轉換成字串等,這些函式會被 LwIP 核心的很多模組所呼叫。所以會常看到 #include “def.h”

  • init.c 檔案對 LwIP 的使用者巨集配置進行了檢查,會將配置錯誤和不合理的地方,通過編譯器的 #error & #warning 功能表示出來。另外,init.c 定義了 lwip_init(); 初始化函式,這個函式會依次對 LwIP 的各個模組進行初始化。

  • mem.c 檔案實現了動態記憶體池管理機制,各模組可以靈活地申請和釋放記憶體。

  • memp.c 檔案實現了靜態記憶體堆管理機制,各模組可以快速地申請和釋放記憶體。

  • netif.c 檔案實現了網絡卡的操作,比如註冊/刪除網絡卡、使能/禁能網絡卡、設定網絡卡 IP 地址等等。netif.c 與 include 目錄中的 netif.h 檔案共同構成了 LwIP 的 netif 模組。

  • pbuf.c 檔案實現了 LwIP 對網路資料包的各種操作。網路資料包在 LwIP 核心中以 pbuf 結構體的形式存在,這提高了 LwIP 核心對資料包處理效率,以及提高了資料包在各層之間遞交的效率。pbuf 結構體也是我們使用 RAW/Callback API 進行網路應用程式開發的關鍵。

  • raw.c 檔案實現了一個傳輸層協議的框架,我們可以在它的基礎上修改和新增程式碼,實現自定義的傳輸層協議,與 UDP/TCP 一樣,它可以與 IP 層直接進行互動。這類似 RAW Socket。在實際的應用中,我們常用 UDP 和 TCP 作為傳輸層協議。但有時,底層網路開發人員會嫌 UDP 的可靠性太差,或者 TCP 雖然可靠性強,但是很耗費時間和記憶體,他們需要根據實際需求,平衡利弊,定義自己的傳輸層協議。LwIP 的 raw 模組可以滿足這個需求。

  • stat.c 檔案實現了 LwIP 核心的統計功能,使使用者可以實時地檢視 LwIP 核心對網路資料包的處理情況。

  • timeouts.c 定義了 LwIP 核心的超時處理機制。LwIP 核心中多個模組的實現需要藉助超時處理機制,包括 ARP 表項的時間統計、IP 分片報文的重灌、TCP 的各種定時器、實現各種應用層協議需要的超時處理。

1.2.2.4 lwip 官方說明文件

LwIP 官方說明文件:http://www.nongnu.org/lwip/2_1_x/index.html

陷阱章節-Common pitfalls:

  • 裡面提到有無作業系統相關注意點:Mainloop Mode(主函式輪詢模式)與 OS Mode(作業系統模式)。

1.2.3 contrib 資料夾說明

就是 demo 資料夾。後面開發可參考。

資料

參考: