嵌入式TCP/IP协议栈-LwIP

news2024/11/17 17:32:24

文章目录

    • LWIP是什么
    • 基础知识
      • OSI七层模型
      • TCP/IP五层模型
      • LwIP的模型
      • 常见协议
        • ARP协议
        • ICMP协议
        • DHCP协议
        • DNS协议
    • LwIP API
    • Socket
      • 大端模式与小端模式
      • 地址字节序
      • IP地址转换
    • 网络并发

LWIP是什么

LWIP是一个轻量级的TCP/IP协议栈,其全称为Lightweight IP,它专门为小型嵌入式系统设计,具有占用资源少、易于移植、可裁剪性高等特点。

LWIP的设计目的是为嵌入式设备提供一个高效的TCP/IP协议栈,以便这些设备可以方便地访问Internet或局域网。它支持IPv4和IPv6协议,并实现了TCP、UDP、IP、ICMP、ARP、DNS等协议,可以满足各种嵌入式设备的网络通信需求。

LWIP的源代码开放,可以在开源协议下自由使用和修改。它已经被广泛应用于各种嵌入式系统,如ARM、AVR、MSP430等,以及各种嵌入式操作系统,如FreeRTOS、uC/OS、VxWorks等。

基础知识

OSI七层模型

img

TCP/IP五层模型

img

LwIP的模型

image-20230509114527330

常见协议

ARP协议

ARP(Address Resolution Protocol)协议是用于在网络层(如IPv4)和链路层(如以太网)之间进行地址解析的协议。它的主要功能是将一个IP地址解析为对应的物理地址(如MAC地址),以便能够在网络上发送数据包。

当一个主机需要向另一个主机发送数据包时,它需要知道目标主机的物理地址,而这个物理地址可以通过发送ARP请求来获取。ARP请求包含源主机的IP地址和MAC地址,以及目标主机的IP地址,当目标主机收到ARP请求后,会将自己的MAC地址作为响应发送给源主机,从而实现了地址解析。

ICMP协议

ICMP(Internet Control Message Protocol)协议是一种在互联网协议(IP)网络中使用的控制协议,用于在网络中传递错误和状态信息。它的主要作用是帮助网络管理员和网络应用程序发现和诊断网络中的问题,以便进行相应的处理。

ICMP协议常用于网络中的诊断和测量,它可以用于测试网络是否能够正常连接、测试网络的响应时间和带宽等。ICMP协议的消息被称为ICMP报文,它们被封装在IP数据报中进行传输。

ICMP协议可以发送多种类型的消息,其中一些常见的消息类型包括:

  1. 回显请求和回显应答:用于测试网络是否能够正常连接;
  2. 目的地不可达消息:用于指示数据包无法到达目标主机;
  3. 时间超过消息:用于指示数据包在传输过程中超时;
  4. 重定向消息:用于指示主机将数据包发送到另一个网关。

总的来说,ICMP协议在互联网协议(IP)网络中扮演着重要的角色,它能够帮助网络管理员和网络应用程序发现和诊断网络中的问题,并提供一些基本的网络测试和诊断工具。

DHCP协议

DHCP(Dynamic Host Configuration Protocol)是一种用于动态分配IP地址和其他网络配置信息的协议。DHCP允许网络管理员从一个中心位置管理和分配IP地址,以及其他网络配置信息,如子网掩码、默认网关和DNS服务器等。

DHCP协议的工作方式如下:

  1. 客户端主机发送一个DHCP请求广播,以请求IP地址和其他配置信息;
  2. DHCP服务器接收到请求后,为客户端主机分配一个可用的IP地址,并将其他网络配置信息一并发送给客户端主机;
  3. 客户端主机接收到DHCP响应后,使用分配的IP地址和其他配置信息连接到网络。

DHCP协议可以减轻网络管理员的工作负担,因为它可以自动管理和分配IP地址,而无需手动分配每个主机的IP地址和其他配置信息。此外,DHCP还支持地址重用和地址租用,可以将已经不再使用的IP地址分配给其他主机使用,从而提高IP地址的利用率。

总的来说,DHCP协议是一个简单而有效的协议,它为网络管理员提供了一种简单的方法来管理和分配IP地址和其他网络配置信息。它能够减轻网络管理员的工作负担,同时提高网络的可管理性和可扩展性。

DNS协议

DNS(Domain Name System)是一种用于将域名解析为IP地址的分布式数据库系统。它充当了互联网中的“电话簿”,将易于记忆的域名转换为计算机更易处理的IP地址。

