网络原理(1)——UDP协议

news2024/12/23 8:13:05

目录

一、应用层

举个例子:点外卖

约定数据格式简单粗暴的例子

客户端和服务器的交互:

序列化和返序列化

xml、json、protobuffer

1、xml

2、json

3、protobuffer

二、传输层

端口

端口号范围划分 

认识知名的端口号

三、UDP协议

端口

UDP长度

UDP校验和

UDP特点

面向数据报

UDP使用注意事项

基于UDP的应用层协议


一、应用层

        我们之前编写完了基本的 java socket, 要知道,我们之前所写的所有代码都在应用层中,都是为了完成某项业务,如翻译等。关于应用层,后面会有专门的讲解,在此处先讲一下基础知识。

        应用层对应着应用程序,程序员打交道最多的就是这一层,调用系统提供的 网络api 写出的代码都是属于应用层的。

        应用层这里当然也有很多现成的协议,但更多的,程序员需要根据实际场景,自定义协议:网络传输的数据要怎么使用,也要考虑数据是什么样的格式,里面包含了哪些内容。

        而协议就是一种约定,虽然存在很多现有的协议(一般都是大佬们已经搞好了的),但除此之外,咋们程序员也可以自己来约定协议。

        自定义协议,要约定好两方面内容,如下:

        1、服务器和客户端之间要交互哪些信息

        2、数据的具体格式

        客户端按照上述约定发送请求,服务器按照上述约定解析请求。

        服务器按照上述约定构造响应,客户端也按照上述约定解析响应。

举个例子:点外卖

        打开点餐软件,显示出页面,页面里就会显示出商家列表,而这些商家都是在你附近的(打开软件的时候,就会把你的位置告诉给点餐软件的服务器)

        显示的商家列表,也会包含一些信息,商家的名称、图片、商家的评分、商家的简介等等

        以上交互过程中需要传输哪些信息,并不是程序员规定的,而是产品经理规定的。要交互哪些信息,一方面是产品经理约定的,一方面是程序员补充的,这些都要根据 实际的场景 来确定。

        上述的数据按照啥样的格式来组织,就是有一些固定套路;而数据格式如何组织,和产品经理无关,属于程序员自己的事情,往往需要 客户端 的程序员 和 服务器 的程序员,这两伙人坐在一起,共同把这个事给敲定下来。(这里的格式怎么约定都行,只要这两伙程序员达成共识即可)

约定数据格式简单粗暴的例子

        1、请求:约定使用行文本的格式来表示

        userId,position \n         (一个请求以 \n 为结尾,多个字段之间使用,用来分割)

        1000,[经纬度] \n

        2、响应:也是使用文本行来表示,一个响应中可能会包含多个商家;每个商家占一行,每个商家要返回 id、名称、图片、评分、简介。

        1001,杨国福,[logo图片地址],4.8,非常好吃的麻辣烫 \n

        1002,魏家凉皮,[logo图片地址],4.7,很好吃的凉皮

        .......

        若干行的最后,使用 空行 作为所有数据的结束标记

        (上面的这一系列内容是同一个响应中的数据)

        上述的例子里,约定的这个格式太过于简单粗暴了,虽然能解决问题,但实战中,很少真的会这么约定,这样的约定,不太适合拓展,可读性也不高。

客户端和服务器的交互:

        客户端和服务器之间往往要进行交互的是 “结构化数据”(数据是还有个结构体 / 类,包含很多个属性),而网络传输的数据其实是 “字符串” “二进制 bit 流”。

        协议约定的过程,就是把结构化数据转成 字符串 / 二进制比特流 的过程。

序列化和返序列化

        把结构化数据,转成字符串 / 二进制比特流,这个操作称为 序列化

        把字符串 / 二进制比特流 还原成结构化数据,这操作称为 反序列化

序列化 / 反序列化 具体要组织成什么样的格式,这里包含哪些信息,约定这两件事的过程就是 自定义协议 的过程。

xml、json、protobuffer

        为了让程序员更方便的去约定这里的协议格式,业界也给出了几个比较好用的方案,可以直接套进来(xml、json、protobuffer等待)

1、xml

        大概模型如下:

       可读性和扩展性都提升很多,标签的名字可以对数据起到描述的效果,后续要增加一些属性,就新增一个标签即可,对于已有的代码影响不大,代码中按照标签名字获取到标签的值,新增新的标签对于已有代码都没啥影响。

        缺点:整个数据,冗余信息非常多,标签(描述性信息)占据的空间反而比数据本身更多,尤其是网络传输的时候,这些数据都要通过网络传输的(消耗带宽),而国内最贵的硬件资源,就是网络带宽。

        当前存在大量的库可以方便我们解析处理 xml 格式的数据,通过这些库就可以使用 xml 来进行数据的组织和传输,保存。

2、json

        非常主流 / 非常常用的数据组织格式,大概模型如下:

        键值对结构,键和值之间的使用:分割,简直对的使用,进行分割

        把若干个键值对使用 { } 括起来,此时就形成了一个 json 对象,还可以把多个 json 对象放到一起使用,分隔开,并且使用 [ ] 整体括起来,就形成了 json 数组。

        json的可读性很好,扩展性也很好,通过 key 来对数据起到解释寿命,对于 xml 来说,解释说明通过标签,需要有开始和结束两个标签,比较占用空间。相比之下,json值使用一个key就能描述,,占用空间比xml更少,就更节省带宽了。

        虽然 json 比 xml 节省了带宽,但是很明显,当前这里的带宽仍然是有浪费的部分;尤其是这种数组格式的 json,这种情况下往往传输的数据字段都是相同的,使刚才这里的key名字被重复传输了。

3、protobuffer

        更节省带宽的,效率最高的方式

        只是开发阶段(代码)定义出这里都有哪些资源,描述每个字段的含义。程序真正运行的时候,实际传输的数据是不包含这样的描述信息。而这样的数据是按照二进制的方式来组织的。

        因为数据是按二进制的方式传输的,所以这样的设定,是最高效的做法,程序运行的效率高,但并不有利于程序员阅读。

        虽然 protobuffer 运行效率更高,但是使用的并没有 json 更广泛。只是那些对于性能要求非常高的场景,才会使用 protobuffer。应用层也有很多现成的协议,比如 HTTP 这种,HTTP 协议非常重要,独立成章节。


二、传输层

        负责数据能够从发送端到接收端。这一层是系统内核实现好了的,提供socket的api供程序员使用。

端口

        端口号:端口号是一个 2 个字节的整数,使用端口号的时候,1~1024 都属于系统保留自用的端口(知名端口号)。

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

        在TCP/IP协议中,用"源IP","源端口号","目的IP","目的端口号","协议号"这样一个五元组来表识一个通信。

端口号范围划分 

0-1023:知名端口号:如HTTP,FTP,SSH 等这些广为使用的应用层协议,他们的端口号都是固定的。

1024-65535:操作系统动态分配的端口号。客户端程序的端口号,就是由操作系统从这个范围中分配的。

认识知名的端口号

        有些服务器是非常常用的,为了使用方便,人们约定一些常用的服务器,都是用以下固定的端口号:

ssh服务器,使用22端口

ftp服务器,使用21端口

telnet服务器,使用23端口

http服务器,使用80端口

https服务器,使用443

        我们自己写一个程序使用端口号时,要避开这些知名端口号。


三、UDP协议

        UDP协议是传输层中的其中一个协议,具有 无连接、不可靠传输、面向数据报、全双工的特点。研究一个协议,主要就是研究报文格式,基于报文格式,了解这个协议的其他各个特性。

        UDP 数据报  =  报头(重点)+  载荷(应用层数据包)

        UDP报头一共有 4 个字段,每个字段 2 个字节(一共 8 个字节)

16位UDP长度,表示整个数据报(UDP首部 + UDP数据)的最大长度。

如果校验和出错,直接丢弃。

端口

        由于协议报头使用 2 个 字节表示端口号,端口号的取值范围就是:0 ~ 65535(最大值是64K)。

UDP长度

        因此,一个 UDP 数据报最大长度就是 64K,无法更长了,整个数据报的长度超出 64 K,此时就可能导致数据出现 截断(本来数据是完整的,后面的部分没了)。

        总的 UDP 数据报最大长度是 64 K,载荷部分实际能承担的最大长度,应该是 64K - 8;但是 64K - 8 约等于 64K,使用语言表述的时候,会采取 约数 的这种近似值。

