当前位置: 首页 > news >正文

LwIP学习笔记1 - LwIP的设计目的、分层设计思想及模块划分概览

引言

LwIP是嵌入式常用的TCP/IP协议栈组件,学习LwIP有助于深入理解嵌入式中的以太网应用。本文翻译注解了作者Adam Dunkels 2001年写的LwIP论文报告的Abstract、session1~3部分,有助于从一个更宏观的角度来理解LwIP。原文链接:Adam Dunkels’ initial LwIP paper

| 文章如有疏漏,欢迎指出~

文章目录

  • 引言
  • 正文
    • 0 Abstract-LwIP论文概述:
    • 1 Introduction-LwIP的背景和意义
    • 2 Protocol layering-LwIP的分层设计思路
    • 3 Overview-LwIP的分层及子模块概览

正文

0 Abstract-LwIP论文概述:

LwIP是TCP/IP协议栈的实现。LwIP协议栈关注如何减少内存使用量和代码大小,使LwIP适用于资源非常有限的小型客户端,如嵌入式系统。为了减少处理步骤和内存消耗,LwIP使用特制的API,无需进行任何数据复制。
本报告描述了LwIP的设计和实现。描述了协议实现及其子系统(如memory和buffer管理系统)中使用的算法和数据结构。本报告中还包括LwIP API的参考手册和使用 LwIP 的一些代码示例。

1 Introduction-LwIP的背景和意义

在过去的几年里,(社会对)将计算机和计算机支持的设备连接到无线网络的兴趣稳步增长。
计算机与日常设备的无缝集成越来越紧密,价格也在下降。
与此同时,蓝牙和IEEE 802.11b无线局域网等无线网络技术正在兴起。
这促使医疗保健,安全和安保,运输和加工工业等领域产生了许多新的富有吸引力的场景。
传感器等小型设备可以连接到现有的网络基础设施,如全球互联网,并从任何地方进行监控。
//注解:有越来越多的设备通过网络连在了一起

互联网技术已经证明自己足够灵活,可以融入过去几十年不断变化的网络环境。
虽然互联网技术最初是为ARPANET等低速网络开发的,但如今的互联网技术运行在一个更大范围的链路技术上,在带宽和误码率方面已具有截然不同的特征。
在未来的无线网络中使用现有的互联网技术是非常有利的,因为大量使用互联网技术的应用进程已被开发了出来。
此外,全球互联网的大规模连接也是一个强大的动力。
//注解:互联网技术灵活度高、适用范围广、前景广阔,联网好处多多

由于传感器等小型设备通常倾向于设计得体积小且便宜,因此互联网协议在小型设备上的实现将不得不面临有限的计算资源和内存的挑战。
本报告描述了一个名为LwIP的小型TCP/IP stack的设计和实现,该stack足够小,可以在最小系统中使用。
//注解:在万物互联的时代趋势背景下,设备联网必然面临资源有限的挑战,LwIP应运而生。

本报告的结构如下: //注解:讲了Adam Dunckle的这篇文章的主要结构
第2~4节概述了LwIP堆栈
第5节介绍了操作系统仿真层 - the operating system emulation layer
第6节介绍了memory和bubffer管理 - the bu®er and memory management subsystems
第7节介绍了LwIP的网络接口抽象 - network interface functions
第8~10节描述了IP、UDP和TCP协议的实现
第11、12节介绍如何与LwIP接口并介绍LwIP API
第13、14节分析了实施情况
第15节提供了LwIP API的参考手册
第17、18节显示了各种代码示例

2 Protocol layering-LwIP的分层设计思路

TCP/IP套件中的协议设计遵循分层设计思想,每个协议层解决通信问题中一个独立的部分。
这种分层设计可以作为设计LwIP的参考,因为每个协议都可以分开独立实现。
然而,以严格分层的方式实现LwIP可能会增加协议层之间的通信开销而降低整体性能。
为了克服这些问题,设计LwIP时可以让其他层的协议知道某层协议的某些内部信息。但必须注意,在各层之间仅共享重要信息。
//注解:LwIP参考TCP/IP的分层设计思想进行设计,但为了减少CPU资源消耗和内存消耗,不会完全参照TCP/IP,有的时候分层会不那么严格。