DNS的工作原理如下:

  1. 客户端主机向本地DNS服务器发出域名解析请求;
  2. 如果本地DNS服务器具有所需的解析信息,则它会将该信息返回给客户端主机;
  3. 如果本地DNS服务器没有所需的解析信息,则它将向其他DNS服务器发送查询请求,直到找到所需的解析信息为止;
  4. 找到所需的解析信息后,本地DNS服务器会将该信息缓存起来,以便在将来的查询中更快地响应。

DNS具有以下几个重要的特点:

  1. 分布式:DNS数据库分布在多个服务器上,没有单个服务器拥有完整的数据库。
  2. 层次结构:DNS数据库被组织成一个层次结构,顶级域名服务器位于最上层,而每个域名的子域名服务器位于下一层。
  3. 快速:DNS可以使用本地缓存和分布式数据库来加快解析速度。
  4. 动态:DNS数据库可以随时更改,以反映新的IP地址和域名映射关系。

总的来说,DNS是互联网中非常重要的一个组成部分,它能够将易于记忆的域名转换为计算机更易处理的IP地址,为互联网用户提供了更方便的访问方式。

LwIP API

LwIP协议包含以下6部分API

  1. Socket API:提供了类似于BSD socket API的接口,包括socket()、bind()、listen()、accept()、connect()、recv()和send()等函数,使得开发人员可以使用熟悉的套接字编程模型来实现网络通信。
  2. Netconn API:提供了一组基于连接的API,包括netconn_new()、netconn_bind()、netconn_listen()、netconn_accept()、netconn_connect()、netconn_recv()和netconn_send()等函数,使得开发人员可以通过连接来实现网络通信。
  3. Raw API:提供了一组原始的API,包括raw_new()、raw_bind()、raw_sendto()和raw_recv()等函数,使得开发人员可以直接访问网络数据包,实现更高级别的网络协议。
  4. SNMP API:提供了一组简单网络管理协议(SNMP)API,包括snmp_init()、snmp_get_value()和snmp_set_value()等函数,使得开发人员可以实现远程设备管理和监控。
  5. DNS API:提供了一组域名解析系统(DNS)API,包括dns_gethostbyname()函数,使得开发人员可以实现通过域名解析获取IP地址的功能。
  6. PPP API:提供了一组点对点协议(PPP)API,包括ppp_connect()和ppp_close()等函数,使得开发人员可以实现在串口上使用PPP协议进行网络通信。

使用方法待补充

tcp_new

tcp_bind

tcp_listen

tcp_accept

tcp_connect

tcp_write

tcp_sent

tcp_recv

tcp_recved

轮询

tcp_poll

tcp_close

tcp_err

tcp_abort

Socket

LwIP除了提供Raw API,还提供了Socket编程接口,因为Socket最初在UNIX上使用,所以使用LwIP进行Socket编程通常需要在操作系统的支持下进行,可以使用常见的FreeRTOS以便实现更高效、更稳定的网络通信。

Socket是一种计算机网络通信中的编程接口(API),它提供了一种标准的方法,使得应用程序可以通过网络与其他应用程序进行通信。Socket通常用于在网络中实现客户端和服务器之间的通信,而且是基于TCP/IP协议族的通信。

使用Socket的好处是Socket可以将网络模型中底层的协议以及硬件接口进行抽象,统一操作接口,方便跨平台移植。

LwIP的Socket接口与Linux的功能大体一致,详见Linux网络IO基础

image-20230509110830446

大端模式与小端模式

高位存在低地址处,低位存在高地址处是大端模式

     +------+------+------+------+------+------+------+------+
addr |  0   |  1   |  2   |  3   |  4   |  5   |  6   |  7   |
     +------+------+------+------+------+------+------+------+
byte |  12  |  34  |      |      |      |      |      |      |
     +------+------+------+------+------+------+------+------+

高位存在高地址处,低位存在低地址处是小端模式

     +------+------+------+------+------+------+------+------+
addr |  0   |  1   |  2   |  3   |  4   |  5   |  6   |  7   |
     +------+------+------+------+------+------+------+------+
byte |  34  |  12  |      |      |      |      |      |      |
     +------+------+------+------+------+------+------+------+

网络协议通常采用大端模式,因为不同的计算机使用的字节序可能不同,通过规定使用大端模式可以保证数据的互相传输的正确性,因此需要使用字节序转换的API

地址字节序

相关API

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

h表示host主机,to就是to,n是net网络,l是long,s是short

htonl的意思是host to network long主机字节序转换为网络字节序(32位)

常用于将端口号或者主机号转换为二进制以便计算机识别

IP地址转换

//将IP地址(IPv4或IPv6)从文本格式转换为网络格式的函数
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);

//将网络格式的IP地址(IPv4或IPv6)转换为文本格式
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

