LwIP协议栈浅析

原文链接:
https://blog.csdn.net/c12345423/article/details/109831396

https://blog.csdn.net/c12345423/article/details/109831396?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163953014116780271970981%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163953014116780271970981&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-109831396.pc_search_insert_es_download&utm_term=lwip%E5%8D%8F%E8%AE%AE%E6%A0%88&spm=1018.2226.3001.4187

https://blog.csdn.net/qq_42992084/article/details/109606919

一、前言

LwIP协议栈是TCP/IP协议的一种实现,由于其轻量级的特性,一般用于资源比较有限的嵌入式设备中,本文是学习了野火的LwIP教程之后做了一些学习总结,主要讲解LwIP协议栈包含的功能,如有侵权,请联系本人。

LwIP源码可以直接到官网下载:LwIP官网

二、LwIP简介

LwIP(Light weight IP)是一种轻量级的TCP/IP协议栈,其设计初衷是用少量的资源消耗实现一个较为完整的TCP/IP协议栈,有无操作系统均可运行。LwIP 具有主要特性:

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

三、LwIP的优缺点

  1. 资源开销低,流程运行只需要40K的代码空间和几十K的内存空间;高度可剪裁,任何不需要的功能都可以通过宏编译选项去掉;LwIP有自己的内存管理策略和数据包管理策略,因此内核数据包处理很高效。

2.几乎支持TCP/IP中所有常见的协议,并且实现了一些常见的应用程序,比如:DHCP客户端、DNS客户端、HTTP服务器、MQTT客户端、TFTP服务器、SNTP客户端等。LwIP相对于其他嵌入式TCP/IP协议栈(uC-TCP/IP、FreeRTOS-TCP等)历史比较悠久,且经过更多的验证和测试,所以被广泛使用在嵌入式网络设备中。而且开源、免费。

3.对处理器和操作系统相关的地方进行了抽象,可以方便的进行跨处理器和操作系统的移植,源代码全部用C实现。提供3种编程接口:RAW API 、NETCONNN API 、Socket API,用户根据实际需要和他们各自特点选择使用。

缺点:由于面向资源有限的嵌入式设备,没有完整的实现TCP/IP协议栈,但是对于物联网的大部分场景已经足够了。

四、LwIP协议栈移植

4.1 LwIP内核

  LwIP内核由多个模块组成,包括:TCP/IP协议栈的各种协议、内存管理模块、数据包管理模块、网卡管理模块、网卡接口模块、基础功能类模块、API模块。

4.2 LwIP内核的三种编程接口

RAW/Callback API

   优点:有无操作系统均可使用,通过回调的方式可以提高应用程序的效率,节省内存开销(用户程序和内核程序处于同一个线程中,节省了任务切换和任务间通信的开销)。

   缺点:利用回调函数开发应用程序,实现过程比较复杂,可读性差;应用程序和内核程序处于同一线程,如果应用程序占用时间过长,会影响内核程序的执行,导致丢包等问题。

NETCONN API

    优点:在操作系统环境下,基于IPC机制实现,将内核程序和应用程序分离为独立的线程,LwIP内核线程只负责数据包的TCP/IP封装和拆封,应用程序负责处理应用数据,因此相对于RAW/Callback API的方式提高了协议栈对数据包的处理效率。

    对网络连接进行了抽象,简化了编程工作,用户可以像操作文件那样操作网络连接,而且通过内核的pbuf、netbuf结构体来传递数据,避免了数据包在内核和应用程序之间的拷贝,

    缺点:需要依赖操作系统,且IPC机制(信号量,邮箱)、任务切换需要耗费时间和内存,效率也比回调函数方式低。

    虽然可以通过类似操作文件那样去操作网络连接,但是用户操作的参数是内核的相关结构体,需要用户对LwIP使用的数据结构有一定了解,不像操作文件直接读写数组那么简单。

SOCKET API

优点:基于NETCONN API 实现,进行了更高级的抽象,操作更加简单易用,有很好的移植性。

缺点:内核程序和应用程序之间存在数据拷贝,降低了数据处理的效率。

4.3 LwIP协议栈移植步骤

LwIP移植又可分为有操作系统移植和无操作系统移植,有操作系统移植步骤如下:

    1.底层移植:时钟systick 中断的实现,tick->ms的转换,网卡收发线程的实现,操作系统接口的适配 ;

    2.基于上面底层和操作系统的移植工作,要使LwIP跑起来,还要初始化,包括:调用lwip_init()初始化内核(内核自动创建tcpip_thread线程),挂载网卡,设置默认网卡;

    3.移植完成后用电脑ping开发板测试。

备注:

    a. 以太网的最大传输字节一般是1500,在IP层决定是否对数据包进行分片处理,因为链路层不提供任何差错处理机制;

    b. 挂载网卡:将描述网卡的结构体通过netif_add()挂载到netif_list链表上;

    c. 几种内存分配策略 :动态内存池管理、动态内存堆管理(分两种:1.C标准库自带,2.LwIP自身实现的,两者通过宏选择);

    d. 在操作系统环境下,LwIP作为一个线程运行,初始化LwIP的时候,内核自动创建这个线程;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值