1. 學(xué)習(xí)一個(gè)東西,先了解這個(gè)東西是干什么用的,哪些場景會(huì)用到它,與自己已經(jīng)掌握的其他知識(shí)的聯(lián)系
????????a. 例如:LWIP這個(gè)東西是干什么用的:他就是一個(gè)裁剪后保持大部分TCP/IP功能的協(xié)議。用少量的資源消耗實(shí)現(xiàn)一個(gè)較為完整的TCP/IP協(xié)議棧,其中“完整”主要指的是TCP協(xié)議的完整性,實(shí)現(xiàn)的重點(diǎn)是在保持TCP協(xié)議主要功能的基礎(chǔ)上減少對RAM 的占用。此外LwIP既可以移植到操作系統(tǒng)上運(yùn)行,也可以在無操作系統(tǒng)的情況下獨(dú)立運(yùn)行。
????????b.例如:哪些場景會(huì)用到LWIP這個(gè)協(xié)議:基本上如果你想實(shí)現(xiàn)TCP/IP這個(gè)協(xié)議,就可以用到這個(gè)。比如TCP,UDP協(xié)議,比如工業(yè)總線上的Modbus,比如想要實(shí)現(xiàn)網(wǎng)關(guān)路由的功能,只要是用到以太網(wǎng)的,都可以實(shí)現(xiàn)功能,還有一些物聯(lián)網(wǎng)像MQTT等。
????????c.例如:他與linux上直接編寫TCP/IP協(xié)議的區(qū)別:Linux系統(tǒng)中有完整的TCP/IP協(xié)議的實(shí)現(xiàn)。但是可執(zhí)行代碼往往有數(shù)兆之大。需要高效的處理器熟讀和大量的外存、內(nèi)存開銷。所以如果芯片是基于Linux kernel的話,就沒必要在重復(fù)造輪子。LWIP最大優(yōu)勢可以移植到操作系統(tǒng)上,也可以在無操作系統(tǒng)的情況下獨(dú)立運(yùn)行,且代碼量小。是目前在嵌入式網(wǎng)絡(luò)領(lǐng)域被討論和使用很廣泛的一個(gè)協(xié)議棧。開源特性和快速的版本更新效率。新版本還支持DNS、SNMP、DHCP、IGMP等高級(jí)應(yīng)用功能。在資源有限的情況下實(shí)現(xiàn)TCP協(xié)議的主要功能。有自己的數(shù)據(jù)包和內(nèi)存管理機(jī)制。所以LWIP需要根據(jù)自己的需求,移植相關(guān)的代碼。
2. 對要學(xué)的東西梳理出一個(gè)大概的框架(這個(gè)框架是(理論框架 + 應(yīng)用框架[code邏輯]))
2.1. LWIP的理論架構(gòu)
a. LWIP的網(wǎng)絡(luò)分層模型:就是TCP/IP的網(wǎng)絡(luò)分層模型
b. LwIP 符合 TCP/IP 模型架構(gòu),規(guī)定了數(shù)據(jù)的格式、傳輸、路由和接收,以實(shí)現(xiàn)端到端的通信。(netif 用來描述一個(gè)網(wǎng)卡)
2.2 LWIP的應(yīng)用code架構(gòu):(下載一個(gè)相對完整的代碼,去看一下這個(gè)功能的實(shí)現(xiàn)邏輯)
a. LWIP的軟件架構(gòu):
參考:
LITIECX/lwip_linux: lwip協(xié)議棧的linux移植學(xué)習(xí) (github.com)
LwIP協(xié)議棧粗解
b. LWIP中三種API所在的架構(gòu)層次:
3. 在框架體系中,找到一條盡快熟悉架構(gòu)的線,可以以一個(gè)想要實(shí)現(xiàn)的功能為攻破對象。因?yàn)榭蚣軆?nèi)的內(nèi)容大部分都是重復(fù)使用的,所以只要捋清楚一條線,其他的也就迎刃而解。
a. 例如:我想做一個(gè)基于LWIP協(xié)議中TCP功能的實(shí)現(xiàn);
4. 在確定自己要實(shí)現(xiàn)的功能后,先去理解這個(gè)功能的原理
a. 例如:TCP的原理是如何實(shí)現(xiàn)的。
參考:【lwip】12-一文解決TCP原理文章來源地址http://www.zghlxwxcb.cn/news/detail-422205.html
5. 基于我找到的那條線,梳理出這個(gè)東西如果按照步驟是怎樣運(yùn)作的。(以結(jié)果為導(dǎo)向,分析問題的時(shí)候就要想這個(gè)原理和步驟之間有什么關(guān)系)
a. 例如:實(shí)現(xiàn)TCP的設(shè)計(jì)方案;下面只是一個(gè)很粗糙的流程圖,還需要具體的深入研究,基于LWIP的TCP是如何實(shí)現(xiàn)的。
6. 基于這條線的框架,將其拆解成各個(gè)模塊,之后再根據(jù)各個(gè)模塊補(bǔ)充細(xì)節(jié)
a. 例如:如上圖的設(shè)計(jì)方案可以看出,首先TCP我需要分為客戶端與服務(wù)端。
TCP傳輸需要涉及到Socket編程
b. 基于理論的實(shí)現(xiàn)流程,協(xié)議層報(bào)文間的封裝與拆封流程圖:
c. 基于應(yīng)用code的實(shí)現(xiàn)流程,LWIP協(xié)議中TCP的數(shù)據(jù)收發(fā)實(shí)現(xiàn)的流程圖:
TCP服務(wù)端
TCP客戶端
7. 通過給自己提問,帶著問題一層一層的挖每個(gè)模塊更細(xì)節(jié)的內(nèi)容
a. 例如:LWIP 是軟件那么而怎樣讓硬件和軟件無縫連接起來呢?網(wǎng)卡又多種多樣,怎樣才能讓 LWIP 使用同樣的軟件兼容不同的硬件平臺(tái)?
參考:LWIP中netif結(jié)構(gòu)體的介紹
? https://www.cnblogs.com/lizhuming/p/15487094.html
? https://www.cnblogs.com/lizhuming/p/15487160.html
LWIP 中使用了一個(gè) netif 結(jié)構(gòu)體來描述網(wǎng)卡但是網(wǎng)卡是直接和硬件平臺(tái)打交道的:
- 用戶提供最底層接口函數(shù)。
- LWIP 提供統(tǒng)一的 API。
-
舉例:
- 收:如網(wǎng)卡的初始化和網(wǎng)卡的收發(fā)數(shù)據(jù),當(dāng) LWIP 底層得到數(shù)據(jù)之后,才會(huì)傳入到內(nèi)核中去處理。
- 發(fā):LWIP 內(nèi)核需要發(fā)送數(shù)據(jù)包的時(shí)候,也需要調(diào)用網(wǎng)卡的發(fā)送函數(shù)。
- LWIP 中的 etherneif.c 文件的函數(shù)通常為硬件打交道的底層函數(shù),當(dāng)有數(shù)據(jù)需要通過網(wǎng)卡接收或者發(fā)送數(shù)據(jù)的時(shí)候就會(huì)被調(diào)用,通過 LWIP 的協(xié)議棧的內(nèi)部進(jìn)行處理后,從應(yīng)用層就能得到數(shù)據(jù)或者可以發(fā)送數(shù)據(jù)。
b. 例如:LWIP中的TCP是如何實(shí)現(xiàn)三次握手和四次揮手的文章來源:http://www.zghlxwxcb.cn/news/detail-422205.html
參考:【lwip】12-一文解決TCP原理
8. 最后根據(jù)這條線,將所有的枝干全部理解后,整理出來,這樣就基本理解了這塊功能,其他模塊也都一通百通。最后自己在手寫一份代碼,基本就差不多了。
到了這里,關(guān)于LWIP協(xié)議與TCP/IP的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!