参数:

  • 参数af表示要转换的地址族,可以是AF_INET或AF_INET6,分别表示IPv4和IPv6;
  • 参数src是包含要转换的IP地址的字符串;
  • 参数dst是指向存放转换后的地址的缓冲区的指针。

返回值:

  • 返回0表示转换失败
  • 返回1表示转换成功
  • 如果src参数无效,则返回-1。
//将一个点分十进制形式的IPv4地址转换为32位无符号整数表示的网络字节序
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
  • cp参数是指向点分十进制形式IPv4地址字符串的指针。
  • 函数返回值是转换后的32位无符号整数,如果转换失败则返回INADDR_NONE

注意,inet_addr返回的是网络字节序的32位无符号整数表示,需要使用网络字节序转主机字节序的函数(例如ntohl)进行转换后才能得到可读性较强的IP地址表示。

inet_addrinet_pton都是用来将IP地址转换为网络字节序的整数表示的函数,不同之处在于:

  • inet_addr函数将一个点分十进制字符串形式的IP地址转换为一个32位的整数。这个函数在处理不合法的IP地址时会返回INADDR_NONE宏定义的无效IP地址值。
  • inet_pton函数则是将一个点分十进制字符串形式的IP地址转换为一个二进制的网络字节序的IP地址,并存储在一个指定的内存中。同时,它支持IPv4和IPv6两种地址格式的转换。

因为inet_addr存在一些缺陷和安全问题,所以在实际使用中推荐使用inet_pton来完成IP地址的转换。此外,对于IPv6地址的转换,只有inet_pton可以支持。


后续待补充

网络并发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UNIX网络编程卷一 学习笔记 第十二章 IPv4与IPv6的互操作性

未来数年内&#xff0c;因特网也许会逐渐从IPv4过渡到IPv6&#xff0c;在过渡阶段&#xff0c;基于IPv4的现有应用能与基于IPv6的全新应用协同工作非常重要。例如&#xff0c;厂商不应只提供仅能与IPv6 telnet服务器程序协同工作的telnet客户程序&#xff0c;而应该提供既能与I…

环境搭建:Visual Studio的安装和创建C++项目

Visual Studio的安装和创建C项目 引言前言下载Visual Studio安装包安装Visual Studio创建项目小结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&#xff0c;理论与代码实践结合&#xff0c;让世界没有难学的技术。 &#x1f449; &#x1f396;️ C…

第五十章 Unity Input Manager 输入系统(上)

Unity的输入系统支持多种输入设备&#xff0c;比如键盘和鼠标&#xff0c;游戏手柄&#xff0c;触摸屏&#xff0c;VR和AR控制器等等。Unity 通过两个独立的系统提供输入支持&#xff1a;第一&#xff0c;输入管理器 (Input Manager) 是 Unity 核心平台的一部分&#xff0c;默认…

数据可视化一、ECharts

零、文章目录 数据可视化一、ECharts 1、数据可视化 &#xff08;1&#xff09;数据可视化 数据可视化主要目的&#xff1a;借助于图形化手段&#xff0c;清晰有效地传达与沟通信息。数据可视化可以把数据从冰冷的数字转换成图形&#xff0c;揭示蕴含在数据中的规律和道理。…

TGANet:用于改进息肉分割的文本引导注意力

文章目录 TGANet: Text-Guided Attention for Improved Polyp Segmentation摘要本文方法编码器模块Feature Enhancement ModuleLabel AttentiondecoderMulti-scale Feature Aggregation损失函数 实验结果 TGANet: Text-Guided Attention for Improved Polyp Segmentation 摘要…

2023年湖北建设厅特种工报名需要什么条件?报名流程是什么?

2023年湖北建设厅特种工报名需要什么条件&#xff1f;报名流程是什么&#xff1f; 建设厅特种工现在已经开始报名考试安排计划了&#xff0c;想要报考建设厅特种工的现在可以了解一下具体的流程以及相关信息哟。为自己报名考试做准备&#xff0c;下面启程别就来给您介绍一下建设…

从入门到精通:接口自动化测试中加密、解密和Sign签名的完整指南

【专业解读】接口自动化测试安全机制剖析&#xff1a;加密、解密和sign签名技术原理与应用&#xff01; 目录 摘要&#xff1a; 1. 加密 2. 解密 3. Sign签名 4. 示例 摘要&#xff1a; 在进行接口自动化测试时&#xff0c;加密、解密和sign签名是非常重要的步骤。这些过…

基于单片机的数字频率计设计

数字频率计概述 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号&#xff0c;方波信号及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试…

