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

2024-05-29 01:44
文章标签 ip 协议 tcp 28 轻量级 esp32 lwip s3

本文主要是介绍28-ESP32-S3 lwIP 轻量级 TCP/IP 协议栈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于28-ESP32-S3 lwIP 轻量级 TCP/IP 协议栈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012295

相关文章

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

【vue3|第28期】 Vue3 + Vue Router:探索路由重定向的使用与作用

日期:2024年9月8日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083;0.98365 = 0.0006 说

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理(三次握手、四次挥手) 三次握手(建立TCP连接) 四次挥手(断开连接)  4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答  9.基于字节流 10.异常情况的处理 小结  前言 在前面,我们已经讲解了有关UDP协议的相关知识,但是在传输层,还有

linux下查看自己的外网ip

局域网的服务器是通过ADSL路由器连接外网的,但ADSL是从ISP运营商那儿通过动态获得IP的,那么我怎么知道自己的外网地址是多少呢? 今天得到几个办法: curl -s http://whatismyip.org wget http://whatismyip.org 然后再  cat index.html 也可以看到

DNS协议基础笔记

1.定义 DNS(Domain Name System,域名系统)是互联网的一项核心服务,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 2.域名解析过程 当用户在浏览器中输入一个域名,浏览器首先会检查自己的缓存中是否有该域名对应的 IP 地址。本地 DNS 服务器收到查询请求后,首先会检查自己的缓存中是否有该域名对应的 IP 地址。根域名服务器收到查询请

linux下TCP/IP实现简单聊天程序

可以在同一台电脑上运行,在一个终端上运行服务器端,在一个终端上运行客户端。 服务器端的IP地址要和本地的IP相同,并分配端口号,客户端的默认设置为本地,端口号自动分配。 服务器端: #include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.