【JavaEE初阶系列】——网络原理之进一步了解应用层以及传输层的UDP协议

目录

🚩进一步讲应用层

🎈自定义应用层协议

🎈用什么格式组织

👩🏻‍💻xml(远古的数据组织格式)

👩🏻‍💻json(当下最流行得一种数据组织格式)

👩🏻‍💻protobuffer(使用二进制方式来组织数据)

🚩进一步讲传输层中UDP(重点)

 🎈UDP协议

👩🏻‍💻UDP报文长度 

👩🏻‍💻校验和

👩🏻‍💻代码中了解UDP特点

👩🏻‍💻基于UDP的应用层协议


🚩进一步讲应用层

🎈自定义应用层协议

在应用层这里,很多时候,都是程序员“自定义”应用层协议的。

就是自己定义协议,约定好数据如何传输。

  • 1.根据需求,明确要传输的信息
  • 2.约定好信息按照什么格式来组织

点外卖:点开外卖软件,首先会看到商家列表,这里就涉及到程序和服务器之间进行的网络通信交互。

客户端请求:用户信息,位置信息 (此处假设就使用简单的格式来组织,使用文本的方式,三个属性,使用","来分割。

1000,100,30

服务器响应:商家列表(多个商家),每个商家,包含 名称,图片,距离,简介,评分。

此处假设使用简单格式来组织,使用文本格式,每个商家信息占一行,每个属性使用“,”来分割。

上述的过程就是自定义协议,自定义协议,具体的方式,也是非常灵活的,针对这里的情况,使用啥样的格式来组织,都ok,只要客户端和服务器这边都能够对应上即可。(上述通过行文本方式构造的协议,属于比较粗糙的方式)


🎈用什么格式组织

👩🏻‍💻xml(远古的数据组织格式)

通过标签来组织数据

<request>
    <userid>1000</userid>
    <position>100,30</position>
</request>

HTML属于xml的变种

xml是一个通用的数据格式,这里有啥标签,标签有啥含义,都是程序员自定义的

html则是一个专属的数据格式,有啥标签,标签是啥含义,都是有一个标准委员会,规定好的。<a>超链接 <img>图片 <input>输入框 <li>有序列表

xml优势:让数据的可读性变得更好了

xml劣势:标签写起来非常繁琐,传输得时候也占用更多网络宽带


👩🏻‍💻json(当下最流行得一种数据组织格式)

{
    userid:"1000",
    position:"100,30"
}

键值对结构:{}把所有的键值对给包裹起来。键值对之间,使用","分割,键和值之间,使用":"分割。键固定就是string类型,值得话可以是数字,可是是字符串,也可以是json,还可以是数组。

json优势:可读性比较好得,比xml更简洁

json劣势:同样也是会在网络传输中,消耗额外得带宽(需要把key也进行传输)


👩🏻‍💻protobuffer(使用二进制方式来组织数据)

pb的优势:占用带宽最低,传输效率最高,非常适合于对于性能要求比较高的场景。

pb的劣势:可读性不好(二进制结构,肉眼无法阅读),一定程度上影响开发的效率。


相对于计算机的执行效率来说,对于程序员,开发效率是最重要的。


🚩进一步讲传输层中UDP(重点)

  • UDP:无连接,不可靠,面向数据报,全双工
  • TCP:有连接,可靠传输,面向字节流,全双工

端口号:

  • 写一个服务器,必须手动指定一个端口号,通过端口号来区分当前主机上的不同的应用程序
  • 写一个客户端,客户端在通信的时候也会有一个端口号(代码感受不到),系统自动分配。(如果指定端口号发现和自己主机的程序的端口号一样,那么就冲突了)

端口号固定占2个字节,表示的数据范围0--65535,一般来说,0是不用的。

  • 1-1023 称为“知名端口号”

      

  • 1024-65535 普通端口号(不要冲突即可)

 🎈UDP协议

学习一个协议,其中最主要的工作,就是去理解协议报文格式。


👩🏻‍💻UDP报文长度 

 UDP报文长度,是2个字节,16位表示的数据,表示的范围是0-65535=》64kb

UDP报文长度有限制64k

我们知道搜狗的浏览器有些网页下面会显式广告俩字,由于业务的发展,广告越来越多了,广告的样式也越来越复杂了,导致商搜服务器和入口服务器之间交互的数据流,已经接近64kb,如果超过上限,数据就会出现截断,最终展示在页面上的数据肯定会出错的。

解决方法:

  • 1.把数据拆分成2个包,使用多个UDP数据报进行传输,这个方案,秒被否定(开发成本比较大),拆包,又如何组包呢。
  • 2.直接使用TCP,TCP没有包大小的限制(从这里可以说明,如果是大文件的话都是需要用到TCP,UDP是有包大小限制的)

👩🏻‍💻校验和

前提:网络传输中,由于一些外部干扰,就可能会出现数据传输出错的情况。

(光信号/电信号,磁场,电场,高能离子....某个地方本来是传输低电平,在干扰下就成了高电平了)因此我们就需要有办法,能够识别出出错的数据,校验和,就是这种的一种检查手段。

举个例子:

  • 就比如我去超市买菜,妈妈告诉我需要买 西红柿 鸡蛋 芹菜 黄瓜 四样菜,当我买完数数是5样,那么肯定是出错了,然后再数数是3样,发现买少了,继续进行校验。(这里我们用个数来表示校验机制,但是还不够,需要结合内容来计算)
  • 生活中都需要很多校验才能确保自己做的事情是否有错误。我们小时候计算一个题目需要通过校验来检查等等

校验和,其实本质上是一个字符串,体积比原始的数据更小,又是通过原始数据生成的。原始数据相同,得到的校验和就一定相同,反正,校验和相同,原始数据大概率相同。

如何基于校验和来完成数据校验呢?

  • 1.发送方,把要发送的数据整理好(称为data1),通过一定的算法,计算出checksum1
  • 2.发送方把data1和checksum1一起通过网络发送出去
  • 3.接收方收到数据,收到的数据称为data2(数据可能和data1就不一样了),收到数据checksum1
  • 4.接收方再根据data2重新计算校验和(按照相同的算法),得到checksum2
  • 5.对比checksum1和checksum2是否相同,如果不同,则认为data2和data1一定不相同, 如果checksum1和checksum2相同,则认为data1和data2大概率是相同的(理论上存在不同的可能性,概率比较低)

 校验和是怎么算的?

计算校验和,有很多算法

  • UDP中使用的是CRC算法(循环冗余算法)

把当前要计算校验和的数据,每个字节,都进行累加,把结果保存到这俩个字节的变量中,累加过程中如果溢出,也没关系。如果中间某个数据,出现传输错误,第二次计算的校验和就会和第一次不同。

CRC这个算法不是特别的靠谱,导致俩个不同的数据,得到相同的校验和概率比较大,比如如果前一个字节恰好少1,后一个字节恰好多1,但是最终得到相同的校验和。

  • md5 / sha1算法

1.定长:无论你的原始数据多长,计算得到的md5,都是固定长度。(校验和本身就不能太长,如果太长就不方便网络传输)

2.分散:给定两个原始数据,哪怕绝大部分内容都一样,只要其中一个字节不同,得到的md5值都会差异很大。md5也非常适合作为hash算法(哈希表是把一个key通过hash函数转换成数组下标,希望hash函数能够做到尽量分散,产生hash冲突的概率才会比较低)

3.不可逆:给你一定原始数据,计算md5,很容易,给你md5,还原出原始数据,计算量非常庞大,以至于超出了现有计算机的算力极限,理论上是不行的。md5也可以应用在一些密码学场景中。


👩🏻‍💻代码中了解UDP特点

1.面向数据报:

需要将数据用DatagramPacket对象存储起来

2.无连接:UDP本身是不会存储对端的信息,所以在发送的时候需要显式指定发送给谁

3.全双工:通过一个socket对象,既可以send,也可以接收

4.不可靠,代码中体现不出来


👩🏻‍💻基于UDP的应用层协议

  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议
当然,也包括你自己写 UDP 程序时自定义的应用层协议

相比较于UDP,TCP更值得关注。期待下一篇TCP的详细解说。


 也许适当的休息和摆烂是为了更好的重新出发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1097 矩阵行平移(语文题,选做)

输入样例&#xff1a; 7 2 99 11 87 23 67 20 75 89 37 94 27 91 63 50 11 44 38 50 26 40 26 24 73 85 63 28 62 18 68 15 83 27 97 88 25 43 23 78 98 20 30 81 99 77 36 48 59 25 34 22 输出样例&#xff1a; 529 481 479 263 417 342 343 样例解读 需要平移的是第 1、…

ZYNQ-Vitis(SDK)裸机开发之(八)PS端QSPI读写flash操作(包括SPI、Dual SPI、Qual SPI的配置使用)

目录 一、Flash知识简介 二、SPI知识简介 1.SPI引脚介绍 2.SPI协议介绍 3.ZYNQ Quad SPI说明 三、Vivado工程搭建 四、编写Vitis程序 1.ZYNQ QSPI Flash操作的格式&#xff1a; 2.头文件&#xff1a;qspi_hdl.h 3.源文件&#xff1a;qspi_hdl.c 4.编写QSPI Flash读写…

已经下载了pytorch,但在正确使用一段时间后出现No module named torch的错误

问题描述 使用的是叫做m2release的虚拟环境&#xff0c;在此环境下使用conda list可以发现是存在pytorch的&#xff0c;但是运行代码时却报No module named torch的错误。 解决方案 想尝试卸掉这个pytorch重新装一次&#xff0c;但是想卸载会提示找不到&#xff0c;想重新…

redis写入和查询

import redis #redis的表名 redis_biao "Ruijieac_sta" #redis连接信息 redis_obj redis.StrictRedis(hostIP地址, port6379, db1, password密码) # keyytressdfg # value22 ##写入 # redis_obj.hset(redis_biao, key, value) #查询 req_redisredis_obj.hget(red…

Python面试十问

深浅拷贝的区别&#xff1f; 浅拷⻉&#xff1a; 拷⻉的是对象的引⽤&#xff0c;如果原对象改变&#xff0c;相应的拷⻉对象也会发⽣改变。 深拷⻉&#xff1a; 拷⻉对象中的每个元素&#xff0c;拷⻉对象和原有对象不在有关系&#xff0c;两个是独⽴的对象。 浅拷⻉(copy)…

selenium_定位tag_name

第一个input """需求&#xff1a;1. 使用tag_name定位方式&#xff0c;使用注册A.html页面&#xff0c;用户名输入admin方法&#xff1a;1. driver.find_element_by_tag_name("") # 定位元素方法2. send_keys() # 输入方法3. driver.quit() # 退出方…

最小生成树算法的实现c++

最小生成树算法的实现c 题目链接&#xff1a;1584. 连接所有点的最小费用 - 力扣&#xff08;LeetCode&#xff09; 主要思路&#xff1a;使用krusal算法&#xff0c;将边的权值进行排序&#xff08;从小到大排序&#xff09;&#xff0c;每次将权值最小且未加入到连通分量中…

6、Lagent AgentLego 智能体应用搭建(homework)

基础作业 完成 Lagent Web Demo 使用&#xff0c;并在作业中上传截图。文档可见 Lagent Web Demo 0 环境准备 conda create -n agent conda activate agent conda install python3.10 conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda11.8 -c py…

【Linux】动态扩容根目录

Linux&#xff1a;解决centos-root 根目录磁盘空间不足&#xff0c;动态扩容&#xff0c;不删数据 默认安装的root分区只有50G&#xff0c;/home分区有大几百G&#xff0c;可以考虑重新挂载分配空间&#xff0c;不用删除数据&#xff0c;不需要停业务。 查看系统空间 df -h解…

【PDF技巧】PDF文件带有密码,该如何解密?

PDF文件带有打开密码、限制编辑&#xff0c;这两种密码设置了之后如何解密&#xff1f; 不管是打开密码或者是限制编辑&#xff0c;在知道密码的情况下&#xff0c;解密PDF密码&#xff0c;我们只需要在PDF编辑器中打开文件 – 属性 – 安全&#xff0c;将权限状态修改为无保护…

深入理解C语言结构体和位域

目录标题 1. **结构体基础**2. **结构体的定义和使用**3. **结构体内存布局**4. **结构体与函数**5. **位域的定义和使用**6. **位域的实际应用**7. **结构体与位域的混合使用**8. **注意事项和最佳实践**9. **结语** C语言中的结构体和位域是存储和管理数据的重要工具&#xf…

孟德尔随机化(三)—— 再也不用担心网络或其他各种报错啦 | 从数据库下载数据到本地的数据处理方法

前几天咱们分享了看完不会来揍我 | 孟德尔随机化万字长文详解&#xff08;二&#xff09;—— 代码实操 | 附代码注释 结果解读&#xff0c;很多小伙伴们反映在使用代码下载数据时会遇到各种网络或其他报错问题&#xff0c;令人头大的那种&#xff01;不要慌&#xff01;从数据…

每日一题---合并两个有序数组

文章目录 1.前言2.题目2,代码思路3.参考代码 1.前言 上次我们做了移除元素这道题&#xff0c;下来我们看一下合并两个有序数组 2.题目 2,代码思路 创建三个变量&#xff0c;创建三个变量&#xff0c;分别是n1&#xff0c;n2&#xff0c;n3&#xff0c;分别指向nums1[m-1],nums…

华为ensp中Hybrid接口原理和配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月19日14点03分 Hybrid接口是ENSP虚拟化中的一种重要技术&#xff0c;它既可以连接普通终端的接入链路&#xff0c;又可以连接交换机间的干道链路。Hybrid接口允许多…

排序算法。

***冒泡排序: 基本&#xff1a; private static void sort(int[] a){for (int i 0; i < a.length-1; i) {for (int j 0; j < a.length-i-1; j) {if (a[j]>a[j1]){swap(a,j,j1);}}}} private static void swap(int[] a,int i,int j){int tempa[i];a[i]a[j];a[j]temp…

【YOLOv5】使用yolov5训练模型时报错合集

文章目录 前言问题1 -- VsCode终端无法进入Anaconda创建的虚拟环境【问题描述】【问题分析】【解决方式】方法一方法二 问题2 -- 怎么在VsCode中为项目配置Anaconda创建的虚拟环境【问题描述】【解决方式】 问题3 -- yolov5训练模型时报错RuntimeError: result type Float cant…

代码随想录-算法训练营day12【休息,复习与总结】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 ● day 12 周日休息&#xff08;4.14&#xff09; 目录 复习与总结 0417_图论-太平洋大西洋水流问题 0827_图论-最大人工岛 复习与总结 二刷做题速度提升了一大截&#xff0c;ヾ(◍∇◍)&#xff89;&#xff9e;加…

Linux重启网络后导致容器网络无法连接的解决办法

背景 有时候莫名奇妙的在一顿操作后&#xff0c;容器网络就坏了。然后外部无法访问容器的服务了。以前以为是操作了防火墙导致了容器无法被访问。但是最近经过仔细比较&#xff0c;防火墙规则并没有变化&#xff0c;但是容器就无法访问了。 分析 对于容器网络的讨论&#xff…

(六)PostgreSQL的组织结构(3)-默认角色和schema

PostgreSQL的组织结构(3)-默认角色和schema 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;57771 默认角色 Post…

校园水电预付费系统

一、引言 校园水电预付费系统是一种现代化的管理方式&#xff0c;它改变了传统的后付费模式&#xff0c;实现了先付费后使用的理念&#xff0c;有效提高了校园资源的使用效率和管理效能。本文将从系统功能、操作流程、优点和实施策略四个方面详细介绍这一系统。 二、系统功能…