基于AT89C52单片机的温度检测设计与仿真

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87770153 源码获取 主要内容: 本设计是基于52系列的单片机进行的设计,可以完成温度的测控,可以实现实际温度与设定温度区域的比较,并在LED上相应的显示结果。设计过程在硬…

算法 DAY57 动态规划13 647. 回文子串 516.最长回文子序列

647. 回文子串 暴力解法&#xff1a;两层for循环&#xff0c;再加一个判断是否是回文子串&#xff0c;时间复杂度O(n3) 五部曲 1、 判断一个子字符串&#xff08;字符串的下表范围[i,j]&#xff09;是否回文&#xff0c;依赖于&#xff0c;子字符串&#xff08;下表范围[i 1,…

CLion安装(详细步骤+截图)

目录 一、CLion-2021.1.3.exe 下载 二、运行环境mingw-w64压缩包下载 三、 安装插件 ---- ide-eval-resetter-2.1.13压缩包下载 一、CLion-2021.1.3.exe 下载 Other Versions - CLion (jetbrains.com) 1、下载 2、更改路径 &#xff08;不要放在含有中文的路径下&a…

【Java面试】Java基础-集合相关知识点(1)

文章目录 1. 集合有哪些类&#xff1f;2. ArrayList3. Map主要有哪些类&#xff1f; 容器主要包括 Collection 和 Map 两种&#xff0c;Collection 存储着对象的集合&#xff0c;而 Map 存储着键值对(两个对象)的映射表。 1. 集合有哪些类&#xff1f; 集合是一组相关对象的容…

ThreadLocal底层源码解析

线程隔离&#xff0c;保证多线性访问安全 每个线程拿到的值私有&#xff0c;相互不干扰 ThreadLocal是JDK包提供的&#xff0c;它提供线程本地变量&#xff0c;如果创建一乐ThreadLocal变量&#xff0c;那么访问这个变量的每个线程都会有这个变量的一个副本&#xff0c;在实际…

跳槽? 我只想多赚点罢了

前言 五一过后也就也就意味着今年的金三银四跳槽季正式结束了&#xff0c;不知道大家是否拿到了offer&#xff0c;面对金三银四的招聘旺季&#xff0c;如果没有精心准备那笔者认为那是对自己不负责任&#xff1b;就我们测试员来说&#xff0c;多数的公司总体上面试都是以自我介…

表的存储原理(数据库)

目录 一、内部存储概述 二、 数据行&#xff08;记录&#xff09;结构 1、定长记录 2、变长记录 一、内部存储概述 表是有关某个特定实例的数据集合&#xff0c;在关系数据库中处于核心地位。 创建一个表&#xff0c;就会有一行或多行插入到用来管理这个表的多个系统表里。…

如何压缩照片大小不大于200k

如何压缩照片大小不大于200k&#xff1f;有时候需要压缩照片大小不大于200k是因为在一些场景下&#xff0c;上传或传输大文件会受到限制&#xff0c;例如通过电子邮件发送、上传到云存储空间等等。在这种情况下&#xff0c;压缩照片可以让图片更容易地传输和分享&#xff0c;并…

基于simulink进行音频波束成形系统的多核仿真

一、前言 此示例展示了 Simulink中的音频波束成形系统仿真模型如何使用数据流域提高性能。它使用 Simulink 中的数据流域自动将通信系统的数据驱动部分划分为多个线程&#xff0c;从而通过在桌面的多个内核上执行模拟来提高仿真的性能。 二、介绍 数据流执行域允许您在计算密集…

Docker Overlay2占用大量磁盘空间解决

问题 最近项目的jenkins编译时报错 FATAL: Unable to produce a script filejava.io.IOException: No space left on deviceat java.io.UnixFileSystem.createFileExclusively(Native Method)at java.io.File.createTempFile(File.java:2024)at hudson.FilePath$CreateTextTem…

#vue项目冗余请求处理#http://localhost:8080/sockjs-node/info?t=1683604231866

目录 前言一、为什么会出现这个请求&#xff1f;二、解决方法1.修改源码 总结 前言 提示&#xff1a;本文要记录的大概内容&#xff1a; 在我的vue项目中&#xff0c;开发环境下&#xff0c;一直重复发请求&#xff1a;http://localhost:8080/sockjs-node/info?t16836042318…

《花雕学AI》33:如何用XMind制作AI思维导图、鱼骨图和组织结构图

思维导图是一种有效的思维工具&#xff0c;它可以帮助我们整理信息&#xff0c;激发创意&#xff0c;提高效率。思维导图是一种以中心主题为核心&#xff0c;以分支结构为形式&#xff0c;以关键词和图像为内容的图形表示法。它可以让我们一目了然地看到知识的层次和逻辑&#…