UDP协议

共勉

总有人不愿成为熄灭的灯柱,要做那唯一的光,以凡人之躯比肩神明,塑造了自己的伟大。

《南京大屠杀》---张纯如

上图为《南京大屠杀》作者张纯如

自定义应用层协议

为什么要自定义应用层协议

生活中要实现的业务流程是多种多样的, 使用现有的统一的应用层协议不足以完成业务需求, 因此需要自定义应用层协议

如何自定义应用层协议

  1. 首先需要结合业务需求确认请求响应(客户端和服务器之间传递)的是哪些数据
  2. 然后约定好传递的数据的格式, 这样是为了客户端和服务器之间传递的数据能够相互解析

目前典型的数据格式有以下三种

  • XML 标签化的数据组织格式, 使用标签来表示键值对和树结构, 标签名字和内容是由自己指定的, 然后代码中赋予标签名字所表示的含义
<response>
	<商铺>
			<第一家商铺>
				<name>小王面馆</name>
			</第一家商铺>
			<第二家商铺>
				<name>小李面馆</name>
			</第二家商铺>
			<第三家商铺>
				<name>小张面馆</name>
			</第三家商铺>
	</商铺>
</response>
  • Json
{
	商铺[
		{
			name: "小王面馆"
		}
		{
			name: "小李面馆"
		}
	]
}
  • protobuffer(二进制格式)
    使用二进制的方式将数据进行压缩, 肉眼无法识别, 占用内存较小, 传输时使用的带宽较小

UDP协议

提到UDP,就不得不说它的特点了:不连接,不可靠,面向数据包,全双工
在详细介绍UDP协议和TCP协议之前,先简单说一下端口号

端口号

  1. 端口号是用来区分一个主机上不同应用程序(实际上是进程)的,所以一个主机上的一个端口不能同时被多个进程绑定。
  2. 端口号是用两个字节,也就是16个比特位来表示的。因此端口号的取值范围是0~65535,其中0 ~1024是知名端口,被一些广泛使用的应用所绑定。因此在编码时绑定端口一般从1025开始(我们并不清楚当前主机是否安装了绑定了知名端口的应用)

UDP数据报

通过之前的学习我们已经知道UDP数据报是由报头载荷(payload)组成的,载荷部分是socket对象调用send方法取到的,然后在载荷前面拼接上了8个字节的报头,如图:
在这里插入图片描述

报头:

  1. 在报头中包含了一些属性信息,不同的协议报头属性信息不同,所占的空间也就不同。对于DUP来说,报头共有8个字节
  2. 这八个字节分成四个字段,分别存储源端口目的端口UDP数据报长度校验和。每一部分占两个字节
  3. 源端口和目的端口占两个字节好理解,因为端口号本来就占两个字节。
  4. UDP数据报长度占两个字节,单位为字节,也就是理论上一个UDP数据报中UDP头+载荷的长度最大为65535个字节。由1kb=1024byte,就可以知道理论上一个UDP数据报的最大长度为64kb
  5. 校验和:校验和是为了确保数据的准确性。我们知道这些数据最后是以光信号/电信号传输的,而在传输过程中有可能会由于电场、磁场或高能射线等因素的干扰而造成比特翻转
    (1)比特翻转:就是比特流数据发生了变化,如1变成0,0变成1。这种情况在理论上是存在的且无法避免的,我们能做的就是使用校验和及时识别出数据是否发生了变化
    (2)校验和如何生成:校验和的生成是对数据通过一系列的数学计算得到一个较小的值。在发送时对数据进行计算得到一个校验和,写入报头,然后在分用时对传输过去的数据重新计算校验和,比较两次校验和是否一致,如果一致则认为数据正确。目前知名的计算校验和的算法有以下三个:

1> CRC循环冗余检验:设置一个初始值为0,对数据中的每个字节都进行累加,累加溢出则放弃高位。这种方式冲突概率比较大,比如前一个字节少1而后一个字节多1,则会出现数据已经发生变化而CRC值不变的情况
2> MD5算法:MD5算法进行的数学计算及其复杂,也就有了如下几个特点:

定长:无论原始数据有多长多短,经过MD5算法进行计算的结果长度是一定的
冲突概率小:即使数据只有一处发生了改变最后计算出的结果都会相差很大
不可逆:通过校验和反向计算原始数据计算量极大,理论上不可能实现,现在出现的MD5解密只是将常见的字符串和其所对应的MD5值进行了匹配,通俗一点讲就类似于万能钥匙的暴力破解

正是由于MD5算法有以上的特点,所以MD5算法不仅用于计算校验和,还可以用来计算hash值数据加密

3> SHA1算法。SHA1算法特点与MD5相似,只是计算方式不同

对UDP结构图进行完善就是:
在这里插入图片描述

广播

  • TCP的优势在于可靠传输
  • UDP的优势在于高效率
  • 此外,UDP支持向特定ip地址范围发送数据包,因此UDP天生可以支持广播

所谓广播,就是在局域网内实现一对多的通信(UDP的广播只能在局域网中进行)。以投屏为例,介绍广播的实现

  1. 设备发现:
    (1)将手机和电视处于同一局域网
    (2)手机向局域网内的广播地址广播ip是局域网内的一个ip地址,通常是192.168.1.255,发送到广播地址的数据包能被同一局域网内的所有设备所接收)发送报文“我是XXX,我要找电视”
    (3)广播地址将这个报文转发给同一局域网内的所有设备,电视收到这个请求之后就会发出响应,将自己的ip地址发给手机
  2. 通信阶段:
    (1)手机获取到电视的ip地址
    (2)手机与电视建立一对一的UDP通信连接,通常使用的是特定的端口
    (3)手机通过连接将屏幕内容以UDP数据包的形式发送到电视,实现投屏。

在这个例子中,UDP广播用于在局域网内发现设备,然后通过UDP连接进行实时通信,使手机和电视实现投屏

如果要实现手机同时对多个电视进行投屏操作,则需要用到多播。首先需要将所有设备都处于同一局域网内,然后使所有的设备都处于同一多播组,手机通过发送UDP数据包到多播组地址,所有电视都能接受到这个数据包。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

With Order @!147

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值