目录
LWIP简介
网络层协议分层模型介绍
LWIP源代码结构
lwip源码文件说明
lwip的contrib包文件说明
以太网接入MCU方案
LWIP结构框图
LWIP简介
lwIP 是 Light Weight(轻型)IP 协议,有无操作系统的支持都可以运行。lwIP 实现的重点 是在保持 TCP/IP 协议主要功能的基础上减少对 RAM 的占用,它只需十几 KB 的 RAM 和 40K 左右的 ROM 就可以运行,这使 lwIP 协议栈适合在低端的嵌入式系统中使用。lwIP 的设计理 念下,既可以无操作系统使用,也可以带操作系统使用既可以支持多线程,也可以无线程。它 可以运行在 8 位以及 32 位的微处理器上,同时支持大端、小端系统。总的来说:lwIP 是一款 小型、开源的 TCP/IP 协议栈。
简单来说就是为了在内存如金的嵌入式系统中,既能满足完整TCP/IP协议栈功能的同时,又能够最小化要消耗的内存,LWIP是一个精简型的TCP/IP协议栈,是一个阉割的TCP/IP协议栈。
实现的主要功能有:
- ARP协议:以太网地址解析协议,属于网络层
- IP协议:包括IPV4和IPV6,支持IP分片与重装,支持多网络接口下数据包转发,属于网络层
- ICMP协议:Internet控制报文协议,用于网络调试和维护;如常用的ping功能就属于该协议,属于网络层
- IGMP:Internet组管理协议,属于网络层,用于网络组管理,可以实现多播数据的接收
- UDP:用户数据报协议,属于网络层,属于传输层,是一个面向无连接的不可靠传输协议
- TCP:支持TCP拥塞控制,RTT估计,快速恢复和重传,属于传输层,是一个面向连接的可靠传输协议
- DNS:域名解析,属于应用层,我们经常难以记住主机地址,容易记住域名,比如www.baidu.com就是一个域名
- SNMP:简单网络管理协议,属于应用层协议
- DHCP:动态主机配置协议,属于应用层协议
- AUTOIP:IP地址自动配置,属于应用层协议
- PPP:点对点协议,属于应用层协议
网络层协议分层模型介绍
说到计算机网络,就不得不先说有名的 OSI 模型,国际标准化组织 ISO 于 1984 提出的 OSI RM(Open System Interconnection Reference Model,开放系统互连参考模型),其模型结构 分为应用、表示、会话、传输、网络、数据链路、物理层共 7 层,每一层负责不同通信功能, 但它既复杂又不实用。TCP/IP 体系结构则不同,它现在得到了非常广泛的应用。TCP/IP 是一 个四层的体系结构,它包含应用层、传输层、网络层和网络接口层,不过从实质上讲,TCP/IP 只有最上面的三层,因为最下面的网络接口层并没有具体内容。因此在学习计算机网络的原理 时往往采取折中的方法,即综合 OSI 模型和 TCP/IP 模型的优点,采用一种只有五层协议体系 的结构,这样即简洁又能将概念阐述清楚,这五层协议体系结构如下图所示:
简单来说OSI七层模型就是理论派,TCP/IP协议栈就是实践派。
应用层:HTTP超文本传输协议,HTTPS更安全的超文本传输协议,FTP文件传输协议,SMTP简单的邮件传输协议,DNS域名服务,OSPF开发最短路径优先等协议,他们直接为用户的应用进程提供服务。
传输层:负责向两个主机中进程之间的通讯提供服务。由于一个主机可以同时运行多个进程,所以传输层分为复用和分时功能。传输层主要使用两种协议,TCP和UDP协议。
网络层:负责分组交换网上的不同主机提供的通信服务务,在发送数据时,网络层把传输层 产生的报文段或用户数据封装成分组或包进行传送。在 TCP/IP 体系中,由于网络层使用 IP 协 议,因此分组也叫做 IP 数据报,简称数据报。
数据链路层:在两个相邻的节点之间传送数据时,数据链路层将网络层提交下来的 IP 数 据报组装成帧。
物理层:物理层的任务就是透明地传送比特流。
知道数据帧最多包含1500个字节,当发送的数据超过这个长度时,需要进行分片和重组的操作。
数据在传输过程中涉及到封包和解包的操作,如下图所示:
LWIP源代码结构
其中涉及的文件主要分LWIP源码和contrib包,contrib包提供用户LWIP移植文件以及相关的LWIP的demo.它不属于LWIP内核的一部分,它只是起到一个提供移植文件和学习实例的作用。
lwip源码文件说明
从上图可知,lwip-2.1.3 文件夹包含的文件和文件夹非常多,读者只了解 src 文件夹下的内 容即可,其他文件和文件夹与移植无关。下面我们简单的了解一下这些文件和文件夹的作用。
(1) CHANGELOG 该文件主要记录 lwIP 源码更新。
(2) COPYING 该文件主要记录 lwIP 开源软件 license。
(3) FEATURES 该文件主要描述 lwIP 的特点。
(4) FILES 该文件主要介绍 lwIP 源码包的文件目录信息。
(5) README 该文件是 lwIP 自述文件。
(6) UPGRADING 该文件主要描述 lwIP 升级版本。
(7) doc 文件夹 该文件夹里面是关于 lwIP 的一些文档,这些文档比较零散,不建议参考。
(8) src 文件夹 该文件夹包含 lwIP 源码文件,这里是非常重要的!!!!,它包含了五个文件夹,这些文件 夹的作用如下表所示:
文件夹 | 说明 |
api文件夹 | Netconn API和Socket API与操作系统相关 |
apps文件夹 | 应用程序,httpd、mqtt、tftp、sntp、snmp |
core文件夹 | LWIP内核源文件 |
include文件夹 | lwip所有模块的头文件 |
netif文件夹 | 处理链路层数据包 |
其中具体的核心源代码文件是core下的文件;
从这里我们会发现,lwIP 是由一系列的模块组合而成的,这些模块包括:TCP/IP 协议栈 的各种协议、内存管理、数据包管理、网卡管理、网卡接口、基础功能、API 接口模块等,每 一个模块是由几个源文件和一个头文件集合,这些头文件全部放在 include 文件夹下,而源文 件都是放在 core 文件夹下。
lwip的contrib包文件说明
其中,我们只需要关注的就是apps、example和ports文件夹即可,这些文件介绍如下所示;
以太网接入MCU方案
主要分为两种,一种是传统的软件TCP/IP协议栈以太网接入方案,一种是硬件TCP/IP协议栈接入方案。
上面是传统软件实现的TCP/IP协议栈,这种方案由 MCU(MAC)+ PHY(芯片)实现以太网物理连接。
所谓全硬件 TCP/IP 协议栈是将传统的软件协议 TCP/IP 协议栈用硬件化的逻辑门电路来实 现。芯片内部完成 TCP、UDP、ICMP 等多种应用层协议,并且实现了物理层以太网控制 (MAC+PHY)、内存管理等功能,完成了一整套硬件化的以太网解决方案。
LWIP结构框图
其中,LwIP为用户提供三组API接口:
sequential API(Netconn API) 为普通的、顺序的程序提供了使用lwIP栈的方法。依赖操作系统,所有操作都需要协议栈去处理,应用程序与协议栈通信,通过发送消息方式进行,因此这种方式会造成频繁的任务切换,速度相比RAW API慢了许多。在操作系统上推荐使用本API。
BSD Socket API 建立在sequential API之上的,封装出的一套BSD Socket API。同样依赖操作系统,效率低,消耗的资源更多。
Raw API(native API / callback) 基于零拷贝发送和接收的事件驱动的API,在没有操作系统的情况下唯一可用的API。操作较复杂但速度最快,效率最高。
这里不得不介绍下STM32的MAC内核框架:
STM32内置了一个MAC内核,它实现了TCP/IP协议栈模型的数据链路层功能。STM32内置以太网框架如下所示:
从上图可以看出,绿色框框的 RX FIFO 和 TX FIFO 都是 2KB 的物理存储器,它们分别存 储网络层递交的以太网数据和接收的以太网数据,而以太网 DMA 是网络层和数据链路层的中 间桥梁,是利用存储器到存储器方式传输。红色框框的内容可分为两个部分讲解,RMII 与 MII 是 MAC 内核(数据链路层)与 PHY 芯片(物理层)的数据通道,它们用来传输以太网数 据,而 MDC 和 MDIO 是 MAC 内核对 PHY 芯片的管理和配置,它们是站管理接口(SMI)所 需的通信引脚。 站管理接口(SMI)允许应用程序通过 2 条线:时钟(MDC)和数据线(MDIO)访问任 意 PHY 寄存器。该接口支持访问多达 32 个 PHY。应用程序可以从 32 个 PHY 中选择一个 PHY,然后从任意 PHY 包含的 32 个寄存器中选择一个寄存器,发送控制数据或接收状态信息。 任意给定时间内只能对一个 PHY 中的一个寄存器进行寻址。在 MAC 对 PHY 进行读写操作的 时候,应用程序不能修改 MII 的地址寄存器和 MII 的数据寄存器。在此期间对 MII 地址寄存 器或 MII 数据寄存器执行的写操作将会被忽略。例如关于 SMI 接口的详细介绍大家可以参考 STM32F4xx 中文参考手册的 824 页。总的来说:MAC 帧数据是通过 MII 和 RMII 传输至 PHY 芯片,也就是说 RMII 和 MII 介质接口是数据链路层与物理层的数据传输桥梁。(这里涉及的各种接口在EDA以太网实验中有所了解,可以参考网上的详细讲解)
(1条消息) MII,RMII,SMII,GMII,RGMII,SGMII接口定义 和 MDIO接口定义_ltqshs的博客-CSDN博客_sgmii接口