【网络原理】应用层协议 与 传输层协议

请添加图片描述

✨个人主页:bit me👇
✨当前专栏:Java EE初阶👇

目 录

  • 🏉一. 应用层协议
  • ⚾️二. 传输层协议
    • 👒1. UDP 协议
    • 🌂2. 校验和
    • 👓3. TCP 协议

🏉一. 应用层协议

我们自己写的应用程序就是在应用层

虽然应用层里面有一些现成的协议,但是在实际工作中也会存在 自定义应用层协议(发明协议?协议就是约定,约定好客户端和服务器按照啥样的格式来传输数据

那么应用层协议如何约定呢?

例如前面我们写的回显服务器实现中,隐含了应用层协议的约定。约定了:每个请求,都是以 /n 结尾;每个响应,都是以 /n 结尾 。(scanner.next();)

自定义应用层协议,需要从两个角度入手:

  1. 考虑清楚交互过程要传递的信息有哪些

如我们点外卖:

  • 启动程序:涉及到网络交互
  • 请求:用户信息
  • 响应:商家信息(商家名称,商家评分,商家位置,商家预览图…)

交互中涉及到哪些信息的传递,和需求又是密切相关

点击某个商家,涉及到网络交互

  • 请求:用户信息,点击的商家信息
  • 响应:该商家的详细情况(有哪些外卖可以点,每个菜多少钱,评价怎么样,销量如何,分类信息,预览图…)
  1. 考虑清楚这些信息组织格式

方式一一种典型的约定方式,直接使用简单分隔符来对不同部分的信息做区分,考虑获取商家列表,约定的数据组织格式

  • 请求:用户 ID;位置坐标(经度纬度)
  • 响应:商家名称;商家评分;商家位置;商家预览图地址;

使用;以及 /n 都是可以替换成其他符号的

方式二一种典型的数据约定格式,使用固定长度,来区分从哪里到哪里是一个信息

  • 请求:(一个请求固定 12 个字节)
    在这里插入图片描述

  • 响应:
    在这里插入图片描述

方式三方式一和方式二混合搭配,有些字段使用固定长度,有些字段使用分隔符。

方式四通过 XML 的格式来约定数据

  • 请求:
    在这里插入图片描述

  • 响应:
    在这里插入图片描述

XML 格式和 HTML 格式非常像,都是通过标签这样的结构来组织数据的。标签一般是成对出现的,表达了 “树形结构”(多级嵌套)。

方式五json 相比于 xml 更常用的数据组织形式

  • 请求:
    在这里插入图片描述

  • 响应:
    在这里插入图片描述

使用 { } 来包含一些 “键值对”。键值对之间,使用逗号分割,每个键值对的键和值之间使用冒号分割

json 要求键的部分必须是字符串,而值的部分,可以是数字,可以是字符串,还可以是数组(使用 [ ] ),还可以是另外一个 json。

json 是当下用来自定义协议的时候,非常常用的格式!也有很多相关的第三方库,可以用来操作 json 数据。

方式六还有一些其他的 “二进制” 组织格式,protobuffer,thift 等

  1. 像 xml 和 json 都是属于文本格式(优势是可读性高,劣势是效率低,占用的带宽更多)
  2. protobuffer,thift 都是二进制格式,格式上就要更加的复杂(优势是效率高,占用带宽低,劣势是可读性差)

应用层协议数据格式有很多种,在实际开发中要根据实际的情况来决定使用哪种更合适

拓展带宽的相关知识:

在国内,带宽是最贵的硬件成本,和 CPU ,内存,硬盘相比。升级服务器的带宽花的钱是比 CPU ,内存啥的升级要贵很多。

应用层协议不仅仅是可以自己写代码自定义协议,也有一些现成的协议,可以直接使用的,最著名的协议就是 HTTP 协议(后面的文章会更新介绍)


⚾️二. 传输层协议

传输层协议是操作系统内核中已经包含好的

其中包含了

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

认识协议的细节,往往要认识协议的报文格式

👒1. UDP 协议

在这里插入图片描述

使用 IP 地址,来区分当前是哪个主机,一个主机上可能有多个应用程序,使用端口号来区分应用程序。

UDP 长度:表示了 UDP 数据报有多长。(注意:这里此处有个重大缺陷,此处的长度,单位是字节,2个字节,能表示的最大长度是 65535 => 64KB => 一个 UDP 数据报最长就是 64KB,由于当时创建的时候,64KB 算大的,但是目前而言,如果代码中使用 UDP ,需要保证一个数据报(一个 DatagramPacket)最大不能超过 64KB)

举例搜狗搜索,搜索的结果有广告和非广告两部分
 
在这里插入图片描述
 
在入口服务器和广告服务器之间本来是使用 UDP 进行交互,在业务发展的过程中,一次次传输的数据越来越接近 64KB 了,为了解决这个问题,提出了两种方案。

  1. 在应用层把广告数据拆分成多个部分,使用多个 UDP 数据报来传输。接收这一段,把拆成的多个包,进行组合。(方案可行,但是代码会很复杂,网络通信有个特点,后发先至
    在这里插入图片描述
    如我们的客户端按顺序发送 1 2 3 ,通常情况下,收到的顺序和发送的顺序是一致的,但是网络出现一些抖动,很容易让接收顺序和发送顺序不一致,也有办法解决这个问题,但是要花费很多的代价 ,为了控制顺序,就得整队,整队就有额外的开销,就得消耗时间。
     
  2. 实际使用的方案,直接使用 TCP 替代 UDP,TCP 没有长度限制

会有人问为什么不把 UDP 协议升级更新一下,改为 4 个字节或者 8 个字节呢?

UDP 已经内置到各个操作系统内核中了,发布到全世界无数个主机中了,想要进行升级,就得要求全世界的主机的操作系统都统一升级到这个版本的 UDP 才行,万一有部分没升级,UDP 就无法工作了。(务必要考虑到升级带来的影响,很多的升级操作,都要考虑到 “兼容性”

🌂2. 校验和

网络传输中,传输的数据,不一定是准确无误的!

本质上是光信号 / 电信号,使用不同频率的光信号,表示 1 - 0,使用不同电频的电信号,表示 1 - 0,传输过程中,信号是可能受到干扰的!(尤其是无线,更容易受到干扰),干扰就可能造成 “比特反转” ,接收方,收到了数据之后,就得验证下,看看当前的数据是否是正确的!(验货)

例如买瓷砖,我们会验证瓷砖数量,款式,破损情况。

校验和可以认为是针对数据特征进行的 “摘要”(相当于瓷砖数量和款式),接收方就可以根据校验和来进行检查了。

UDP 传输数据,网络上的数据是可能受到干扰

发送的时候,针对要传输的数据,计算一个 “校验和” (相当于配置单)
发送的时候,把数据和校验和一起发送过去

接收的时候,针对收到的数据重新计算校验和,对比一下自己计算的校验和和发来的校验和是否是一样的,如果是一样的,就说明数据没啥问题,不一样就有问题。

UDP 使用的校验和算法,是一种非常简单的 CRC 算法(循环冗余校验和)
 
把数据的每个字节,都往上加,如果超出了范围(2 字节),溢出的部分就不要了,所有的字节都累加完了,得到的结果就是校验和了
 
如果检验和相同,输入的字节一定完全相同吗?好像也不一定
10 = 9 + 1;10 = 8 + 2; 10 = 7 +3;…
确实可能存在这种情况,但是这是一种非常小的概率事件,如果校验和不同,可以认为数据一定是传输过程中错了,但是校验和不同,不能认为 100% 的确认数据就一定没错(有可能正好两个地方错一块去了,导致校验和没变),但是因为数据发生传输错误的概率不大,能够错到一块,并且校验和没发生改变,这种概率更是少之又少。(工程上就忽略不计)

校验和,不仅仅是在 UDP 这里,很多的别的地方也会涉及到,只要是数据传输可能出现问题,都可以使用校验和的思想。

注意:哪些应用层协议基于 UDP 只能靠硬背

基于UDP的应用层协议:

  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议

 
当然,也包括你自己写UDP程序时自定义的应用层协议

扩展问题

经典面试题:

  1. UDP本身是无连接,不可靠,面向数据报的协议,如果要基于传输层UDP协议,来实现一个可靠传输,应该如何设计?
  2. UDP大小是受限的,如果要基于传输层UDP协议,传输超过64K的数据,应该如何设计?

以上两个问题答案类似,都可以参考TCP的可靠性机制在应用层实现类似的逻辑:(后文详解TCP)

例如:

  • 引入序列号,保证数据顺序;
  • 引入确认应答,确保对端收到了数据;
  • 引入超时重传,如果隔一段时间没有应答,就重发数据;
    ……

👓3. TCP 协议

由于 TCP 协议很重要切内容比较复杂过多,请看下篇文章详解 TCP 协议

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

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

相关文章

Bitmap 实现当前在线用户数量

Bitmap是什么? Bitmap是Redis中的一种数据结构,它是一个类似于位数组的数据结构,用于处理位数据。在Redis中,Bitmap是使用字符串来存储的,一个Byte可以存储8个二进制位,一个字符串可以存储232个二进制位&a…

【CocosCreator入门】CocosCreator组件 | ProgressBar(进度条)组件

Cocos Creator 是一款流行的游戏开发引擎,具有丰富的组件和工具,其中的ProgressBar组件是一种用于实现进度条效果的重要组件。它可以让我们在游戏中展示各种进度条效果,例如加载进度条、血条等。 目录 一、组件介绍 二、组件属性 三、脚本…

12. 图的进阶

12. 图的进阶 12.1 有向图 在实际生活中,很多应用相关的图都是有方向性的,最直观的就是网络,可以从A页面通过链接跳转到B页面,那么a和b连接的方向是a->b,但不能说是b->a,此时我们就需要使用有向图来解决这一类问题&#x…

【jvm系列-09】垃圾回收底层原理和算法以及JProfiler的基本使用

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

为什么许多人吐槽C++11,那些语法值得我们学习呢?

致前行的人: 人生像攀登一座山,而找寻出路,却是一种学习的过程,我们应当在这过程中,学习稳定冷静,学习如何从慌乱中找到生机。 目录 1.C11简介 2.统一的列表初始化 2.1 {}初始化 …

git 常用命令及遇到问题

自己没事,把git常用命令做个记录总结。方便自己和初学者查看,本文针对初学者,如果你已经是工作多年高手,请跳过。 git的几个区认识,分别为工作区,缓存区,版本库。 工作区:包含.git…

【Unity VR开发】结合VRTK4.0:添加碰撞忽略器

语录: 最远的旅行,是从自己的身体到自己的心,是从一个人的心到另一个人的心。坚强不是面对悲伤不流一滴泪,而是擦干眼泪后微笑面对以后的生活。 前言: 模块化提供了一种允许两个或者多个对象忽略彼此碰撞的方法&#x…

揭秘移动云大会展区前沿科技

2023年4月25日-26日 我们苏州金鸡湖国际会议中心见! 1场重磅主论坛、10场分论坛、2600㎡展区 数字中国新未来 尽在2023移动云大会 2023移动云大会设有中国移动和合作伙伴两大展区,联合40余家优质合作伙伴,全方位展示移动云在自主能力、行…

vue yarn npm

2016年左右 ,facebook针对npm包管理工具存在的性能问题进行了针对性开发并发布了yarn新的node包开发管理工具,具体对比,同学们自行网上搜索资料对比。 配置 1、先下载好NodeJS,然后输入如下命令安装yarn npm install -g yarn 2、…

如何微调Segment Anything Model

文章目录 什么是SAM?什么是模型微调?为什么要微调模型?如何微调 Segment Anything 模型背景与架构创建自定义数据集输入数据预处理训练设置循环训练保存检查点并从中启动模型 下游应用程序的微调 随着 Meta 上周发布的 Segment Anything Mode…

线程等待其他线程执行同步类CountDownLatch

文章目录 前言核心原理源码解析同步源码分析await源码分析countDown源码分析 实战演示1、创建演示代码2、创建测试用例3、测试结果演示 写在最后 前言 大家都知道多线程在我们实际编码过程中运用很多,很多情况我们需要靠多线程来提升系统性能。但是有些时候我们需要…

C语言开发环境搭建及调试

C简介 可移植 标准C C/C (系统硬件操作的接口,windows,Linux不一样) 跨平台 Java Python 下载 去官网选择Visual Studio 2019下载 安装过程中勾选使用C的桌面开发 安装好之后点击创建新项目——空项目 位置最好放在根目录下&…

【vue2】近期bug收集与整理02

⭐【前言】 在使用vue2构建页面时候,博主遇到的问题难点以及最终的解决方案。 🥳博主:初映CY的前说(前端领域) 🤘本文核心:博主遇到的问题与解决思路 目录 ⭐数据枚举文件的使用⭐elementUI中分页组件使用的注意事项⭐…

OpenAI-ChatGPT最新官方接口《从0到1生产最佳实例》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(十一)(附源码)

Production Best Practices 生产最佳实例 前言Introduction 导言Setting up your organization 设置您的组织Managing billing limits 管理计费限额API keys API密钥Staging accounts 演示账户 Building your prototype 构建您的原型Additional tips 其它技巧 Techniques for i…

C++函数重载

目录 函数重载函数重载是怎样实现的 函数重载 函数重载:是函数的一种特殊情况,C允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的…

找PPT模板就上这5个网站~

分享几个可以永久免费下载PPT模板、素材的网站,上万个模板随便下载,赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYxMjky 网站素材非常全面,主要以设计类素材为主,办公类素材也很多&#x…

Spring MVC 接收 json 和返回 json (14)

目录 总入口 测试case 源码分析 1. 针对RequestBody的参数解析 2. 针对 ResponseBody 的返回值处理 总入口 通过上一篇Spring MVC 参数解析(13)_chen_yao_kerr的博客-CSDN博客的说明,相信大家对Sping MVC的参数解析有了一定的了解&…

8. 优先队列

8. 优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在某些情况下,我们可能需要找出队列中的最大值或者最小值,例如使用一个队列保存计算机的任务,一般情况下计算机的任务都是有优先级…

【有功-无功协调优化】基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化研究(Matlab代码实现)

💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …

中断嵌套实验

使用汇编语言,要求: 外部中断1可以嵌套外部中断0 没有中断时,8个LED发光二极管以0.1s的速度闪烁。 有外部中断0时,8个LED发光二极管以0.1s的速度流水点亮。(中断子程序0) 有外部中断1时,会打断外…