【lwip】01-簡介筆記
前言
本系列筆記主要記錄學習LWIP時的簡單筆記。
方便以後用到可以快速學習瞭解。
李柱明部落格:https://www.cnblogs.com/lizhuming/p/15487034.html
1.1 優缺點
LwIP 具有主要特性:
- 支援 ARP 協議(乙太網地址解析協議)。
- 支援 ICMP 協議(控制報文協議),用於網路的除錯與維護。
- 支援 IGMP 協議(網際網路組管理協議),可以實現多播資料的接收。
- 支援 UDP 協議(使用者資料報協議)。
- 支援 TCP 協議(傳輸控制協議),包括阻塞控制、RTT 估算、快速恢復和快速轉發。
- 支援 PPP 協議(點對點通訊協議),支援 PPPoE。
- 支援 DNS(域名解析)。
- 支援 DHCP 協議,動態分配 IP 地址。
- 支援 IP 協議,包括 IPv4、IPv6 協議,支援 IP 分片與重灌功能,多網路介面下的資料包轉發。
- 支援 SNMP 協議(簡單網路管理協議)。
- 支援 AUTOIP,自動 IP 地址配置。
- 提供專門的內部回撥介面(Raw API),用於提高應用程式效能。
- 提供可選擇的 Socket API、NETCONN API (在多執行緒情況下使用) 。
LwIP 在嵌入式中使用有以下優點:
- 資源開銷低,即輕量化。LwIP 核心有自己的記憶體管理策略和資料包管理策略, 使得核心處理資料包的效率很高。另外,LwIP 高度可剪裁,一切不需要的功能都可以通過巨集編譯選項去掉。 LwIP 的流暢執行需要 40KB 的程式碼 ROM 和幾十 KB 的 RAM,這讓它非常適合用在記憶體資源受限的嵌入式裝置中。
- 支援的協議較為完整。幾乎支援 TCP/IP 中所有常見的協議,這在嵌入式裝置中早已夠用。
- 實現了一些常見的應用程式:DHCP 客戶端、DNS 客戶端、HTTP 伺服器、MQTT 客戶端、TFTP 伺服器、SNTP 客戶端等等。
- 同時提供了三種程式設計介面:RAW API、NETCONN API(注:NETCONN API 即為 Sequential API)和 Socket API。這三種 API 的執行效率、易用性、可移植性以及時空間的開銷各不相同,使用者可以根據實際需要,平衡利弊,選擇合適的 API 進行網路應用程式的開發。
- 高度可移植。其原始碼全部用 C 實現,使用者可以很方便地實現跨處理器、跨編譯器的移植。 另外,它對核心中會使用到作業系統功能的地方進行了抽象,使用了一套自定義的 API, 使用者可以通過自己實現這些 API,從而實現跨作業系統的移植工作。
- 開源、免費,使用者可以不用承擔任何商業風險地使用它。
- 相比於嵌入式領域其它的 TCP/IP 協議棧,比如 uC-TCP/IP、FreeRTOS-TCP 等, LwIP 的發展歷史要更悠久一些,得到了更多的驗證和測試。LwIP 被廣泛用在嵌入式網路裝置中, 國內一些物聯網公司推出的物聯網作業系統,其 TCP/IP 核心就是 LwIP;物聯網知名的 WiFi 模組 ESP8266,其 TCP/IP 韌體,使用的就是 LwIP。
缺點:
- 相比於 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 資料夾。後面開發可參考。
資料
參考: