LwIP入门实战 — 2 LwIP概述

发布于:2025-09-04 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

2.1 LwIP简介

2.2 LwIP文件架构分析

2.2.1 LwIP软件架构

2.2.2 主要模块划分

2.3 IPC通讯机制

2.4 LwIP的3种编程接口

2.4.1 RAW/Callback API

2.4.2 Netconn API


2.1 LwIP简介

LWIP(Light Weight Internet Protocol,轻型网络协议栈)最初是由瑞典计算机科学研究所开发的。在嵌入式系统不断发展的背景下,传统的完整 TCP/IP 协议栈对于资源受限的嵌入式设备(比如一些内存小、处理能力有限的微控制器应用场景)来说过于庞大和复杂,难以有效应用。LWIP 为了满足嵌入式设备接入网络、实现简单网络通信功能的需求,旨在提供一个占用资源少、易于在嵌入式系统中实现和使用的轻量化网络协议栈。

LWIP 支持多种常见的网络协议,主要包括以下这些:

  1. ARP(地址解析协议):实现 IP 地址到物理地址(MAC 地址)的映射,使网络设备能通过 IP 地址找到对应的硬件接口进行通信,是以太网环境中通信的基础协议之一。
  2. IP(网际协议):包括 IPv4 和 IPv6,是网络层的核心协议,负责数据包的寻址和路由选择,支持 IP 分片与重装,以及多网络接口间的数据包转发,实现不同网络之间的数据传输。
  3. TCP(传输控制协议):提供可靠的、面向连接的传输服务,具备拥塞控制、RTT(往返时间)估算、快速恢复和快速转发等特性,保证数据传输的准确性、有序性,并能进行重传处理,适用于对可靠性要求高的场景(如文件传输、网页访问)。
  4. UDP(用户数据报协议):一种无连接的传输层协议,相比 TCP 更简单高效,不保证数据传输的可靠性,但传输延迟小,适合对实时性要求高、允许少量数据丢失的场景(如实时视频流、简单数据上报)。
  5. ICMP(互联网控制消息协议):主要用于在 IP 网络中传递控制消息和进行差错报告,例如常见的 “ping” 命令就基于此协议,可用于检测网络连通性、报告数据包传输中的错误等。
  6. IGMP(互联网组管理协议):支持主机加入或离开多播组,使设备能够接收特定多播组的数据包,适用于多播通信场景,如多媒体数据的组播传输。
  7. PPP(点对点协议):支持点对点的通信连接,包括 PPPoE(基于以太网的点对点协议),常用于拨号上网等场景,实现两个节点之间的数据传输。
  8. DNS(域名系统):负责将域名解析为对应的 IP 地址,使设备能通过易记的域名访问网络中的主机,而无需直接记忆复杂的 IP 地址。
  9. DHCP(动态主机配置协议):自动为网络中的设备分配 IP 地址、子网掩码、网关等网络配置信息,简化网络设备的配置过程,提高网络管理效率。
  10. AUTOIP(自动 IP 配置):当网络中没有 DHCP 服务器时,自动为设备分配一个属于特定网段(169.254.0.0/16)的 IP 地址,使设备能在小型网络中实现基本通信。
  11. SNMP(简单网络管理协议):用于网络设备的管理和监控,允许管理设备收集网络中各节点的信息、配置设备参数等,实现对网络的集中管理。

优点

  • 资源占用少:LWIP 的设计核心就是轻量化,它的代码量相对传统的 TCP/IP 协议栈要小很多,对内存的需求也较低,很适合在资源受限的嵌入式设备中运行,比如常见的 8 位、16 位或者低端 32 位微控制器所构建的物联网节点设备等。
  • 可移植性强:它有着良好的分层架构和代码设计,能够方便地移植到不同的操作系统以及硬件平台上,无论是常见的实时操作系统(如 FreeRTOS、uC/OS 等),还是一些裸机环境下,都可以进行适配移植。
  • 功能相对完整:尽管是轻量级的协议栈,但涵盖了网络通信中常用的基础协议,能满足大多数嵌入式设备接入网络进行简单通信以及与外部服务器交互等常见需求,比如实现设备的远程配置、数据上报等功能。

缺点

  • 功能扩展性有限:对于一些非常复杂、高级的网络功能需求,LWIP 可能无法很好地满足,毕竟其设计初衷是面向资源受限情况提供基本网络通信功能,不像一些大型的、用于服务器端的全功能 TCP/IP 协议栈那样具备丰富的拓展性和高级特性。
  • 性能在高负载下受限:在面对大量并发连接、高速率的数据传输等高强度网络负载场景时,由于其资源占用和自身设计定位的限制,性能可能不如一些专门为高性能服务器等设计的重型协议栈,可能会出现丢包、延迟增加等情况。

2.2 LwIP文件架构分析

2.2.1 LwIP软件架构

LwIP采用分层架构,遵循TCP/IP协议栈的四层模型(应用层、传输层、网络层、链路层),同时支持多种操作系统抽象接口(如无操作系统、FreeRTOS、uC/OS等)。

2.2.2 主要模块划分

LwIP源码主要由以下几个核心模块构成:

模块

功能

core

核心协议实现(IP、ICMP、UDP、TCP、ARP、IPv6等)

netif

网络接口管理(NIC驱动接口)

apps

上层应用协议(HTTP、FTP、SNMP、MQTT、TFTP等)

api

3种编程接口:RAW API、Netconn API、Socket API

arch

架构相关代码(CPU类型、字节序、编译器特性)

include

所有头文件,定义数据结构、宏、函数原型

ports

针对特定平台的移植代码(如STM32、ESP32、Linux模拟等)

2.3 IPC通讯机制

进程间通信(IPC)是操作系统中不同进程之间交换数据和信息的过程。在Linux系统中,提供了多种IPC机制,每种机制都有其独特的优点和应用场景。以下是一些常见的IPC机制:

  1. 管道(Pipe):管道是一种单向通信机制,通常用于父子进程之间的通信。可以使用pipe()系统调用创建一个管道,然后使用fork()创建子进程,一个读取,一个写入。管道是半双工的,数据只能在一个方向上流动,并且只能用于具有亲缘关系的进程之间的通信。
  2. 命名管道(Named Pipe,FIFO):命名管道是一种有名的通信管道,允许不相关的进程之间进行通信。可以使用mkfifo命令或mkfifo()函数创建命名管道。与匿名管道不同,命名管道提供了一个路径名与之关联,允许没有亲缘关系的进程进行通信。
  3. 消息队列(Message Queue):消息队列允许进程通过消息来进行通信。可以使用msgget()、msgsnd()和msgrcv()等系统调用来创建和操作消息队列。消息队列可以存储具有特定格式的数据,每条消息可以包含一个类型标识和数据部分,这使得消息队列比管道更灵活。
  4. 共享内存(Shared Memory):共享内存是一种允许多个进程访问同一块物理内存的IPC方式。它是IPC中最快速的方式,因为共享内存方式的通信没有中间过程,而管道、消息队列等方式则是需要将数据通过中间机制进行转换。共享内存直接将某段内存段进行映射,多个进程间的共享内存是同一块的物理空间,因此不需要进行复制,可以直接使用此段空间。但需要注意的是,共享内存本身并没有同步机制,需要程序员自己控制。
  5. 信号量(Semaphore):信号量是一种计数器,用于控制对多个进程共享的资源进行的访问。它们常常被用作一个锁机制,在某个进程正在对特定的资源进行操作时,信号量可以防止另一个进程去访问它。
  6. 套接字(Socket):套接字是一种通用的IPC方式,不仅限于同一台主机,还可以在不同主机上的进程之间进行通信。套接字通常用于网络编程,但也可以用于本地进程间通信(Unix域套接字)。

2.4 LwIP的3种编程接口

LwIP提供了3种编程接口,分别为RAW/Callback API、NetconnAPI、Socket API。它们的易用性从左到右依次提高,而执行效率从左到右依次降低,用户可以根据实际情况选择合适的API进行网络应用程序的开发。

2.4.1 RAW/Callback API

RAW/Callback API是指内核回调型的API,RAW/Callback API是LwIP的一大特色,在没有操作系统支持的裸机环境中,只能使用这种API进行开发,同时这种API也可以用在操作系统环境中。RAW/Callback API的优点有两个:

  • 可以在没有操作系统的环境中使用。
  • 在有操作系统的环境中使用时,对比另外两种API,可以提高应用程序的效率,节省内存开销。

RAW/Callback API的优点是显著的,但缺点也是显著的:

基于回调函数开发应用程序时的思维过程比较复杂,利用回调函数去实现复杂的业务逻辑时会很麻烦,而且代码的可读性较差。

2)在操作系统环境中,应用程序代码与内核代码处于同一个线程,虽然能够节省任务间通信和切换任务的开销,但是相应地,应用程序的执行会制约内核程序的执行,不同的应用程序之间也会互相制约。在应用程序执行的过程中,内核程序将不可能得到运行,这会影响网络数据包的处理效率。如果应用程序占用的时间过长,而且恰巧这时又有大量的数据包到达,由于内核代码长期得不到执行,网卡接收缓存里的数据包就持续积累,到最后很可能因为满载而丢弃一些数据包,从而造成丢包的现象。

2.4.2 Netconn API

在操作系统环境中,可以使用Netconn API或者Socket API进行网络应用程序的开发。Netconn API是基于操作系统的IPC机制实现的,它将LwIP内核代码和网络应用程序分离成了独立的线程。如此一来,LwIP内核线程就只负责数据包的TCP/IP封装和拆封,而不用进行数据的应用层处理,大大提高了系统对网络数据包的处理效率。

在操作系统环境中,LwIP内核会被实现为一个独立的线程,名为tcpip_thread,使用Netconn API或者Socket API的应用程序处在不同的线程中,我们可以根据任务的重要性分配不同的优先级给这些线程,从而保证重要任务的时效性。简单来说,Netconn API的优缺点如下:

1)相较于RAW/Callback API,Netconn API简化了编程工作,使用户可以按照操作文件的方式来操作网络连接。但是,内核程序和网络应用程序之间的数据包传递,需要依靠操作系统的信号量和邮箱机制完成,这需要耗费更多的时间和内存,另外还要加上任务切换的时间开销,效率较低。

2)相较于Socket API,Netconn API避免了内核程序和网络应用程序之间的数据复制,提高了数据递交的效率。但是,Netconn API的易用性不如Socket API好,它需要用户对LwIP内核所使用的数据结构有一定的了解。


网站公告

今日签到

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