ESP32-S3 lwIP
介绍
ESP32-S3 是一款集成了Wi-Fi 和蓝牙功能的微控制器。它的设计初衷是为了方便嵌入式系统的开发。不过你可能会好奇,ESP32-S3 怎么实现与外部网络的通信呢?这里就要提到一个开源的 TCP/IP 协议栈,它叫做lwIP(轻量级 IP)。
通过使用 lwIP 库,ESP32-S3 可以轻松实现与外部网络的交互。它能发送和接收数据包,并处理网络连接等操作。因此,可以说ESP32-S3 是借助lwIP来实现网络功能的利器。
TCP/IP 协议栈是什么
TCP/IP协议栈是一种用于计算机网络通信的协议集合。它包括传输控制协议(TCP)和互联网协议(IP),这两种协议是最早也是最核心的协议。TCP/IP协议栈定义了数据如何在网络中传输,以及如何通过网络地址找到网络上的设备。网络协议体系本身很复杂庞大,内容很多,这里只做简单讲解
TCP/IP 协议栈概述
TCP/IP 协议栈(Transmission Control Protocol/Internet Protocol)是一组用于计算机网络通信的协议集合。它被设计为模块化结构,每一层都有特定的功能,彼此协同工作,共同实现可靠的数据传输。TCP/IP 协议栈分为四层:应用层、传输层、网络层和数据链路层。
各层次详解
1. 应用层
应用层是 TCP/IP 协议栈的顶层,负责处理特定的应用程序通信。它包含许多常用的协议,每个协议对应不同的应用服务。
应用层协议 | 描述 | 示例应用 |
---|---|---|
HTTP(HyperText Transfer Protocol) | 用于万维网(WWW)上的数据通信,支持浏览器与服务器之间的交互 | 网页浏览 |
FTP(File Transfer Protocol) | 用于在网络中传输文件 | 文件传输 |
SMTP(Simple Mail Transfer Protocol) | 用于电子邮件的发送和接收 | 电子邮件 |
DNS(Domain Name System) | 将域名解析为 IP 地址,方便用户访问网站 | 域名解析 |
2. 传输层
传输层的主要功能是提供端到端的通信服务,确保数据可靠传输。它有两个主要协议:
传输层协议 | 描述 | 特点 |
---|---|---|
TCP(Transmission Control Protocol) | 提供可靠的、面向连接的服务 | 通过三次握手建立连接,确保数据包有序和完整传输,提供流量控制和拥塞控制 |
UDP(User Datagram Protocol) | 提供无连接的服务,适用于需要快速传输且不要求高可靠性的应用 | 没有连接建立和断开过程,不保证数据包的顺序和完整性,但传输延迟较低 |
3. 网络层
网络层负责数据包在网络中的路由选择和转发,主要协议是 IP(Internet Protocol)。
网络层协议 | 描述 |
---|---|
IP(Internet Protocol) | 负责将数据包从源地址传送到目标地址,提供不可靠、无连接的数据传输服务 |
ICMP(Internet Control Message Protocol) | 用于网络设备之间发送控制消息,如 Ping 命令用于检测网络连接状态 |
ARP(Address Resolution Protocol) | 将 IP 地址解析为物理地址(MAC 地址),用于局域网内通信 |
RARP(Reverse Address Resolution Protocol) | 将物理地址解析为 IP 地址,常用于无盘工作站启动 |
4. 数据链路层
数据链路层负责在物理网络上的数据传输,具体实现取决于底层网络技术,如以太网、Wi-Fi 等。
数据链路层协议 | 描述 |
---|---|
以太网(Ethernet) | 规定了物理层和数据链路层的技术标准,使用 MAC 地址进行帧的标识和传输 |
Wi-Fi | 基于 IEEE 802.11 标准,实现无线局域网通信,包含多种协议和加密方式,确保数据安全传输 |
数据传输过程
以一个简单的 HTTP 请求为例,来说明 TCP/IP 协议栈的工作过程:
层次 | 处理步骤 |
---|---|
应用层 | 用户在浏览器中输入网址,浏览器生成 HTTP 请求 |
传输层 | HTTP 请求被封装为 TCP 报文,TCP 协议添加源端口、目标端口、序列号等信息 |
网络层 | TCP 报文被封装为 IP 数据包,添加源 IP 地址、目标 IP 地址等信息 |
数据链路层 | IP 数据包被封装为帧,添加源 MAC 地址、目标 MAC 地址等信息,通过物理网络传输 |
数据在各层之间传递时,每一层都添加自己的头部信息,通过封装和解封装过程,实现数据从源到目的的可靠传输。
🚨有一点需要注意的是,TCP/IP协议栈和传统的OSI模型并不完全一样。TCP/IP协议栈是一个更简化的模型,它更加强调实际的协议实现和因特网的实际运作方式。相比之下,OSI模型更加全面和理想化,它提供了一个框架来描述不同系统之间的交互方式。
lwIP 简介
lwIP(轻量级TCP/IP协议栈)是一个专为嵌入式系统设计的开源TCP/IP协议栈。它被创造得非常小巧,只需占用几十KB的RAM和约40KB的ROM。lwIP提供了一套完整的TCP/IP网络协议功能,包括TCP、UDP、IPv4、IPv6、ICMP、IGMP、SNMP、ARP、PPP等协议。同时,lwIP非常灵活,既可以在无操作系统环境下工作,也能与多种操作系统兼容。这给开发者提供了更大的自由度。它具备内存占用小、代码简单、易于移植等优点,非常适合在像ESP32-S3这样的微控制器上使用。
lwIP 特性参数
特性 | 描述 |
---|---|
内存占用 | lwIP 在内存占用方面进行了优化,使其适用于资源受限的嵌入式系统。具体内存占用取决于配置和版本,但通常来说,它可以仅使用十几 KB 的 RAM 和大约 40 KB 的 ROM 即可运行。 |
协议实现 | |
应用层 | 未实现,需要开发者自行集成或实现特定应用程序 |
传输层 | 实现了 TCP/UDP 协议功能 |
网络层 | 实现了 IP 协议、ARP 协议和 ICMP 协议功能 |
扩展性 | 支持一些实验性的扩展,例如 IPv6 协议 |
硬件接口 | |
WiFi 网络接口 | 支持 WiFi 连接 |
以太网网络接口 | 支持以太网连接 |
用户编程接口 | |
RAW | 低级接口,适合高效的网络编程 |
NETCONN | 中级接口,提供线程安全的函数调用 |
SOCKET | 高级接口,类似 BSD 套接字,适合应用程序开发 |
硬件支持 | 网络接口层的实现依赖于底层硬件和驱动程序。开发者需要根据具体的硬件平台和需求进行相应的配置和优化。 |
其他特性 | |
PPP 协议 | 支持点对点通信协议 |
DHCP 协议 | 支持动态分配 IP 地址 |
lwIP 与TCP/IP 体系结构的对应关系
lwIP 是一个轻量级的开源 TCP/IP 协议栈,它实现了 TCP/IP 体系结构的核心协议。下面的表格展示了 lwIP 各个模块与 TCP/IP 体系结构各层的对应关系:
TCP/IP体系结构 | lwIP实现 |
---|---|
应用层 | lwIP提供了TCP/IP协议栈的实现,包括IP、TCP、UDP、ICMP等协议 |
传输层 | lwIP实现了TCP和UDP协议 |
网络层 | lwIP实现了IP协议 |
网络接口层 | lwIP并没有实现,这一层由硬件来实现 |
嘿,看上面那张图,你就能一目了然地明白lwIP软件库主要是怎么一回事。😊 它实际上就是按照TCP/IP的架构分成三个层次:应用层、传输层和网络层。 这几层一起合作来处理和传送数据包,确保数据在网络中可靠地传输。💻可是,网络接口层作为TCP/IP协议栈的最底层,它的功能可不是通过软件能完完全全实现的。🔌 它的主要任务就是把数据包转换成光电模拟信号,这样才能在物理媒介上传输。这个过程涉及到与硬件直接打交道,比如数据的调制解调和信号的转化,这些可都是软件无法模拟或实现的。🔋 所以,虽然lwIP软件库不能负责网络接口层的功能,但是它能够与底层硬件紧密配合,从而提供完整而高效的TCP/IP通信功能。✨ 这也是为什么lwIP成为适用于资源有限的嵌入式系统的最佳选择。💪
WiFi MAC 内核简介
WiFi MAC(媒体访问控制)内核是WiFi通信的核心部分,负责处理WiFi的物理层和数据链路层的任务。ESP32-S3的WiFi MAC内核支持802.11b/g/n协议,可以在2.4GHz频段进行通信。它还支持多种安全协议,包括WEP、WPA/WPA2和WPA3。
关于ESP32的WiFi MAC内核,大致来说,它就是在玩TCP/IP协议的那层网络接口的角色。咱们看看下面这张图来介绍WiFi通讯的情况,就像这张图上面画的那样。
从上图见,ESP32-S3芯片有内置的WiFi MAC内核。咱们发数据到网络时,数据先转成无线信号,然后发到连接的WiFi路由器中。然后,路由器通过网线把数据传到目标主机,完成数据传输。
lwIP Socket 编程接口
为了方便将其他平台上的网络应用程序移植到lwIP,并让更多开发者快速上手,作者设计了三种应用程序编程接口:2️⃣RAW 、2️⃣NETCONN 和2️⃣Socket 。RAW接口只适用于无操作系统环境,对于ESP32内嵌FreeRTOS操作系统来说无法使用。Socket接口更简易实现了网络连接(作者推荐使用),因此,为了网络连接,建议使用Socket API。
lwIP Socket API
在LwIP中,Socket API是基于NETCONN API之上来实现的。以下是lwIP中的一些主要Socket API:
socket()
:这个函数的功能是向内核申请一个套接字。bind()
:该函数的功能与netconn_bind()
函数是一样的,用于服务器端绑定套接字与网卡信息。connect()
:用于建立与指定套接字的连接。listen()
:用于监听指定套接字的连接请求。accept()
:用于接受连接请求。read()
,recv()
,recvfrom()
:用于从套接字接收数据。sendto()
,send()
,write()
:用于向套接字发送数据。close()
:用于关闭套接字。ioctl()
,ioctlsocket()
:用于控制套接字的行为。setsockopt()
:用于设置套接字选项。getsockopt()
:用于获取套接字选项。
更详细的信息,可以参考这篇文章。
总结
参考资料
正点原子DNESP32S3 开发板教程-IDF 版
乐鑫编程指南 lwIP