28-ESP32-S3 lwIP 轻量级 TCP/IP 协议栈

发布于:2024-06-01 ⋅ 阅读:(164) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到