UDP校验和

         校验和 的作用就是用来识别当前的数据是否出现 比特翻转,是否是正确的数据。

        验证数据在传输过程中是否正确。因为数据在网络传输过程中,可能会坏掉。

        网络数据传输,本质上是光信号 / 电信号 / 电磁波,因此,在传输过程中就可能会收到干扰

        外界有形形色色的电磁波,传输数据时,是使用高电平 低电平 表示 0 1,这时,外界如果加上一个磁场,就可能把其中 低电平 变成 高电平;此时,出现 0 -> 1 或者 1 -> 0,这种情况,这种情况称为:比特翻转。

        像十几年前的时候,如果出现太阳黑子 / 太阳耀斑,就会引起地球上的通信中断;现代的传输体系,其实有一系列的保护机制,减少外界的干扰;现在的技术更加发达、成熟,不太害怕这些影响,影响还是有的,只不过少很多了。

       在 UDP 中,校验和使用比较简单的方式:CRC算法来完成校验,循环冗余校验。

        

        UDP 数据报发送方,在发送之前,会先计算一遍 CRC,把算好的 CRC 值放到 UDP 数据报中(设这个 CRC 值为 value1)。接下来这个数据报通过网络传输到达接收端,接收单收到这个数据之后,也会按照同样的算法,再计算一遍 CRC 的值,得到的结果是 value2,比较自己计算的 value2 和收到的 value1 是否一致,如果是一致,就说明数据是ok的,如果不一致,传输过程就发生了比特翻转了。

        上述 CRC 算法中,如果只有一个 bit 位发生翻转,此时 100% 能够发现问题。如果有两个 / 多个比特位发生翻转,校验和有可能恰好和之前的一样(这种情况概率比较低,可以忽略不计,如果希望这里有更高的检查精度,就需要使用其他的更严格的校验和算法了)。

        所以,严格的来说,校验和只能用来 “证伪”,证明数据是出错了,无法确保这个数据 100% 正确,但时间中可以近似的人为校验和一致,原来的数据就是一致的。

        除 CRC 算法外,还有一些更高精度的校验和算法。业界还有其他常用的算法:md5 算法 / sha 1算法。如图:

UDP特点

        UDP传输过程类似于寄信。

1.无连接:知道对端的IP和端口号就可以直接传输,不需要建立连接。

2.不可靠:没有确认机制,没有重传机制;如果因为网络故障无法发送到对方,UDP协议层也不会给应用层返回任何错误信息。

3.面向数据报:不能够灵活的控制读写数据的次数和数量。

4、全双工

面向数据报

        应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并。

        用UDP传输100个字节的数据。

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

UDP使用注意事项

        我们注意到,UDP协议首部中有⼀个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
        然而64K在当今的互联网环境下,是⼀个非常小的数字。
        如果我们需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。

基于UDP的应用层协议

NFS:网络文件系统

TFTP:简单文件传输协议

DHCP:动态主机配置协议

BOOTP:启动协议(用于无盘设备启动)

DNS:域名解析协议

        也可以根据需求自定义协议。


都看到这了,点个赞再走吧,谢谢谢谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1521112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NCP1380BDR2G芯片中文资料规格书PDF数据手册引脚图图片参数功能价格

产品描述: NCP1380 是一款高性能器件,旨在为准谐振转换器供电。该控制器基于专属的谷锁闭系统,可以在功率负载变轻时进行切换并降低开关频率。这样将产生稳定的运行,即使在漏极-源极谷中总是触发的开关事件下也是如此。此系统可在…

蓝膜胶带(蓝膜)为动力电池电气绝缘主流应用方案之一 市场需求空间较广阔

蓝膜胶带(蓝膜)为动力电池电气绝缘主流应用方案之一 市场需求空间较广阔 动力电池蓝膜胶带是一种PET基材背上PSA压敏胶制成的单面胶带,因其以深蓝色居多,又被称为蓝膜。蓝膜为绝缘材料,可将电芯与电芯之间分隔开来&…

环保水离子水壁炉,现代时尚

环保水离子壁炉,现代而时尚,靠水运行,用电量很少。这绝对是最生态的壁炉。完全安全(带冷火焰),其现代设计完美适应各种环境。凭借最低的碳足迹,它无疑是未来的混合壁炉。 什么是环保壁炉&#x…

JUC之CAS比较并交换

CAS 原子类引入 加入原子整型类的操作后,无锁化的操作 CAS 比较并交换 硬件级别的保证 源码分析 引出UnSafe类 UnSafe源码分析 unsafe中的do-while保证自旋 public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 this…

Linux:kubernetes(k8s)有状态的服务部署(14)

之前我都是对无状态进行的一个操作,我们想扩容就扩容,想缩容就缩容,根本不用去考虑他的一个网络环境,本地储存环境啥的一个状态 当我们做有状态的服务的操作,肯定要申请一个持久化的一个空间,以及网络&…

Linux环境(Ubuntu)上的防火墙工具使用方法

目录 概述 1 防火墙工具(ufw) 1.1 安装防火墙工具: 1.2 操作防火墙相关命令 2 ufw操作命令的范例 2.1 打开/关闭防火墙 2.1.1 打开防火墙 2.1.2 关闭防火墙 2.1.3 查询当前防火墙状态 2.1.4 允许选择的端口访问 2.1.5 允许选择固定…

自动写作软件哪个好?分享7款独家推荐

