网络原理-传输层UDP
上集回顾:
上一篇博客中讲述了应用层如何自定义协议:确定传输信息,确定数据格式
应用层也有一些现成的协议:HTTP协议
这一篇博客中来讲述传输层协议
传输层
socket api都是传输层协议提供的(操作系统内核实现的了),IP地址(确定主机,网络层提供的概念)+端口号(主机上的应用程序,传输层提供的概念),端口号是一个整数,2个字节表示的无符号整数(0 - 65535),< 1024的端口号拿出来,称为“知名端口号”,把这些端口号分配给一些比较知名的服务器程序作为这些服务器的“默认端口号”,同一个机器上,同一时刻内,端口号不能重复被绑定

![]()
如何确认,在当前机器上,某个端口号是否被其他进程使用了呢?
netstat命令,查询出当前主机上是否使用8080端口的进程

后面就是绑定了主机端口的进程的id,之前绑定端口号的时候,没有做特殊指定,就把ipv4和ipv6两个协议的ip地址的9090都给绑定了,此时意味着,客户端可以使用ipv4来访问也可以使用ipv6来访问,也可以增加一些选项,只针对ipv4和ipv6来帮顶
两个进程,不能同时绑定同一个端口号,除非一个是UDP,一个是TCP,但是如果是两个UDP或者两个TCP,就会出现绑定失败的情况了,有一个进程A同时绑定10000,10001,10002是可以的,但是不能一个端口号同时被多个进程所绑定
一个进程绑定多个端口号比较常见:
- 一个服务器程序,首先服务器需要有一个端口号,给客户端提供服务,这样的端口称为”业务端口“,给普通用户使用的
- 如果程序员需要对这个服务器进行更精细的控制,比如控制让这个服务器重新加载配置/开启某个功能/重新启动/重新加载数据/修改某个选项设定,这样的操作,经常会通过网络来进行操作,服务器就会另外绑定一个端口号,称为“管理端口”,程序员想对这个服务器进行管理操作,就通过管理端口给服务器发送一些对应的请求,服务器执行对应的逻辑(搞个后门,给指定用户的账户余额增加1000,这样的操作势必要通过管理端口,不能通过业务端口)
- 日常开发会遇到一些bug,需要去查看服务器的一些运行状态(比如服务器中的一些关键的变量是什么样的值),服务器不能直接用调试器去调试(调试器一调试就会把服务器阻塞住,无法给别的客户端提供服务了),也会通过网络的方式,给服务器发调试请求,服务器返回对应的关键信息,称为“调试接口”
传输层主要为两个协议:UDP(无连接,不可靠传输,面向数据报,全双工)和TCP(有连接,可靠传输,面向字节流,全双工)
UDP
学习一个网络协议,最主要就是学习报文格式,对于UDP协议来说,应用层数据到达UDP之后,就会给应用层数据报前面拼装上UDP报头
UDP结构
UDP数据报 = UDP报头 + UDP载荷

UDP各个部分
每个部分,都有特定的含义,UDP长度,描述了整个UDP数据报,占多少个字节,UDP长度,描述了整个UDP数据报,占多少个字节,通过UDP长度,就能知道,当前载荷一共是多少字节

