lwip : A Lightweight TCP/IP stack,一个轻量级的 TCP/IP 协议栈。lwip 所实现的,是 TCP/IP 协议栈的一部分内容。
1.TCP/IP协议栈分层
TCP/IP:Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议,TCP/IP是一个协议栈,由众多的协议组成。TCP和ip是最重要的两个协议,所以用来作为协议栈的名字。
TCP/IP定义了四层:网络接口层、网络层、传输层、应用层。简化了OSI的分层
2.net组件总体结构
在RTT中,网络组件总体结构如下:
应用层:例如FTP,HTTP等,实现应用层协议
SAL套接字抽象层:这一层主要是实现标准的socket,bind,accept等接口。由于RTT协议栈支持LWIP,AT Socket和wiznet三种网络协议栈,所以有了这一层。如果只选择使用Lwip协议栈,并且不启用SAL套接字抽象层的情况况下,socket接口实际上是直接通过宏定义转换为lwip的接口,例如:lwip_socket。
netdev网卡层:提供网卡管理,网卡网络状态管理,网络接口IP设置,状态操作等。感觉这一层主要用于驱动创建网卡,并注册对应的硬件操作接口,以及配置IP地址配置接口等。
网络协议层:包含lwip,AT Socket,wiznet。主要是实现tcp/IP,或者其他协议。
网络接口层:主要是硬件接口和对应驱动。
3.lwip组件总体结构
lwip协议按TCP/IP协议栈分层,其层次划分和对应文件关系如下:
协议层次 | 对应的主要文件和说明 |
应用层 | 主要在src\apps\*,主要实现http,ftp等应用层协议 |
传输层 | 主要是TCP和UDP相关文件,都分布在 src\core\tcp.c tcp_in.c tcp_out.c src\core\udp.c |
网络层 | src\core\ip.c src\core\ipv4\* src\core\ipv6\* |
网络接口层 | 主要包括 src\core\netif.c 这个是netif的抽象框架,主要netif接口管理,提供抽象的接口发送和接收函数。 src\netif\* 主要是ppp接口eth等具体接口的收发函数的接口层实现。比如对于以太网加以太网帧头的实现就在这里 |
在src\api文件夹下,主要是实现了netconn和BSD网络接口,用于简化lwip回掉模式接口的使用。具体可以参考后面关于lwip模式说明。
4.lwip进程模型和编程接口
一般来讲,协议栈是设计为内核代码的一部分,与用户层保持着完全的分层封装。但是小型嵌入式设备中,内核空间和用户空间没有明显的分层现象,这就允许用户和内核之间有更多宽松的数据处理机制。
LWIP采用如下进程模型:
协议栈作为一个操作系统的独立进程,用户可以留驻在协议栈进程中,也可以是一个独立的进程。第一种方式,用户与协议栈通信通过回调函数;第二种方式,用户和协议栈通信需要调用系统提供的信号量和邮箱机制。
LWIP具有三种协议栈编程接口,分别是
RAW/Callback API、Sequential(netconn) API、Socket API.
RAW接口是lwip提供的原始接口,
netconn是对RAW接口的调用的顺序调用。通过优化或者信号量机制,保证RAW调用和协议栈本身代码顺序。
socket api是对netconn接口的封装。
当用户留驻在协议栈进程中时,用户代码直接使用RAW/Callback API接口。
当用户和协议使用独立进程时,用户代码只能使用netconn api接口,或者socket api接口。
参考链接:
https://www.cnblogs.com/heyongshen/p/16455774.html
LWIP学习笔记-数据包管理_火山宝 && 王林宝的博客-CSDN博客
有一个LWIP协议分析的专题: