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

[Linux#61][UDP] port | netstat | udp缓冲区 | stm32

目录

0. 预备知识

1. 端口号的划分范围

2. 认识知名端口号

3. netstat 命令

4. pidof 命令

二.UDP

0.协议的学习思路

1. UDP 协议报文格式

报头与端口映射:

2. UDP 的特点

面向数据报:

3. UDP 的缓冲区

4. UDP 使用注意事项

5. 基于 UDP 的应用层协议

STM32 微控制器

ARM 架构


应用层告一段落,我们在前面学习到了

  • 序列化和反序列化
  • 守护进程
  • 正确的读取和写入
  • 怎么定制协议
  • 协议和序列化的区别
  • 加密
  • ...

国庆后写个小结(。・∀・)

这篇文章我们就开始 传输层 的讲解啦


思维导图如下:

0. 预备知识

1. 端口号的划分范围

端口号(Port)标识了一个主机上进行通信的不同的应用程序。

  • 在TCP/IP协议中,用 “源IP”,“源端口号”,“目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看);
  • 这里协议号就相当于具体一个协议的名称,也就是标识客户端和服务器用什么协在通信。其实目的端口号就已经确定了用那个协议,如:22 ssh协议。

实际上不管是用同一个客户端上不同的请求或者不同的客户端去请求同一个服务器,都能够准确区分清楚这个请求时从哪来的。全都是得益于完整的报文。

TCP解决通信双方端口问题,IP解决通信双方IP地址问题,所以TCP/IP解决网络通信的问题。

  • 端口号长度为16位,因此范围是 0 ~ 65535
    • 0 ~ 1023:知名端口号
      • 例如:HTTP、FTP、SSH等广泛使用的应用层协议,其端口号是固定的。
    • 1024 ~ 65535:操作系统动态分配的端口号
      • 客户端程序的端口号由操作系统在这个范围内动态分配。

2. 认识知名端口号

常用的服务器端口号有固定分配,为了使用方便,常见服务器通常使用以下固定端口号:

  • SSH 服务器:22 端口
  • FTP 服务器:21 端口
  • Telnet 服务器:23 端口
  • HTTP 服务器:80 端口
  • HTTPS 服务器:443 端口

通过执行 vim /etc/services 可以查看知名端口号的详细信息。

注意:

  • 有可能是由于某种原因(如误删除或系统配置问题),该文件确实不在你的系统中。你可以通过重新安装相关的软件包来恢复这个文件。对于基于Debian的系统(如Ubuntu),可以使用如下命令:
sudo apt-get install --reinstall netbase
  • 对于基于RHEL的系统(如CentOS),可以尝试:
sudo yum reinstall initscripts
  1. 一个进程是否可以bind多个端口号? ✔️
  2. 一个端口号是否可以被多个进程bind? ✖️

数据一定是自底向上交付的,一定是从端口号唯一交付给进程,所以我们要保持从端口号到进程的唯一关系。因此2错。

一个进程绑定多个端口号并不破坏端口号到进程的唯一性,从任何端口号到进程都是唯一的,如一个进程绑定两个端口号一个端口号用来发数据,一个端口号用来发指令,因此1对。

3. netstat 命令

netstat 是用于查看网络状态的重要工具,常见选项如下:

  • n:显示数字格式,不转换为别名。
  • l:仅列出处于监听(LISTEN)状态的服务。
  • p:显示建立相关链接的程序名。
  • t:仅显示 TCP 相关选项。
  • u:仅显示 UDP 相关选项。
  • a:显示所有选项,默认不显示 LISTEN 相关。

4. pidof 命令

  • pidof 命令可以通过进程名查看对应的进程 ID。
  • xargs把管道上一个进程输入的管道的内容,以命令行参数的方式拼接在后接命令的后面


二.UDP

0.协议的学习思路

我们未来学习协议都要带着这两个问题去学习

  1. 学习所有的协议,都有它的报头和有效载荷
  2. 如何解包(如何将报头和有效载荷进行分离),如何分用

  • 报头和有效载荷如何分离
  • 有效载荷应该交付给哪一个上层协议(对应的协议字段,方案)
  • 认识报头
  • 学习该协议周边的问题

之后学习 tcp 协议格式也是这个思路~

1. UDP 协议报文格式

UDP 报文的宽度为 0-31,前 8 个字节(4 个字段)为 UDP 报头,剩余部分为有效载荷。报文包含以下信息:

  • 16 位源端口号:表示数据的来源端口。
  • 16 位目的端口号:表示数据的目的端口。
  • 16 位 UDP 长度:表示整个数据报的长度(UDP 首部 + UDP 数据)。
  • 16 位 UDP 校验和:用于检测 UDP 报文是否在传输中损坏,校验失败时报文会被丢弃。

⭕UDP 报头的封装与解包:

  • 发送数据时,传输层为数据前面添加 8 字节的 UDP 报头。
  • 接收数据时,从报文中提取前 8 个字节作为报头,其余为有效载荷。

所以所谓的报头其实就是一种结构化数据对象

一般在定协议的时候采用的是结构体或者位端的方式。

所谓的添加报头,当程序员在应用层调用sendto发送数据,这个sendto其实并没有把数据直接发送到网络里,而是把数据拷贝UDP这个协议中。

在看到UDP报文这张图,脑海中要立即想到协议就是一个结构化的数据,添加报头就是把数据放在缓冲区里然后在缓冲区前面把报头相关字段拿过来,这个报文就构建好了,继续向下交付就好了!

报头与端口映射:
  • 每个应用层进程绑定一个端口号,服务端进程显式绑定,客户端由系统动态分配。
  • 内核通过哈希表维护端口号与进程 ID 之间的映射,传输层通过端口号找到对应的应用层进程。

2. UDP 的特点

UDP 传输类似于寄信,具有以下特点:

  • 无连接:不需要建立连接,直接通过 IP 和端口号传输数据。
  • 不可靠:没有确认和重传机制,传输失败不会反馈给应用层。
  • 面向数据报:报文有明确边界,数据不会被拆分或合并。
面向数据报:
  • 报文有 16 位长度标识,UDP 按原样发送报文,接收端必须按相同方式接收。
  • 对方调sendto发送10次报文,对方必须调用recvfrom接收10次报文,次数是1:1的。

例:用UDP传输100个字节的数据

  • 如果发送端调用一次sendto,发送100个字节,那么接收端也必须调用对应的一次recvfrom,接收100个字节
  • 而不能循环调用10次recvfrom每次接收10个字节

3. UDP 的缓冲区

  • 发送缓冲区:UDP 没有真正的发送缓冲区,sendto 直接将数据交给内核处理。
  • 接收缓冲区UDP 有接收缓冲区,但不能保证接收顺序与发送顺序一致,缓冲区满时会丢弃数据。
  • 全双工UDP 的 socket 既能读,也能写,支持全双工通信。

实际上我们用的网络IO接口,其实并不直接是发送和接收窗口,是拷贝窗口!

关于上面这句话我们通过 TCP 来理解

  1. 网络IO接口与缓冲区
    • 实际使用的网络IO接口,并非直接操作发送和接收窗口,而是拷贝窗口。
    • 客户端和服务器通过TCP协议通信时,在各自的传输层维护着发送和接收缓冲区。
  1. 数据发送过程
    • 应用层使用send/write接口并不是直接将数据发送到网络中,而是先拷贝到操作系统(OS)管理的发送缓冲区。
    • OS决定何时及如何从发送缓冲区向网络发送数据,以及发送多少数据。
    • 发送的数据经过网络后到达对方的接收缓冲区。
  1. 数据接收过程
    • 接收方使用recv/read接口读取数据时,实际上是将接收到的数据从接收缓冲区拷贝到应用层定义的缓冲区。
    • 这一过程也是由OS控制,而非直接从网络读取。
  1. 接口的本质
    • read, write, sendto, recvfrom, send, recv等接口本质上执行的是内存拷贝操作。
  1. 全双工通信
    • 客户端到服务器:客户端的发送缓冲区至服务器的接收缓冲区
    • 服务器到客户端:服务器的发送缓冲区至客户端的接收缓冲区。
    • 双方都拥有独立的发送和接收缓冲区对,使得同时双向通信成为可能。
  1. 缓冲区的作用
    • 提供全双工通信支持。
    • 增强发送效率,允许应用层在数据拷贝完成后立即返回并继续执行其他任务。
    • 缓冲区处理包括数据发送时机、数量及丢包情况等,这些都由TCP协议自动管理。
  1. 生产者-消费者模式
    • 数据的产生和消费类似于生产者-消费者模式,其中一方放入数据(生产),另一方负责将数据刷新到网络或取出(消费)。
    • 此模式支持了系统中的解耦合,能够应对不同时间段内产生的负载不均问题。
    • 在正常发送情况下,通过拷贝行为代替实际发送,减少了客户端等待时间,提高了整体性能。

