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

网络原理-传输层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

上集回顾&#xff1a; 上一篇博客中讲述了应用层如何自定义协议&#xff1a;确定传输信息&#xff0c;确定数据格式 应用层也有一些现成的协议&#xff1a;HTTP协议 这一篇博客中来讲述传输层协议 传输层 socket api都是传输层协议提供的&#xff08;操作系统内核实现的了…...

C++中,如何使你设计的迭代器被标准算法库所支持。

iterator&#xff08;读写迭代器&#xff09; const_iterator&#xff08;只读迭代器&#xff09; reverse_iterator&#xff08;反向读写迭代器&#xff09; const_reverse_iterator&#xff08;反向只读迭代器&#xff09; 以经常介绍的_DList类为例&#xff0c;它的迭代…...

Java NIO 全面详解:掌握 `Path` 和 `Files` 的一切

在 Java 7 中引入的 NIO (New I/O) 为文件系统和流的操作带来了强大的能力&#xff0c;其中 Path 和 Files 是核心部分。Path 作为对文件路径的抽象&#xff0c;提供了灵活的方式处理文件系统中的路径&#xff1b;Files 则通过一系列静态方法&#xff0c;使得文件的读写、复制、…...

bluez免提协议hands-free介绍,全到无法想象,bluez hfp ag介绍

零. 前言 由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统…...

关于区块链的安全和隐私

背景 区块链技术在近年来发展迅速&#xff0c;被认为是安全计算的突破&#xff0c;但其安全和隐私问题在不同应用中的部署仍处于争论焦点。 目的 对区块链的安全和隐私进行全面综述&#xff0c;帮助读者深入了解区块链的相关概念、属性、技术和系统。 结构 首先介绍区块链…...

特征工程——一门提高机器学习性能的艺术

当前围绕人工智能(AI)和机器学习(ML)展开的许多讨论以模型为中心&#xff0c;聚焦于 ML和深度学习(DL)的最新进展。这种模型优先的方法往往对用于训练这些模型的数据关注不足&#xff0c;甚至完全忽视。类似MLOps的领域正迅速发展&#xff0c;通过系统性地训练和利用ML模型&…...

Paper解读:工作场所人机协作的团队形成:促进组织变革的目标编程模型

人工智能&#xff08;AI&#xff09;具有降低运营成本、提高效率和改善客户体验的潜力。 因此&#xff0c;在组织中组建项目团队至关重要&#xff0c;这样他们就会在决策过程中欢迎人工智能。 当前的技术革命要求公司快速变革&#xff0c;并增加了对团队在促进创新采用方面的作…...

图文深入理解Oracle Network配置管理(一)

List item 本篇图文深入介绍Oracle Network配置管理。 Oracle Network概述 Oracle Net 服务 Oracle Net 监听程序 <oracle_home>/network/admin/listener.ora <oracle_home>/network/admin/sqlnet.ora建立网络连接 要建立客户机或中间层连接&#xff0c;Oracle…...

leetcode-链表篇3

leetcode-61 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&#x…...

RAG(Retrieval Augmented Generation)及衍生框架:CRAG、Self-RAG与HyDe的深入探讨

近年来&#xff0c;随着大型语言模型&#xff08;LLMs&#xff09;的迅猛发展&#xff0c;我们在寻求更精确、更可靠的语言生成能力上取得了显著进展。其中&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09;作为一种创新方法&#xff0c;极大地…...

C语言介绍

什么是C语言 C programing language 能干什么 Hello world&#xff1f; 如何学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 包&#xff0c; Ps&#xff1a;这里是以为我已经安装好了。 udo apt install open-vm-tools-desktop -y3、最后重启就大功告成了 reboot 4、测试是否成功&#xff1a…...

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为图片&#xff0c;然后粘贴到A18单元格&#xff0c;如下图所示。 大家都知道VBA中Range对象有CopyPicture方法可以拷贝为图片&#xff0c;但是如果Range对象为非连续区域&#xff0c;那么将产生10…...

解决GitHub下载速度慢

解决GitHub下载速度慢 方法一&#xff1a;使用git clone 地址 --depth 1来下载 depth 1 表示只科隆最新的一次提交&#xff0c;也就是默认主分支&#xff0c;而不是完整地克隆整个代码仓库&#xff0c;这样可以减少下载地数据&#xff0c;加快克隆操作 可以用git clone 地址 …...

【机器学习(五)】分类和回归任务-AdaBoost算法

文章目录 一、算法概念一、算法原理&#xff08;一&#xff09;分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost 分类损失函数5、样本权重更新6、AdaBoost 的强分类器 &#xff08;二&#xff09;回归算法基本思路1、最大误差的计算2…...

【设计模式-模板】

定义 模板方法模式是一种行为设计模式&#xff0c;它在一个方法中定义了一个算法的骨架&#xff0c;并将一些步骤延迟到子类中实现。通过这种方式&#xff0c;模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。 UML图 组成角色 AbstractClass&#x…...

小程序原生-列表渲染

1. 列表渲染的基础用法 <!--渲染数组列表--> <view wx:for"{{numList}}" wx:key"*this" > 序号&#xff1a;{{index}} - 元素&#xff1a;{{item}}</view> <!--渲染对象属性--> <view wx:for"{{userInfo}}" wx:key&q…...

JAVA认识异常

目录 1. 异常的概念与体系结构 1.1 异常的概念 1. 算术异常 2. 数组越界异常 3. 空指针异常 1.2 异常的分类 1. 编译时异常 2. 运行时异常 2.1 异常的处理 防御式编程 2.2 异常的捕获 2.3.1 异常声明throws 2.3.2 try-catch捕获并处理 2.3.3 finally 总结 1. 异常…...

2024年10月计划(工作为主,Ue5独立游戏为辅,)

我发现一点&#xff0c;就是工作很忙&#xff0c;比如中秋也在远程加班&#xff0c;周末有时也远程加班&#xff0c;国庆节甚至也差点去甲方工作。甚至有可能驻场。可见&#xff0c;小公司确实不能去。 好在&#xff0c;9月份时&#xff0c;通过渲染 除了上班时间外&#xff0…...

并发、并行和异步设计

译者个人领悟,一家之言: 并发和并行确实可以明确区分出来,因为cpu的速度非常快,在执行一个任务时经常要等其他组件,比如网络,磁盘等,如果一直串行等待这样就会造成很大的浪费. (就类似于烧水的同时,可以切菜,不用等烧水完成了才去切菜,我可以烧一会水,火生起来了水壶放上了,随…...

求职Leetcode题目(12)

1.只出现一次的数字 异或运算满足交换律 a⊕bb⊕a &#xff0c;即以上运算结果与 nums 的元素顺序无关。代码如下&#xff1a; class Solution {public int singleNumber(int[] nums) {int ans 0;for(int num:nums){ans^num;}return ans;} } 2.只出现一次的数字II 这是今天滴…...

【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle

本文转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7352676.html?templateId1718516 问题现象 某些三方件&#xff0c;例如 工作流引擎activiti&#xff0c;暂未适配yashandb&#xff0c;使用中会出现如下异常&#xff1a; 问题的风险及影响 …...

Hadoop三大组件之MapReduce(一)

Hadoop之MapReduce 1. MapReduce是什么 MapReduce是一个分布式运算程序的编程框架&#xff0c;旨在帮助用户开发基于Hadoop的数据分析应用。它的核心功能是将用户编写的业务逻辑代码与自带的默认组件整合&#xff0c;形成一个完整的分布式运算程序&#xff0c;并并发运行在一…...

SQL Server 分页查询的学习文章

SQL Server 分页查询的学习文章 一、SQL Server 分页查询1. 什么是分页查询&#xff1f;2. SQL Server 的分页查询方法2.1 使用 OFFSET 和 FETCH NEXT语法&#xff1a;示例&#xff1a; 2.2 使用 ROW_NUMBER() 方法语法&#xff1a;示例&#xff1a; 2.3 性能考虑3. 总结 一、S…...

告别PDF大文件困扰!4款PDF在线压缩工具助你轻松优化!

嘿&#xff0c;档案员小伙伴们&#xff0c;今天咱们来聊聊那些让咱们在档案堆里游刃有余的神器。这些工具啊&#xff0c;简直就是咱们档案员的得力助手&#xff0c;特别是在PDF压缩这块儿&#xff0c;简直就是神器中的神器&#xff01; 1、福昕转换大师 网址&#xff1a;http…...

Find My汽车钥匙|苹果Find My技术与钥匙结合,智能防丢,全球定位

随着科技的发展&#xff0c;传统汽车钥匙向智能车钥匙发展&#xff0c;智能车钥匙是一种采用先进技术打造的汽车钥匙&#xff0c;它通过无线控制技术来实现对车门、后备箱和油箱盖等部件的远程控制。智能车钥匙的出现&#xff0c;不仅提升了汽车的安全性能&#xff0c;同时也让…...

mysql学习教程,从入门到精通,SQL UNION 运算符(27)

1、SQL UNION 运算符 UNION 运算符在 SQL 中用于合并两个或多个 SELECT 语句的结果集&#xff0c;并默认去除重复的行。如果你想要包含所有重复行&#xff0c;可以使用 UNION ALL。下面是一个使用 UNION 运算符的示例&#xff0c;假设我们有两个表&#xff1a;employees_2020 …...

开源网站搭建/怎么开网站

1. 写在前面 今天开始&#xff0c;想开启大数据框架学习的一个新系列&#xff0c;之前在学校的时候就会大数据相关技术很是好奇&#xff0c;但苦于没有实践场景&#xff0c;对这些东西并没有什么体会&#xff0c;到公司之后&#xff0c;我越发觉得大数据的相关知识很重要&…...

微信支付 网站建设/下载百度安装

互联网流量向手机倾斜&#xff0c;而手机端的APP又让浏览器变得不再举足轻重。但对于电脑用户而言&#xff0c;浏览器依然是大家日常离不开的工具&#xff1a;Opera、Chrome、IE、Edge(新老不同)、Firefox。在这其中又有多款浏览器使用了相同的内核(渲染及脚本引擎)&#xff0c…...

网站推广代运营/免费企业网站建设

1.oracle和mysql通用方法 #round(字段1,小数位数) 四舍五入select round(11.123456,4);结果&#xff1a;11.1235 2.mysql的另外2种保留小数位数方法#convert(字段1,decimal(最大长度,小数位数)) 四舍五入select convert(11.123456,decimal(9,4));结果&#xff1a;11.1235 #cast…...

公司网站设计很好的/网络营销工具包括

浑浑噩噩已经走了这么长时间了&#xff0c;那么&#xff0c;留下点什么吧。 一种积累&#xff0c;一种出口。 转载于:https://www.cnblogs.com/Peong/p/10438157.html...

网页模版素材下载/seo网址优化靠谱

点击上面蓝色小字或微信搜索【幼儿教案】关注公众号每天免费8篇优质教案幼儿园中班语言活动教案&#xff1a;十二生肖设计意图在几千年的中国传统文化中&#xff0c;生肖不仅是一种形象生动的纪年、纪月的方法&#xff0c;更已与每个人结合起来&#xff0c;赋予了一种神奇的性格…...

厚街网站建设价格/手机百度2020

Soul网关源码阅读(八)路由匹配初探简介今日看看路由的匹配相关代码&#xff0c;查看HTTP的DividePlugin匹配示例运行使用HTTP的示例&#xff0c;运行Soul-Admin&#xff0c;Soul-Bootstrap&#xff0c;Soul-Example-HTTP记得启动数据库docker run --name mysql -p 3306:3306 -e…...