lwip简介及基础知识

简介

1、 介绍

  • LwIP 全名:Light weight IP,意思是轻量化的 TCP/IP 协议,是瑞典计算机科学院 (SICS) 的 AdamDunkels 开发的一个小型开源的 TCP/IP 协议栈。
  • LwIP 的设计初衷是:用少量的资源消耗实现一个较为完整的 TCP/IP协议栈,其中“完整”主要指的是 TCP 协议的完整性,实现的重点是在保持 TCP 协议主要功能的基础上减少对 RAM 的占用。
  • 此外 LwIP 既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。

2、支持的协议

  • 支持 ARP 协议(以太网地址解析协议)。
  • 支持 ICMP 协议(控制报文协议),用于网络的调试与维护。
  • 支持 IGMP 协议(互联网组管理协议),可以实现多播数据的接收。
  • 支持 UDP 协议 (用户数据报协议)。
  • 支持 TCP 协议 (传输控制协议),包括阻塞控制、RTT 估算、快速恢复和快速转发。
  • 支持 PPP 协议(点对点通信协议),支持 PPPoE。
  • 支持 DNS(域名解析)。
  • 支持 DHCP 协议,动态分配 IP 地址。
  • 支持 IP 协议,包括 IPv4、IPv6 协议,支持 IP 分片与重装功能,多网络接口下的数据包转发。
  • 支持 SNMP 协议(简单网络管理协议)。
  • 支持 AUTOIP,自动 IP 地址配置。
  • 提供专门的内部回调接口 (Raw API),用于提高应用程序性能。
  • 提供可选择的 Socket API、NETCONN API (在多线程情况下使用) 。

下载

下载链接
在这里插入图片描述

1、官方说明文档
在这里插入图片描述
点击“Project Homepage”,会得到一个网页,如图 2_2 所示。这个网页可以看成是 LwIP 的官方说明文档。我们可以通过这个网页获得关于LwIP 的很多信息,包括 LwIP 的使用注意、数据的拷贝、系统初始化流程、多线程中要注意的问题、优化方法、内核模块的分类介绍、内核数据结构、内核重要全局变量、内核源码文件等。这些内容专业性比较强,不建议初学时在它上面花费精力,并且里面的很多内容在我们教材的后续章节中中会有所讲解。在这里,读者只要知道有这么个东西就行了。

2、下载
在这里插入图片描述
在这里插入图片描述

  • 网页最下方的黑色内容,是另外的一个备用下载链接。
  • contrib普通发布版,里面装的是移植和应用 LwIP 的一些 demo,即应用示例。contrib包不属于 LwIP 内核的一部分,里面的很多内容来自开源社区的贡献,因此 contrib 包的版本管理不像内核源码那样严格和规范,但也是很有参考价值的。按理说,LwIP 源码面世越久,开源社区对它的贡献就越大,所以越高版本的 contrib 包,提供的应用示例就越丰富,越有参考价值。在大版本区别不大的情况下,建议大家下载最新的 contrib 包。
  • “.sig”后缀的文件,这是数字签名,忽略就行。
  • lwip- 这个就是源码包

lwip文件夹介绍

1、lwip-2.1.2
在这里插入图片描述

  • doc:里面是关于 LwIP 的一些文档,可以看成是应用和移植 LwIP 的指南。但是这些文档比较零散,不成体系,而且纯文本阅读起来很费劲,阅读意义不是很大。
  • src:就是lwip源码文件,也就是我们要使用的都在这个里面了,只有这个用得到。其中的详细内容见下
  • test :里面是测试 LwIP 内核性能的源码,将它们和 LwIP 源码加入到工程中一起编译,调用它们提供的函数,可以获得许多与 LwIP 内核性能有关的指标。这种内核性能测试功能,只有非常专业的人士才用的到。

2、src
在这里插入图片描述

  • api :装的是 NETCONN API 和 Socket API 相关的源文件,只有在操作系统的环境中,才能被编译
  • apps :装的是应用程序的源文件,包括常见的应用程序,如 httpd、mqtt、tftp、sntp、snmp等。
  • core :里面是 LwIP 的内核源文件
  • include :是 LwIP 所有模块对应的头文件
  • netif :是与网卡移植有关的文件,这些文件为我们移植网卡提供了模板,我们可以直接使用。