什么是以TCP来讲的,那UDP呢?

  • UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
  • UDP没有真正意义上的 发送缓冲区,这是因为它不需要,因为UDP把报头一加直接交给下层,它没有可靠性机制,也不需要把数据暂存下来。
  • UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报文的顺序和发送UDP报文的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃
  • UDP的socket既能读, 也能写, 这个概念叫做 全双工

理解 UDP 先描述再组织的管理:

下三层:传输,网络,数据链路,都在内核中,用 C语言写的,都是先描述再组织的管理

4. UDP 使用注意事项

  • UDP 报头中的长度字段为 16 位,因此单个 UDP 报文的最大长度为 64KB(包含 UDP 报头)。

  • 传输超过 64KB 的数据时,需在应用层手动分包传输,并在接收端拼装数据。

5. 基于 UDP 的应用层协议

  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议

当然, 也包括你自己写UDP程序时自定义的应用层协议

下篇文章讲对 TCP 协议进行讲解~


一些方向的了解:

STM32是由STMicroelectronics(意法半导体)生产的基于ARM Cortex-M内核的32位微控制器系列。而ARM本身是一个架构,它提供了多种处理器设计,从低功耗的Cortex-M系列到高性能的Cortex-A系列,广泛应用于嵌入式系统、移动设备和服务器等领域。

下面将分别简要介绍STM32和ARM在嵌入式软件方向的应用:

STM32 微控制器

特点:

  • 基于ARM Cortex-M内核。
  • 提供了广泛的性能选项,包括不同的处理速度、内存大小以及外设集。
  • 支持多种开发工具链和IDE,如Keil, IAR, 以及开源的GCC工具链。
  • 拥有丰富的生态系统,包括官方的STM32CubeMX配置工具、HAL库(硬件抽象层)、LL库(底层库)等。

软件开发方向:

  • 固件开发:使用C/C++语言编写控制微控制器及其外设的代码。
  • RTOS集成:可以与实时操作系统(例如FreeRTOS, RT-Thread)结合,以实现多任务管理。
  • 驱动程序开发:为各种传感器和其他外部设备编写驱动程序。
  • 中间件开发:开发或集成网络协议栈、文件系统、图形用户界面等中间件。
  • 安全应用利用STM32的安全特性来实现加密算法、安全启动等功能。
  • 物联网(IoT)应用:通过Wi-Fi, Bluetooth, LoRa等无线技术连接互联网。

ARM 架构

特点:

  • 广泛应用于从智能手机到服务器的各种计算平台。
  • ARM提供不同级别的处理器设计,适用于不同的应用场景。
  • 强调低功耗设计,适合电池供电的便携式设备。
  • 开放性架构,允许第三方厂商根据ARM架构设计自己的处理器。

软件开发方向:

  • 裸机编程:直接针对特定的ARM处理器进行编程,不依赖任何操作系统。
  • 嵌入式Linux/Android开发:对于更高性能需求的嵌入式系统,可以运行完整的操作系统,比如Linux或者Android。
  • 实时操作系统(RTOS):用于需要确定响应时间的应用场景,例如工业自动化。
  • 安全关键系统:在汽车电子、医疗设备等对安全性要求极高的领域中应用。
  • 高级应用程序开发:如果是在带有操作系统的ARM平台上工作,则涉及到应用程序层面的开发,这可能包括GUI开发、多媒体处理等。

