圖解LwIP協議棧運作機制

引言

最近研究了一下FreeRTOS下LwIP協議棧的工作機制,分析報文的發送/接收數據流,以掌握協議棧的整體工作機制,從系統層面去了解該協議棧。所以,這裡覆蓋LwIP協議棧的大體工作流程,並圍繞協議棧,分析與其關聯的上下游部分。

此次研究的軟硬件相關信息如下:

軟件平臺:FreeRTOS + LwIP +WLAN驅動 ;

硬件平臺:ST MCU + WLAN模塊,二者通過SDIO總線通訊。

LwIP是什麼

先來了解一下LwIP。

LwIP,英文全稱Light Weight IP protocol,是由瑞典計算機科學院(SICS)的Adam Dunkels開發的一個輕量級的開源的TCP/IP協議棧,其重點是在保證TCP/IP協議棧的主要功能的基礎上,減少對存儲空間資源的需求,一般只需要幾十KB的RAM和40KB的ROM空間。它不依賴於操作系統,非常適合應用在低端的嵌入式領域。

LwIP實現的是TCP/IP協議棧,該協議棧想必各位看官都有所瞭解,為了保持文章的完整性,還是在這裡簡單的描述一下。

TCP/IP協議棧分為四層,從上到下分別為應用層,傳輸層,網絡層以及為設備間的應用程序通訊提供通路先看下圖,以我們使用最頻繁的,瀏覽網頁使用的HTTP應用為例:

TCP/IP四層網絡模型

發送報文的時候,每一層最主要的工作就是將上一層傳遞過來的數據和本層的頭部封裝起來,然後將攜帶本層頭部的數據傳遞給下一層繼續處理;

接收報文的時候則反之,每一層從下一層傳遞的數據裡剝離出本層的頭部,並將剩餘的數據傳遞給上一層處理。

當然每一層還有其他很多輔助的工作,如區分報文類型進行不同的處理,提取IP信息並存儲,分片報文處理,端口號匹配,各IETF RFC標準的處理等等,這裡主要目的是闡述LwIP的整體工作機制,就不一一詳述了。

LwIP如何工作起來

啥也不說,先上圖:

LwIP工作流程

圖中藍底框處的模塊是LwIP部分。ICMP,TCP,UDP報文比較典型,圖中也主要以這三種協議的報文為參考進行分析。

網絡通訊說到底就是收發數據,那就分別從發報文和收報文兩個方向來解讀上圖,圖中藍色為報文發送路徑,綠色為報文接收路徑。

1. 報文發送方向

在應用層,待發送數據準備好後,可通過以下兩條路徑將數據傳遞給下一層處理:

A. 將報文的處理方式以及報文組裝成消息,推送入消息隊列。tcpip_thread線程從mbox消息隊列中獲取消息,並按消息裡指定的方法處理消息裡給出的數據。該場景主要針對類似ICMP報文。

B. 將報文直接傳遞給下一層,不經過tcpip_thread線程,主要應用於TCP/UDP報文。

這一點差異體現在圖中紅虛框A處,對於第二條路徑,這部分處理不是在tcpip_thread線程裡,而是在主線程裡

繼續跟蹤藍色路徑,報文經過傳輸層,網絡層,鏈路層以及和WLAN強相關的SDPCM層處理後,將報文推入報文發送隊列,並喚醒線程wwd_thread_func從隊列中取報文,該線程持續從隊列中取報文並將報文經由WLAN芯片發送出去,直到隊列為空。

2. 報文接收方向

報文接收方向,這次跟著綠線的路徑走。

一次報文的接收由硬件中斷觸發,比如在這裡WLAN模塊接收到了數據後觸發SDIO中斷,該中斷負責喚醒wwd_thread_func線程後,就開始從WLAN模塊讀取原始數據並從中解析出鏈路層報文,然後組裝消息,該消息提供了該報文的處理方式和報文數據。消息組裝完成後則推送消息進入mbox消息隊列,而線程tcpip_thread則不停地嘗試從該消息隊列中提取消息。一旦提取到消息就根據消息裡提供的方法處理消息提供的報文。

協議棧內部的報文處理方式和發送方向的相反,依序為鏈路層,網絡層,傳輸層,最後將數據返回給應用層。注意在網絡層處理後,分出兩條路徑,ICMP報文並不需要經過傳輸層。

所有協議將報文返回給應用層,都是通過應用層掛接的回調函數(即紅虛框B處)來實現,但是回調函數可以有兩種實現方式

A. 直接將數據返回給應用層;

B. 將應用層數據推送到接收報文隊列中,等待應用來取數據。

這麼一來,LwIP協議棧結合FreeRTOS總的工作流程就梳理清楚了,其中可能有理解不到位的地方,歡迎一起探討。