大多数TCP/IP的实现会让application layer和lower protocol layer之间严格分层,而lower protocol layers之间可以或多或少地交错。
在大多数操作系统中,lower protocol layers作为操作系统内核的一部分实现,具有用于与application layer的进程通信的入口点。
application program作为TCP/IP的抽象实现,其中网络通信与进程间通信或file I/O只有很小的差异。
这样做意味着,由于应用进程不知道较低层使用的buffer机制,因此它无法利用此信息来重用buffer。例如,重用使用频繁的数据。此外,当应用进程发送数据时,必须将此数据从application layer进程的内存空间复制到内部buffers中,然后才能由网络代码进行处理。
//注解:讲了讲大多数TCP/IP的实现中的分层比较严格,内存和buffer要在层与层之间传来传去。开销大,有可以优化的空间。

在最小系统(如LwIP的目标系统)中使用的操作系统通常不会在内核和application layer进程之间维持一个很严格的边界。
这允许LwIP通过共享内存在application layer进程和lower layer protocol之间用更轻松的方式实现通信。
特别地,application layer可以知道lower layer使用的buffer处理机制。因此,应用进程可以更有效地重用buffer。
此外,由于application layer进程与networking code共享内存,因此application layer进程可以直接读取和写入内部buffers,从而节省了内存复制所消耗的系统资源。
//注解:讲了讲LwIP通过共享内存、打破层壁垒的方式节约了CPU资源和内存占用量

3 Overview-LwIP的分层及子模块概览

//注解:下面讲LwIP怎么分层的
与许多其他的TCP/IP实例一样,分层协议设计已作为LwIP实现设计的指南。
每个协议作为一个单独的模块实现,每个模块都有一些函数作为本协议的接口。
尽管协议是分开实现的,但如上所述,为了提高处理速度和内存使用相关的性能,会有一些违背分层设计思想的跨层设计。
例如,在验证传入TCP段的校验和以及解复用段时,TCP模块必须知道该段的源IP地址和目标IP地址。TCP模块不是通过函数调用将这些地址从别的模块获得,而是自己就知道IP标头的结构,因此可以自己提取此信息。 //注解:一个LwIP通过跨层处理的例子

//注解:下面讲LwIP由哪些模块组成
LwIP由很多模块组成:
(1) TCP/IP协议模块:​​IP、ICMP、UDP和TCP
(2) 支持模块:
操作系统仿真层(第5节)- the operating system emulation layer
缓冲区和内存管理子系统(第6节)- the bu®er and memory management subsystems
网络接口函数和用于计算Internet校验和的函数(第7节)- network interface functions
一个抽象API(第12节)- Application Program Interface

相关文章:

  • 使用 Convex 进行状态管理的指南
  • 卷积神经网络参数解读
  • IP 地址及其应用(计算机网络)
  • poi-tl(word模板渲染)
  • Java线程
  • 【Flink读写外部系统】Flink自定义kafka分区并输出
  • 【云原生】学习K8s的扩展技能(CRD)
  • Chapter05 修炼python基本功:条件语句和循环
  • 彻底掌握Makeifle(三)
  • 手机抓取蓝牙日志btsnoop的方法汇总(Android一直补充中)
  • 【Vue 开发实战】实战篇 # 30:实现一个可动态改变的页面布局
  • [单片机框架][drivers层][cw2015/ADC] fuelgauge 硬件电量计和软件电量计(一)
  • 【iVX 开发 - 入门】开发环境、应用对象树介绍(含操作演示)
  • CTFshow 代码审计
  • 19-Django REST framework-DRF工程搭建
  • CSS 专业技巧
  • Git初体验
  • input实现文字超出省略号功能
  • PermissionScope Swift4 兼容问题
  • python 装饰器(一)
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • windows下如何用phpstorm同步测试服务器
  • 从零开始在ubuntu上搭建node开发环境
  • 基于web的全景—— Pannellum小试
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 数据仓库的几种建模方法
  • 小而合理的前端理论:rscss和rsjs
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 正则表达式-基础知识Review
  • ​卜东波研究员:高观点下的少儿计算思维
  • #QT(智能家居界面-界面切换)
  • $ git push -u origin master 推送到远程库出错
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)STL算法之搜索
  • (Ruby)Ubuntu12.04安装Rails环境
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (编译到47%失败)to be deleted
  • (第二周)效能测试
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (四)c52学习之旅-流水LED灯
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • ***详解账号泄露:全球约1亿用户已泄露
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .Net core 6.0 升8.0
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • /bin/bash^M: bad interpreter: No such file or directory
  • :=
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @column注解_MyBatis注解开发 -MyBatis(15)