无论是在STM32还是更广泛的ARM平台上,嵌入式软件工程师都需要具备良好的编程技能、理解硬件原理,并且熟悉相关的开发工具和技术文档。随着技术的发展,对于网络安全、云服务集成等方面的知识也越来越重要。

相关文章:

[Linux#61][UDP] port | netstat | udp缓冲区 | stm32

目录 0. 预备知识 1. 端口号的划分范围 2. 认识知名端口号 3. netstat 命令 4. pidof 命令 二.UDP 0.协议的学习思路 1. UDP 协议报文格式 报头与端口映射: 2. UDP 的特点 面向数据报: 3. UDP 的缓冲区 4. UDP 使用注意事项 5. 基于 UDP 的…...

定义类方法的错误总结

struct Renderer {vector<function<void(vector<string>)>> fileDropListeners;// 定义一个方法&#xff0c;它是将一个函数作为输入&#xff0c;callback是形参void print(function<void(float)> callback_func);void onFileDrop(function<void(ve…...

Redis --- 第三讲 --- 通用命令

一、get和set命令 Redis中最核心的两个命令 get 根据key来取value set 把key和value存储进去 redis是按照键值对的方式存储数据的。必须要先进入到redis客户端。 语法 set key value &#xff1a; key和value都是字符串。 对于上述这里的key value 不需要加上引号&#…...

【Linux】进程间关系与守护进程

超出能力之外的事&#xff0c; 如果永远不去做&#xff0c; 那你就永远无法进步。 --- 乌龟大师 《功夫熊猫》--- 进程间关系与守护进程 1 进程组2 会话3 控制终端4 作业控制5 守护进程 1 进程组 之前我们提到了进程的概念&#xff0c; 其实每一个进程除了有一个进程 ID(P…...

【可视化大屏】将柱状图引入到html页面中

到这里还是用的死数据&#xff0c;先将柱状图引入html页面测试一下 根据上一步echarts的使用步骤&#xff0c;引入echarts.js后需要初始化一个实例对象&#xff0c;所以新建一个index.js文件来进行创建实例化对象和配置数据信息等。 //在index.html引入<script src"j…...

gm/ID设计方法学习笔记(一)

前言&#xff1a;为什么需要gm/id &#xff08;一&#xff09;主流设计方法往往侧重于强反型区&#xff08;过驱>0.2V&#xff09;&#xff0c;低功耗设计则侧重于弱反型区&#xff08;<0&#xff09;&#xff0c;但现在缺乏对中反型区的简单和准确的手算模型。 1.对于…...

高度细化的SAGA模式实现:基于Spring Boot与RabbitMQ的跨服务事务

场景与技术栈 场景&#xff1a;电商系统中的订单创建流程&#xff0c;涉及订单服务&#xff08;Order Service&#xff09;、库存服务&#xff08;Inventory Service&#xff09;、支付服务&#xff08;Payment Service&#xff09;。 技术栈&#xff1a; Java 11 Spring Bo…...

Vue工程化开发

Vue工程化开发 一、工程化开发和脚手架 1.开发Vue的两种方式 核心包传统开发模式&#xff1a;基于html / css / js 文件&#xff0c;直接引入核心包&#xff0c;开发 Vue。工程化开发模式&#xff1a;基于构建工具&#xff08;例如&#xff1a;webpack&#xff09;的环境中开…...

Ray_Tracing_The_Next_Week下

5image Texture Mapping 图像纹理映射 我们之前虽然在交点信息新增了uv属性&#xff0c;但其实并没有使用&#xff0c;而是通过p交点笛卡尔坐标确定瓷砖纹理或者大理石噪声纹理的值 现在通过uv坐标读取图片&#xff0c;通过std_image库stbi_load&#xff08;path&#xff09;…...

ES索引生命周期管理

基于如何 定时删除ES索引过期数据 而引发的一系列关于ES索引生命周期管理ILM(Index Lifecycle Management)的学习 快速上手 &#xff1a;定时删除ES索引中的过期数据 1. ILM解决什么问题&#xff1f; ES从6.7版本引入ILM&#xff0c;通过ILM可以解决哪些问题呢? 自动新建…...

Oracle数据库体系结构基础

关于Oracle体系结构 基于Oracle11g体系结构 目标&#xff1a; 了解Oracle体系结构掌握逻辑存储结构掌握物理存储结构熟悉Oracle服务器结构熟悉常用的数据字典 Oracle数据库管理中的重要的三个概念 实例&#xff08;instance):实例是指一组Oracle后台进程以及在服务器中分配…...

QT学习笔记4.5(文件、参数文件)

QT学习笔记4.5&#xff08;文件、参数文件&#xff09; 1.保存配置参数 1.使用QSettings保存到注册表&#xff0c;ini文件 2.文件存储&#xff1a;使用 QFile 和其他类将参数保存到文本文件、二进制文件、XMLWENJIAN、JSON 文件等。 文本文件&#xff1a;以简单的键值对格式…...

服务器虚拟化的详细学习要点

服务器虚拟化的详细学习要点可以归纳为以下几个方面: 1. 基本概念与原理 定义与原理:了解服务器虚拟化是一种将物理服务器资源转化为虚拟服务器资源的技术,允许在一台物理服务器上运行多个虚拟服务器。 虚拟化层次:理解虚拟化的不同层次,如裸机虚拟化(Type 1)和托管虚…...

创建一个Java Web API项目

创建一个Java Web API涉及多个步骤和技术栈&#xff0c;包括项目设置、依赖管理、数据访问层实现、业务逻辑实现、控制层开发以及测试和部署。在这篇详解中&#xff0c;我将带领你通过一个完整的Java Web API实现流程&#xff0c;采用Spring Boot和MyBatis-Plus作为主要技术工具…...

对称加密算法的使用Java和C#

1. JAVA中的使用 1.1.原生使用 Main函数代码 import symmetric_encryption.AESExample; import symmetric_encryption.BlowfishExample; import symmetric_encryption.DESExample; import symmetric_encryption.TripleDESExample; public class App { public static…...

10款好用的开源 HarmonyOS 工具库

大家好&#xff0c;我是 V 哥&#xff0c;今天给大家分享10款好用的 HarmonyOS的工具库&#xff0c;在开发鸿蒙应用时可以用下&#xff0c;好用的工具可以简化代码&#xff0c;让你写出优雅的应用来。废话不多说&#xff0c;马上开整。 1. efTool efTool是一个功能丰富且易用…...

ubuntu22.04中备份Iptables的设置

在 Ubuntu 22.04 中备份 iptables 的设置&#xff0c;您可以采用以下几种方法&#xff1a; 使用 iptables-save 命令&#xff1a; 您可以使用 iptables-save 命令将当前的 iptables 规则保存到文件中。例如&#xff0c;要将规则保存到 /etc/iptables/rules.v4 文件中&#xff0…...

(PyTorch) 深度学习框架-介绍篇

前言 在当今科技飞速发展的时代&#xff0c;人工智能尤其是深度学习领域正以惊人的速度改变着我们的世界。从图像识别、语音处理到自然语言处理&#xff0c;深度学习技术在各个领域都取得了显著的成就&#xff0c;为解决复杂的现实问题提供了强大的工具和方法。 PyTorch 是一个…...

若依从redis中获取用户列表

因为若依放入用户的时候&#xff0c;会在减值中添加随机串&#xff0c;所以用户的key会在redis中变成&#xff1a; login_tokens:6af07052-b76d-44dd-a296-1335af03b2a6 这样的样子。 如果用 Set<Object> items redisService.redisTemplate.keys("login_tokens&…...

文件上传之%00截断(00截断)以及pikachu靶场

pikachu的文件上传和upload-lab的文件上传 目录 mime type类型 getimagesize 第12关%00截断&#xff0c; 第13关0x00截断 差不多了&#xff0c;今天先学文件上传白名单&#xff0c;在网上看了资料&#xff0c;差不多看懂了&#xff0c;但是还有几个地方需要实验一下&#…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...