3、core内核源文件
LwIP 内核是由一系列模块组合而成的,这些模块包括:TCP/IP 协议栈的各种协议、内存管理模块、数据包管理模块、网卡管理模块、网卡接口模块、基础功能类模块、API 模块。每个模块是由相关的几个源文件和头文件组成的,通过头文件对外声明一些函数、宏、数据类型,使得其它模块可以方便地调用此模块的功能。而构成每个模块的头文件都被组织在了 include 目录中,而源文件则根据类型被分散地组织在 api、apps、core、netif 目录中。
在这里插入图片描述

  • ipv4 文件夹里面是与 IPv4 模块相关的源文件,它们实现了 IPv4 协议规定的对数据包的各种操作。ipv4 文件夹中还包括一些并非属于 IP 协议,但会受 IP 协议影响的协议源文件,包括 DHCP、ARP、ICMP、IGMP。
  • ipv6 文件夹里面是与 IPv6 模块相关的源文件,它们实现了 IPv6 协议规定的对数据包的各种操作。ipv6 文件夹中还包括一些并非属于 IP 协议,但会受 IP 协议影响的协议源文件,包括 DHCP、ARP、ICMP、IGMP。
  • altcp.c、altcp_alloc.c、altcp_tcp.c 等文件是应用程序分层 TCP 连接 API,从 TCPIP 线程使用,是一个抽象层,可以模拟应用程序的 tcp 回调 API,同时防止直接链接,这样,应用程序可以使用其他应用程序层协议在 TCP 之上而不知道细节(例如 TLS,代理连接),此类接口我们并没有怎么使用,或者如果选择使用安全的加密传输的话,可以配合 mbed TLS 使用。
  • def.c 文件定义了一些基础类函数,比如主机序和网络序的转换、字符串的查找和比较、整数转换成字符串等,这些函数会被 LwIP 内核的很多模块所调用。在 include 目录里面的 def.h 文件对外声明了 def.c 所实现的函数,同时定义了许多宏,能实现一些基础操作,比如取最大值、取最小值、计算数组长度等,这些宏同样也被内核的许多模块所调用。我们经常可以看到某个内核的源文件在开始的地方 #include “def.h”。
  • dns.c 文件实现了域名解析的功能,有了它,用户就可以在知道服务器域名的情况下,获得该服务器的 IP 地址。很多时候我们只记得服务器域名而不记得服务器 IP 地址,例如“www.baidu.com”就是一个域名,通过 dns 功能,我们就可以得到与服务器域名对应的 IP 地址,这给用户使用带来很大的方便。
  • inet_chksum.c 文件提供了 LwIP 所需的校验和功能,在 IP、UDP、TCP 协议的实现中,需要计算校验和。
  • init.c 文件对 LwIP 的用户宏配置进行了检查,会将配置错误和不合理的地方,通过编译器的 #error和 #warning 功能表示出来。另外,init.c 定义了 lwip_init 初始化函数,这个函数会依次对 LwIP 的各个模块进行初始化。
  • ip.c 文件实现了 IP 协议相关的函数,但只是封装了 ipv4 和 ipv6 文件夹中的函数。
  • mem.c 文件实现了动态内存池管理机制,使得 LwIP 内核的各个模块可以灵活地申请和释放内存。
  • memp.c 文件实现了静态内存堆管理机制,使得 LwIP 内核的各个模块可以快速地申请和释放内存。
  • netif.c 文件实现了网卡的操作,比如注册/删除网卡、使能/禁能网卡、设置网卡 IP 地址等等。netif.c与 include 目录中的 netif.h 文件共同构成了 LwIP 的 netif 模块,它对网卡进行了抽象,使得 LwIP内核可以方便地管理多个特性各异的物理网卡。
  • pbuf.c 文件实现了 LwIP 对网络数据包的各种操作。网络数据包在LwIP 内核中以 pbuf 结构体的形式存在,这提高了 LwIP 内核对数据包处理效率,以及提高了数据包在各层之间递交的效率。pbuf 结构体也是我们使用 RAW/Callback API 进行网络应用程序开发的关键,后续我们会详细讲解。
  • raw.c 文件实现了一个传输层协议的框架,我们可以在它的基础上修改和添加代码,实现自定义的传输层协议,与 UDP/TCP 一样,它可以与 IP 层直接
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
lwIP移植到Linux系统上需要经过以下几个步骤。首先,需要在Linux系统中安装必要的开发工具和依赖库,如GCC编译器、make工具等。然后,将lwIP源代码下载并解压缩。 接下来,需要对lwIP源代码进行一些配置。可以通过修改lwIP的配置文件lwipopts.h来定义一些宏,以适应目标Linux系统的特性和需求。这些宏的定义包括网络接口、内存管理、IP协议、TCP/UDP协议等。 接着,在Linux系统中创建一个新的目录,用于存放lwIP的编译文件和生成的库文件。使用命令行进入该目录,并执行lwIP源代码中提供的Makefile文件,将源代码编译成静态库或动态库。编译过程中可能需要根据情况做一些适配工作,如修改Makefile文件或执行一些补丁。 编译完成后,得到lwIP的库文件。可以将此库文件与Linux应用程序进行链接,以便在Linux系统中使用lwIP网络功能。在应用程序中,需要包含lwIP的头文件,并根据lwIP提供的API编写相应的网络代码。通过调用lwIP提供的函数,可以实现IP协议的处理、TCP/UDP连接的建立和数据的收发等网络功能。 最后,将应用程序编译成可执行文件,并在Linux系统中运行。如果一切顺利,应用程序就可以利用lwIP提供的功能进行网络通信了。 需要注意的是,由于Linux系统和lwIP都是开源软件,存在一定的适配性问题。在移植过程中可能遇到一些编译错误或运行时的问题,需要根据具体情况进行调试和处理。同时,移植lwIP还需要有一定的Linux系统编程和网络编程的知识基础,以便理解和使用lwIP的相关接口和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值