1. 学习一个东西,先了解这个东西是干什么用的,哪些场景会用到它,与自己已经掌握的其他知识的联系
a. 例如:LWIP这个东西是干什么用的:他就是一个裁剪后保持大部分TCP/IP功能的协议。用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要指的是TCP协议的完整性,实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。此外LwIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。
b.例如:哪些场景会用到LWIP这个协议:基本上如果你想实现TCP/IP这个协议,就可以用到这个。比如TCP,UDP协议,比如工业总线上的Modbus,比如想要实现网关路由的功能,只要是用到以太网的,都可以实现功能,还有一些物联网像MQTT等。
c.例如:他与linux上直接编写TCP/IP协议的区别:Linux系统中有完整的TCP/IP协议的实现。但是可执行代码往往有数兆之大。需要高效的处理器熟读和大量的外存、内存开销。所以如果芯片是基于Linux kernel的话,就没必要在重复造轮子。LWIP最大优势可以移植到操作系统上,也可以在无操作系统的情况下独立运行,且代码量小。是目前在嵌入式网络领域被讨论和使用很广泛的一个协议栈。开源特性和快速的版本更新效率。新版本还支持DNS、SNMP、DHCP、IGMP等高级应用功能。在资源有限的情况下实现TCP协议的主要功能。有自己的数据包和内存管理机制。所以LWIP需要根据自己的需求,一直相关的代码。
2. 对要学的东西梳理出一个大概的框架(这个框架是(理论框架 + 应用框架[code逻辑]))
2.1. LWIP的理论架构
a. LWIP的网络分层模型:就是TCP/IP的网络分层模型
b. LwIP 符合 TCP/IP 模型架构,规定了数据的格式、传输、路由和接收,以实现端到端的通信。(netif 用来描述一个网卡)
2.2 LWIP的应用code架构:(下载一个相对完整的代码,去看一下这个功能的实现逻辑)
a. LWIP的软件架构:
参考:
LITIECX/lwip_linux: lwip协议栈的linux移植学习 (github.com)
LwIP协议栈粗解
b. LWIP中三种API所在的架构层次:
3. 在框架体系中,找到一条尽快熟悉架构的线,可以以一个想要实现的功能为攻破对象。因为框架内的内容大部分都是重复使用的,所以只要捋清楚一条线,其他的也就迎刃而解。
a. 例如:我想做一个基于LWIP协议中TCP功能的实现;
4. 在确定自己要实现的功能后,先去理解这个功能的原理
a. 例如:TCP的原理是如何实现的。
参考:【lwip】12-一文解决TCP原理
5. 基于我找到的那条线,梳理出这个东西如果按照步骤是怎样运作的。(以结果为导向,分析问题的时候就要想这个原理和步骤之间有什么关系)
a. 例如:实现TCP的设计方案;下面只是一个很粗糙的流程图,还需要具体的深入研究,基于LWIP的TCP是如何实现的。
6. 基于这条线的框架,将其拆解成各个模块,之后再根据各个模块补充细节
a. 例如:如上图的设计方案可以看出,首先TCP我需要分为客户端与服务端。
TCP传输需要涉及到Socket编程
b. 基于理论的实现流程,协议层报文间的封装与拆封流程图:
c. 基于应用code的实现流程,LWIP协议中TCP的数据收发实现的流程图:
TCP服务端
TCP客户端
7. 通过给自己提问,带着问题一层一层的挖每个模块更细节的内容
a. 例如:LWIP 是软件那么而怎样让硬件和软件无缝连接起来呢?网卡又多种多样,怎样才能让 LWIP 使用同样的软件兼容不同的硬件平台?
参考:LWIP中netif结构体的介绍
https://www.cnblogs.com/lizhuming/p/15487094.html
https://www.cnblogs.com/lizhuming/p/15487160.html
LWIP 中使用了一个 netif 结构体来描述网卡但是网卡是直接和硬件平台打交道的:
- 用户提供最底层接口函数。
- LWIP 提供统一的 API。
- 举例:
- 收:如网卡的初始化和网卡的收发数据,当 LWIP 底层得到数据之后,才会传入到内核中去处理。
- 发:LWIP 内核需要发送数据包的时候,也需要调用网卡的发送函数。
- LWIP 中的 etherneif.c 文件的函数通常为硬件打交道的底层函数,当有数据需要通过网卡接收或者发送数据的时候就会被调用,通过 LWIP 的协议栈的内部进行处理后,从应用层就能得到数据或者可以发送数据。
b. 例如:LWIP中的TCP是如何实现三次握手和四次挥手的
参考:【lwip】12-一文解决TCP原理