64kb,一个UDP数据报,最长就是64KB,不能更长了,有点短了,使用UDP开发程序,就会有很大的制约,确保传输的单个数据报,不能超过64KB
Question:既然UDP有上述限制,为啥发明UDP的大佬不对UDP做出改进升级呢?比如把报头中报文长度字段改成4字节,或者更长呢?
Answer:最初UDP诞生上个世纪70年代,当时设计成2个字节64KB是比较充裕的,升级上述的报头,不是技术问题,而是zz问题,升级到更高的字节数,成本非常高,单个主机升级,是没有意义的,需要对端也一起升级,世界上任何一个主机,都可能是发送端,也都可能是接收端,要升级,就得全世界所有的主机一起升级,所以,相比于对UDP升级,未来诞生新的协议,取代UDP,可能是更靠谱一些
UDP校验和
关于校验和(checksum)
比特翻转 0101二进制数据(电信号,光信号,电磁波),本来你传输的是0,时机到了对端变成了1,或者本来传的是1,到了对端变成了0,此时如果传输过程中遇到了一个变化的磁场,此时就会可能把本来的低电平变成高电平/高电平变成低电平;再比如,光信号,也可能会收到一些高能离子束的影响
此时就需要能够有办法,对传输的数据进行校验
- 能够发现是否出错
- 最好能发现是哪一位出错,并且能够进行纠错(代价大)
本质都是要引入额外的冗余信息,在UDP中,校验和只能够做到第一层,发现是否有错
假设多个bit位都发生改变,导致错误的数据和之前正确的数据得到了相同的数据和,理论上存在,实际上出现的概率非常低,主机A通过校验和转过去UDP数据报,B在这边按照同样的算法,针对数据内容,再算一遍校验和,得到校验和2,此时如果不一致,就说明传输出现问题了(比特翻转了)
UDP中使用的CRC算法进行校验和,CRC是一个简单粗暴的计算校验和的方式,循环冗余校验,设定2个字节的变量,把数据的每个字节取出来,往这个变量上进行累加,如果结果溢出,超出2个字节,溢出部分就舍弃,从AI中可以得出
循环冗余检查(Cyclic Redundancy Check,CRC)是一种广泛用于错误检测的算法,尤其是在数据通信和存储领域UDP协议中使用的校验和计算方法与CRC算法类似,但并不完全相同UDP校验和的计算方法是基于多项式算法的,它使用CRC的思想,但具体的实现和多项式可能有所不同
UDP校验和的计算过程大致如下:
- 准备数据:将UDP数据报的伪首部、首部和数据部分连续排列起来,形成一个待校验的数据序列
- 选择多项式:选择一个预定义的二进制多项式,这个多项式用于计算CRC在UDP中,通常使用的是CRC-16或CRC-32多项式,如CRC-16-CCITT或CRC-32标准多项式
- 除法运算:将待校验的数据序列视为一个大的二进制数,然后将这个二进制数除以选定的多项式这个除法运算是在模2算数下进行的,也就是说,不使用进位
- 得到余数:除法运算的余数就是CRC校验和这个余数通常是一个固定长度的二进制数,例如16位或32位
- 附加校验和:将计算得到的余数(CRC校验和)附加到UDP数据报的首部校验和字段中
- 接收端验证:接收端收到UDP数据报后,使用相同的多项式对数据报进行同样的除法运算如果余数为零,则认为数据报在传输过程中没有发生错误;如果余数非零,则认为数据报可能已经损坏
UDP校验和的计算方法可以有效地检测出数据在传输过程中的意外变化,包括单个比特的错误、双比特的错误以及数据的丢失和重复然而,它不能检测到所有的错误类型,比如数据的顺序错误,也不能对错误进行纠正
需要注意的是,UDP校验和是可选的,并且在某些情况下可能被禁用此外,由于网络环境的复杂性,即使校验和检测到错误,UDP协议也不会采取任何纠正措施,如重传数据报,这是UDP作为无连接、不可靠传输协议的特点
除了CRC算法,还有一个比较常见的方法:md5,md5是一个比较广泛的方法,最初就是一个字符串hash算法
MD5特点:
- 定长:无论输入的内容是多长,得到的结果,一定是固定长度
- 分散:输入的内容,哪怕只改变一点点,最终结果都会差异很大
- 不可逆:通过原数据,计算md5,成本很低
通过在线md5加密网站
12345689通过md5加密可得
8E16EF456BC3698E7E568D1ED923206D
还有另一个比较常见的hash算法:
sha1算法
123456789通过sha1加密可得
F7C3BC1D808E04732ADF679965CCC34CA7AE3441
UDP现在最主要的用途:
应用于对于性能要求比较高,但是对于可靠性要求不高的场景
分布式系统中,多个服务器之间的相互通信(多个机器在同一个机房里,网络结构简单 & 带宽充裕)
没有硬盘的电脑(网吧的电脑),网吧的电脑的硬盘都是通过网络映射的,网吧有个服务器,硬盘很大,所有的网吧的电脑的硬盘,都是从这个服务器这里映射过来,去网吧,如何不通过网管就能开机器?都是有技巧的!!
相关文章:
网络原理-传输层UDP
上集回顾: 上一篇博客中讲述了应用层如何自定义协议:确定传输信息,确定数据格式 应用层也有一些现成的协议:HTTP协议 这一篇博客中来讲述传输层协议 传输层 socket api都是传输层协议提供的(操作系统内核实现的了…...
C++中,如何使你设计的迭代器被标准算法库所支持。
iterator(读写迭代器) const_iterator(只读迭代器) reverse_iterator(反向读写迭代器) const_reverse_iterator(反向只读迭代器) 以经常介绍的_DList类为例,它的迭代…...
Java NIO 全面详解:掌握 `Path` 和 `Files` 的一切
在 Java 7 中引入的 NIO (New I/O) 为文件系统和流的操作带来了强大的能力,其中 Path 和 Files 是核心部分。Path 作为对文件路径的抽象,提供了灵活的方式处理文件系统中的路径;Files 则通过一系列静态方法,使得文件的读写、复制、…...
bluez免提协议hands-free介绍,全到无法想象,bluez hfp ag介绍
零. 前言 由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统…...
关于区块链的安全和隐私
背景 区块链技术在近年来发展迅速,被认为是安全计算的突破,但其安全和隐私问题在不同应用中的部署仍处于争论焦点。 目的 对区块链的安全和隐私进行全面综述,帮助读者深入了解区块链的相关概念、属性、技术和系统。 结构 首先介绍区块链…...
特征工程——一门提高机器学习性能的艺术
当前围绕人工智能(AI)和机器学习(ML)展开的许多讨论以模型为中心,聚焦于 ML和深度学习(DL)的最新进展。这种模型优先的方法往往对用于训练这些模型的数据关注不足,甚至完全忽视。类似MLOps的领域正迅速发展,通过系统性地训练和利用ML模型&…...
Paper解读:工作场所人机协作的团队形成:促进组织变革的目标编程模型
人工智能(AI)具有降低运营成本、提高效率和改善客户体验的潜力。 因此,在组织中组建项目团队至关重要,这样他们就会在决策过程中欢迎人工智能。 当前的技术革命要求公司快速变革,并增加了对团队在促进创新采用方面的作…...
图文深入理解Oracle Network配置管理(一)
List item 本篇图文深入介绍Oracle Network配置管理。 Oracle Network概述 Oracle Net 服务 Oracle Net 监听程序 <oracle_home>/network/admin/listener.ora <oracle_home>/network/admin/sqlnet.ora建立网络连接 要建立客户机或中间层连接,Oracle…...
leetcode-链表篇3
leetcode-61 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3]示例 2: 输入:head [0,1,2], k 4 输出&#x…...
RAG(Retrieval Augmented Generation)及衍生框架:CRAG、Self-RAG与HyDe的深入探讨
近年来,随着大型语言模型(LLMs)的迅猛发展,我们在寻求更精确、更可靠的语言生成能力上取得了显著进展。其中,检索增强生成(Retrieval-Augmented Generation)作为一种创新方法,极大地…...
C语言介绍
什么是C语言 C programing language 能干什么 Hello world? 如何学C语言 no reading no learning...
损失函数篇 | YOLOv10 更换损失函数之 MPDIoU | 《2023 一种用于高效准确的边界框回归的损失函数》
论文地址:https://arxiv.org/pdf/2307.07662v1.pdf 边界框回归(Bounding Box Regression,BBR)在目标检测和实例分割中得到了广泛应用,是目标定位的重要步骤。然而,对于边界框回归的大多数现有损失函数来说,当预测的边界框与真值边界框具有相同的长宽比,但宽度和高度的…...
WMware安装WMware Tools(Linux~Ubuntu)
1、这里终端里面输入sudo apt upgrade用于更新最新的包 sudo apt upgrade 2、安装 open-vm-tools-desktop 包, Ps:这里是以为我已经安装好了。 udo apt install open-vm-tools-desktop -y3、最后重启就大功告成了 reboot 4、测试是否成功:…...
SLAM ORB-SLAM2(30)关键帧跟踪
SLAM ORB-SLAM2(30)关键帧跟踪 1. 关键帧跟踪2. TrackReferenceKeyFrame2.1. 将当前普通帧的描述子转化为BoW向量2.2. 通过词袋BoW加速当前帧与参考帧之间的特征点匹配2.3. 将上一帧的位姿态作为当前帧位姿的初始值2.4. 通过优化3D-2D的重投影误差来获得位姿2.5. 剔除优化后的…...
k8s 部署 prometheus
创建namespace prometheus-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: ns-prometheus拉取镜像 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/quay.io/prometheus/prometheus:v2.54.0prometheus配置文件configmap prometheus-configmap.yaml …...
使用VBA快速生成Excel工作表非连续列图片快照
Excel中示例数据如下图所示。 现在需要拷贝A2:A15,D2:D15,J2:J15,L2:L15,R2:R15为图片,然后粘贴到A18单元格,如下图所示。 大家都知道VBA中Range对象有CopyPicture方法可以拷贝为图片,但是如果Range对象为非连续区域,那么将产生10…...
解决GitHub下载速度慢
解决GitHub下载速度慢 方法一:使用git clone 地址 --depth 1来下载 depth 1 表示只科隆最新的一次提交,也就是默认主分支,而不是完整地克隆整个代码仓库,这样可以减少下载地数据,加快克隆操作 可以用git clone 地址 …...
【机器学习(五)】分类和回归任务-AdaBoost算法
文章目录 一、算法概念一、算法原理(一)分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost 分类损失函数5、样本权重更新6、AdaBoost 的强分类器 (二)回归算法基本思路1、最大误差的计算2…...
【设计模式-模板】
定义 模板方法模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,并将一些步骤延迟到子类中实现。通过这种方式,模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。 UML图 组成角色 AbstractClass&#x…...
小程序原生-列表渲染
1. 列表渲染的基础用法 <!--渲染数组列表--> <view wx:for"{{numList}}" wx:key"*this" > 序号:{{index}} - 元素:{{item}}</view> <!--渲染对象属性--> <view wx:for"{{userInfo}}" wx:key&q…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
