UDP协议详解

news/2024/11/9 1:47:10/

目录

前言:

再谈协议

UDP协议

 比较知名的校验和

小结:


前言:

    UDP和TCP作为传输层非常知名的两个协议,那么将数据从应用层到传输层数据是怎样进行打包的?具体都会增加一些什么样的报头,下面内容详细介绍。

再谈协议

    所谓协议就是双方约定的一种数据组织的格式。发送方按照约定来将数据进行封装,接收方同样也按照这样的格式进行解析。UDP是传输层协议,而上面的应用层也有相应的协议。一般应用层协议都是自定义的。

    应用层业务是错综复杂的,没有办法使用一个大协议去规定所有业务的数据格式(很难有一个通用的协议,满足所有业务需求)。需要根据不同场景,不同业务使用相对适合的协议去约定数据的组织格式。

自定义协议首先要明确两点:

    1)结合需求分析清楚,请求响应(客户端,服务器之间)要传递哪些数据。

    2)明确数据以什么样的格式组织。客户端按照这样的协议组织数据,服务端同样按照这样格式去解析数据。

典型的数据组织格式:

    1)XML标签化的数据组织方式,使用标签来表示键值对,用嵌套的方式表示树形结构。

    2)json现在比较流行的数据组织格式。针对XML进行改进,使用大括号的方式来组织。

    3)protobuffer谷歌研发的一种数据组织格式。二进制数据表示方式,针对数据通过二进制表示方式进行压缩。直观的不能观察,但是占用空间小,传输的带宽就降低了。

UDP协议

    UDP协议针对要发送的数据进行封装,原始数据称为“载荷”(payload)。所封装的一些数据称为“报头”。

    这张图在一些技术书籍上很常见,但实际这样画不是很确切。(书上为了排版方便)

解释:

1)

    源端口,目的端口是一次通信中的五元组之二。指定发送方端口和接收方端口。

    由于只有两个字节,无符号数范围就是0 -- 65535。因此端口号就需要在这个范围内, 0 -- 1023范围内端口号被称为知名端口号,就是比较知名的程序使用的端口号。我们在设置端口号不建议使用知名端口号,虽然知名端口号并没有全部使用完0 -- 1023范围内的所有端口,但是也是很可能产生端口冲突,导致程序抛异常。

2)

    UDP报文长度指的是整个报文的长度。由于两个字节最大表示数据是65535,那么UDP报文长度最大也就是64kb。使用UDP一次最大传输64kb大小的报文。

    那么如果我们要传输的数据大于64kb呢?将报文进行拆包,控制每个报文大小在64k以内。或者直接将UDP协议改为TCP协议传输。

3)

    校验和,验证数据传输是否正确。高电平或者低电平,波长大的光信号或者波长小的光信号表示1和0,由于物理原因可能存在“比特位反转”0变1或者1变0。那么传输的数据就会有很大的差别。

    校验和就是针对数据进行一系列数学运算,得到一个数字(如果数据不一致得到的数字也不一致)。在数据发送时也将校验和发送过去,然后得到的数据再进行一次校验和计算,比较这次计算的校验和和发送的校验和,看是否一致。这样就能判断数据是否发送正确。

 比较知名的校验和

1)CRC(循环冗余校验)

    简单粗暴,把数据的每个字节,循环往上累加。如果累加溢出了,高位就不要了。容易计算,但效果不是很理想。想想如果一位1变0,一位0变1,累加的数据也是不变的,就会出现问题。

2)MD5

    MD5通过一系列公式进行数学计算。

特点:

    1.定长:无论原始数据多长,得到的MD5值都是固定长度。

    2.冲突概率小:原始数据只要变动一小部分,计算的MD5值都会差别很大(MD5结果更加分散)。

    3.不可逆:通过MD5值还原成始数据,这个操作很难(计算量非常大)。一些简单的数据通过打表的方式可以还原一些。打表就是把常见的转换记录下来,然后查表转换。

3)SHA1

特点:

    1.不可以从消息摘要中复原信息。(不可逆)

    2.两个不同的消息不会产生同样的消息摘要,所以可以用摘要来校验信息是否正确。

小结:

    理解封装的过程,会对我们进行网络编程有很大促进作用。


http://www.ppmy.cn/news/24072.html

相关文章

Github | 个人资料自述文件配置的不完全总结

本文简单总结配置 Github 主页上个人资料自述文件的流程和参考文件。 更新:2022 / 02 / 11 Github | 配置个人主页的信息总览方法的不完全总结创建、删除个人资料自述文件编辑个人资料自述文件参考链接创建、删除个人资料自述文件 首推自然是官方说明文档 1&#…

Python 之 NumPy 简介和创建数组

文章目录一、NumPy 简介1. 为什么要使用 NumPy2. NumPy 数据类型3. NumPy 数组属性4. NumPy 的 ndarray 对象二、numpy.array() 创建数组1. 基础理论2. 基础操作演示3. numpy.array() 参数详解三、numpy.arange() 生成区间数组四、numpy.linspace() 创建等差数列五、numpy.logs…

2023最详细的接口测试用例设计教程

一、接口测试流程 1、需求讨论 2、需求评审 3、场景设计 4、数据准备 5、测试执行 二、分析接口文档元素 1、接口名称 2、接口地址 3、支持格式 4、请求方式 5、请求参数(参数名称、类型、是否必填、参数说明等) 6、返回参数(返回…

华为OD机试 - 数组合并(Python),真题含思路

数组合并 题目 现在有多组整数数组, 需要将他们合并成一个新的数组。 合并规则, 从每个数组里按顺序取出固定长度的内容合并到新的数组中, 取完的内容会删除掉, 如果该行不足固定长度或者已经为空, 则直接取出剩余部分的内容放到新的数组中, 继续下一行。 如样例 1, 获得长度…

【大数据】Hadoop-HA-Federation-3.3.1集群高可用联邦安装部署文档(建议收藏哦)

背景概述 单 NameNode 的架构使得 HDFS 在集群扩展性和性能上都有潜在的问题,当集群大到一定程度后,NameNode 进程使用的内存可能会达到上百 G,NameNode 成为了性能的瓶颈。因而提出了 namenode 水平扩展方案-- Federation。 Federation 中…

C语言经典编程题100例(21-40)

21、练习3-2 计算符号函数的值对于任一整数n,符号函数sign(n)的定义如下:请编写程序计算该函数对任一输入整数的值。输入格式:输入在一行中给出整数n。输出格式:在一行中按照格式“sign(n) 函数值”输出该整数n对应的函数值。输入样例1:10输出样例1:sig…

CF1560D Make a Power of Two 题解

CF1560D Make a Power of Two 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码实现备注题目 链接 https://www.luogu.com.cn/problem/CF1560D 字面描述 题面翻译 给定一个整数 nnn。每次操作你可以做两件事情中的一件&am…

Ansible的脚本------playbook剧本

一、剧本的前置知识点1、主机清单ansible默认的主机清单是/etc/ansible/hosts文件主机清单可以手动设置,也可以通过Dynamic Inventory动态生成一般主机名使用FQDNvi /etc/ansible/hosts [webserver] #使用方括号设置组名 www1.example.org #定…