随着人工智能技术的不断发展,自动写作软件正逐渐成为现代写作的利器。这些AI写作工具能够帮助用户高效地生成文章、报告、新闻稿等内容,为写作工作带来了极大的便利。然而,市面上的自动写作软件琳琅满目,让人眼花缭乱。为了帮助读…

SpringCloud返回的是xml格式而非JSON数据

一、问题描述: 最近接触eureka,写了一个接口,使用RestController注解修饰了类,预期是返回json格式的数据,但是结果返回的是xml格式的数据。 二、问题分析: 原因是因为直接或间接引入了jackson-dataformat…

相机拍照与摄影学基础

1.相机拍照 相机可能形状和大小不同,但基本功能相同,包括快门速度、光圈和景深,这些是摄影的通用概念。即使是一次性相机也是基于这三个理念工作的。不同类型相机在这三个概念上的唯一区别是你可以控制这些功能的程度。这三个参数被称为相机…

mybatis+thymeleaf登录

目录 一.将页面显示在浏览器中 1.新建项目并导入页面 2.使用th标签 3.新建控制层 4.显示结果 二.将两个页面进行关联 1.提交表单 2.跳转页面 3.结果 三.登录账号名动态改变 1.获取登录表单数据 2.给页面传值 3.页面显示 4.结果 四.连接数据库 1.新建数据库 2.…

tcp/ip协议2实现的插图,数据结构8 (30 - 32章)

(201) 201 三十0 中断优先级补充 (202) 202 三十1 TCP的用户需求 函tcp_usrreq一 (203) 203 三十2 TCP的用户需求 函tcp_usrreq二 (204) 204 三十3 TCP的用户需求 函tcp_usrreq三 (205) 205 三十4 TCP的用户需求 函tcp_usrreq四 (206) 206 三十5 TCP的用户需求 函tcp_usrreq五 …

C语言 内存函数

目录 前言 一、memcpy()函数 二、memmove()函数 三、memset函数 四、memcmp()函数 总结 前言 在C语言中内存是我们用来存储数据的地址,今天我们来讲一下C语言中常用的内存函数。 一、memcpy()函数 memcpy()函数与我们之前讲的strcpy()函数类似,只…

[SAP ABAP] 创建事务码T-CODE

如何让用户通过输入事务码T-CODE跳转到Z437_TEST_2024程序输出界面? 1.输入事务码SE39,进入到维护事务的界面 2.输入需要创建的事务码名称(一般情况下用Y或者Z开头),点击【创建】 这里我们创建一个名为ZTEST437的事务代码 3.在创建事务的窗口…

springboot爱看漫画小程序的设计与实现

摘 要 相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低爱看漫画的运营人员成本,实现了爱看漫画的标准化、制度化、程序化的管理,有效地防止了爱看漫画的随意管理,提高了信息的处理速度和精确度,能够及时、…

leetcode代码记录(子集

目录 1. 题目:2. 我的代码:小结: 1. 题目: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的 子集 (幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 …

MySQL MHA故障切换

目录 一、案例分析 1.1、案例概述 1.2、案例前置知识点 1)什么是 MHA 2)MHA 的组成 3)MHA 的优势 4)MHA 现状 1.3、案例环境 1)本案例环境 ​编辑 2)案例需求 3)案例实现思路…

解读如何打造超高商楼宇智慧公厕

智慧楼宇大厦智慧公厕是近年来兴起的一个创新方案,旨在为现代城市的楼宇建筑提供一种全新的管理与服务模式。这种智慧公厕的最大特点就是将智能化技术与传统楼宇公厕结合,通过各种高科技设备与系统,实现对公厕的全新管理与监控,为…

java serlvet 高校学生画像平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目echarts图形展现

一、源码特点 java serlvet 高校学生画像平台系统是一套完善的java web信息管理系统 系统采用serlvetdaobean 模式开发本系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCA…

Jmeter+Ant 接口自动化环境配置指南

一 、Jmeter安装与配置 https://blog.csdn.net/tester_sc/article/details/80746405 注:Jmeter5.0的环境变量配置与4.0或历往老版本有部分小差异,笔者用的Jmeter 5.0 二 、Ant的安装与配置 # Ant下载地址(下载到指定目录后,进行解压到当前…

Spark-Transformation以及Action开发实战

文章目录 创建RDDTransformation以及ActionTransformation开发Action开发RDD持久化共享变量创建RDD RDD是Spark的编程核心,在进行Spark编程是,首要任务就是创建一个初始的RDDSpark提供三种创建RDD方式:集合、本地文件、HDFS文件 集合:主要用于本地测试,在实际部署到集群运…