Linux - 第15节 - 网络基础(应用层)

news2024/11/20 9:39:31

1.再谈 "协议"

1.1.协议的概念

协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定,比如怎么建立连接、怎么互相识别等。

为了使数据在网络上能够从源到达目的,网络通信的参与方必须遵循相同的规则,我们将这套规则称为协议(protocol),而协议最终都需要通过计算机语言的方式表示出来。只有通信计算机双方都遵守相同的协议,计算机之间才能互相通信交流。

注:

1.我们在套接字部分所用的socket、bind、listen、accept、read/write、connect、recvform、sendto等接口都是操作系统向上提供的,属于应用层的接口。

2.为了满足不同的应用场景,早已经有很多前辈给我们写好了应用层协议,例如:http、https、DNS、FTP、SMTP等。我们之前学习网络通信写的套接字代码其实是在造轮子,也可以说是在定制化协议服务。

协议是一种 " 约定 "。socket api 的接口 在读写数据时 都是按 " 字符串 " 的方式来发送接收的 如果我们要传输一些 "结构化的数据"(例如结构体) 怎么办呢?

1.2. 结构化数据的传输

通信双方在进行网络通信时:

· 如果需要传输的数据是一个字符串,那么直接将这一个字符串发送到网络当中,此时对端也能从网络当中获取到这个字符串。
· 但如果需要传输的是一些结构化的数据(例如结构体),此时就不能将这些数据一个个发送到网络当中。

比如现在要实现一个网络版的计算器,那么客户端每次给服务端发送的请求数据当中,就需要包括左操作数、右操作数以及对应需要进行的操作,此时客户端要发送的就不是一个简单的字符串,而是一组结构化的数据。

如果客户端将这些结构化的数据单独一个个的发送到网络当中,那么服务端从网络当中获取这些数据时也只能一个个获取,此时服务端还需要纠结如何将接收到的数据进行组合。因此客户端最好把这些结构化的数据打包后统一发送到网络当中,此时服务端每次从网络当中获取到的就是一个完整的请求数据,客户端常见的“打包”方式有以下两种。

方案一:将结构化的数据组合成一个字符串

约定:

· 客户端发送一个形如“1+1”的字符串。
· ​​​​​​​这个字符串中有两个操作数,都是整型。
· ​​​​​​​两个数字之间会有一个字符是运算符。
· 数字和运算符之间没有空格。
客户端可以按某种方式将这些结构化的数据组合成一个字符串,然后将这个字符串发送到网络当中,此时服务端每次从网络当中获取到的就是这样一个字符串,然后服务端再以相同的方式对这个字符串进行解析,此时服务端就能够从这个字符串当中提取出这些结构化的数据。

方案二:定制结构体+序列化和反序列化

· ​​​​​​​定制结构体来表示需要交互的信息。
· ​​​​​​​发送数据时将这个结构体按照一个规则转换成网络标准数据格式(序列化),接收数据时再按照相同的规则把接收到的数据转化为结构体(反序列化)。
客户端可以定制一个结构体,将需要交互的信息定义到这个结构体当中。客户端发送数据时先对数据进行序列化,服务端接收到数据后再对其进行反序列化,此时服务端就能得到客户端发送过来的结构体,进而从该结构体当中提取出对应的信息。


 

问题:为什么发送端不能将结构化数据打包为结构体,直接发送结构体对象,这样接收端将接收数据强转成对应的结构体类型,不就可以读取结构化数据了吗?

答:真正的网络协议其实就是像这样通过结构体进行传输的,但是我们绝对不能自定义结构体来进行传输。单纯的定义结构体对象进行传输会有很多问题,网络协议虽然是通过结构体进行传输数据的,但协议中还解决了很多现实问题。

这里我们举一些单纯自定义结构体对象进行传输存在的问题:

问题一:同一个结构体的大小在不同的对齐规则下是不同的。如果服务器和客户端是不同的操作系统,例如服务器是Linux,客户端是windows或安卓,那么同一个结构体其大小很可能是不同的

问题二:即使我们保证了服务端一定是Linux,客户端一定是windows,通过一定的转换规则可以使得同一个结构体大小相同。但是时代是进步的,经过一段时间,客户端程序和服务端程序已经迭代了很多个版本了,编译器也迭代了很多个版本了,如果有客户不对客户端进程更新,那么有些客户用的老编译器编译的老客户端程序,有些客户用的新编译器编译的新客户端程序,同一个结构体对于老客户端程序和新客户端程序其大小可能也不相同(因为新老编译器的区别),而服务端接收到的数据无法判断该数据是从旧客户端发的还是新客户端发的,如何选取转换规则也存在问题。

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

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

相关文章

收集数据集以训练自定义模型的 5 种方法

来源:投稿 作者:王同学 编辑:学姐 在过去的十年中,深度学习技术在计算机视觉领域中的应用逐年增加。其中当属「行人检测」和「车辆检测」最为火爆,其原因之一就是「预训练模型」的「可复用性」。 由于深度学习技术在这…

Pandas+Pyecharts | 新冠疫情数据动态时序可视化

文章目录 🏳️‍🌈 1. 导入模块🏳️‍🌈 2. Pandas数据处理2.1 读取数据2.2 按月统计数据 🏳️‍🌈 3. Pyecharts数据可视化3.1 疫情动态时序地图3.2 疫情动态时序折线图3.3 疫情动态时序柱状图3.4 疫情动态…

Maven中scope(作用范围)详解

目录 一、依赖传递二、依赖范围三、依赖范围对传递依赖的影响四、依赖调节五、可选依赖六、排除依赖七、依赖归类八、依赖管理 一、依赖传递 Maven 依赖传递是 Maven 的核心机制之一,它能够一定程度上简化 Maven 的依赖配置。 如下图所示,项目 A 依赖于…

黄牛为什么能抢走“五月天”的门票?

目录 “史上最难抢票”的五月天演唱会 黄牛为什么能抢到票 黄牛抢票带来哪些坏影响 售票平台为什么挡不住黄牛? 管理上如何有效防控黄牛 技术上如何有效防黄牛 相关技术产品推荐 随着文娱活动的复苏,大量黄牛“卷土袭来”。顶象防御云业务安全情报…

【音视频处理】MP4、FLV、HLS适用范围,在线视频播放哪个更好

大家好,欢迎来到停止重构的频道。 我们之前讨论过直播协议,本期我们讨论在线点播的视频格式。 也就是网络视频文件、短视频常用的格式 如MP4、FLV、HLS等。 我们将详细讨论在线点播场景下,这些视频格式的优劣以及原因。 我们按这样的顺序…

分享几个冷门但实用的网站!

今天给大家推荐几个冷门但实用的网站,免费又好用对于打工人来讲十分友好。 Img Cleaner https://imgcleaner.com/ 一个免费的AI智能图片去水印网站,不用注册登录就可以使用,而且操作也比较简单,上传图片之后调整画笔大小&#xf…

小黑子—Java从入门到入土过程:第十章 - 多线程

Java零基础入门10.0 Java系列第十章- 多线程1. 初识多线程2. 并发和并行3. 多线程的实现方式3.1 一:继承Thread类方式实现3.2 二:实现Runnable接口的方式实现3.3 三:利用Callable接口和Future接口方式实现 4. 多线程中常见的成员方法4.1 线程…

❤ Manifest version 2 is deprecated, and support will be removed in 2023. See..

❤谷歌插件开发遇到的问题 开发谷歌插件提示: ❤js 开发谷歌插件提示 提示 Manifest version 2 is deprecated, and support will be removed in 2023. See… 当导入到chrome,提示如下错误: Manifest version 2 is deprecated, and suppo…

物联网:智慧城市还要做的事情

摘要:本文简介关于智慧城市,还有哪些需要做的事情。 1.传统城市需要向智慧城市转型 传统的城市中心已被证明不足以满足社会当前和未来的各种需求,这增加了应用智慧城市理念的需求。智慧城市可以对健康、交通、休闲和工业等多个领域产生重大…

VLC可见光通信:2、高速LED驱动电路

背景 在VLC可见光通信中,需要高速的控制LED的通断,因此需要高速LED驱动电路。 文中出现的低压是指24V电压以下,中压是指24V~60V电压,高压是指60V ~ 160V。 低速是指500KHZ以下,高速是指2MHZ。 小功率是指20W以下,大功率指20W~100W。 低压小功率LED低速&高速:20W、…

你是时候拥抱chatgpt了

随着chatgpt热度不断上升,chatgpt已经广泛应用到各个行业了,很多人都感觉自己地位受到威胁,有人预测chatgpt会取代80%程序员的工作,我也用了chatgpt有几个月了,不得不说是真的牛逼。我甚至用它写了一个python的聊天脚本…

MapReduce计算广州2022年每月最高温度

目录 数据集 1.查询地区编号 2.数据集的下载 编写MapReduce程序输入格式 输出格式 Mapper类 确定参数 代码 Reducer类 思路 代码 Runner类 运行结果 数据集 1.查询地区编号 NCDC是美国国家气象数据中心的缩写,是一个负责收集、存储和分发全球气象和气…

C#中将32位二进制转换为float【Real】十进制类型

已知一个32位二进制字符串,转换为float【Real】十进制。 参考本人一篇博客 float数转二进制 C#关于32位浮点数Float(Real)一步步按位Bit进行解析_real32位浮点数_斯内科的博客-CSDN博客 现在是32位二进制转化为十进制浮点数,C#有…

电动汽车入网技术(V2G)调度优化(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 近年来我国电动汽车行业飞速发展,其中电动汽车入网技术(vehicle-to-grid,V2G)在…

RapidScada Linux安装教程

官方安装步骤:在 Linux上安装 - Rapid SCADA,安装过程中遇到一些坑,记录详细步骤。 官方推荐的Ubuntu,未测试Centos 1. 安装ASP.Net运行环境(Runtime) 下载地址:下载 .NET 6.0 (Linux、macOS 和 Windows)&a…

selenium还能这么玩:连接已经存在的浏览器

测试和爬虫对selenium并不会陌生,现有的教程已经非常多。但是因为 selenium 封装的方法比较底层,所以灵活性非常高,我们可以基于这种灵活性来实现非常丰富的定制功能。 这篇文章介绍一个操作,可以让 selenium 连接我们手动打开的…

AI绘画-Midjourney基础2-超强二次元风格模型 niji 5

niji 模型是 mj 的一种模型,可以生成二次元风格的图片。 在控制台输入 /settings 指令,进入设置页面。 选择第二行的 Niji version 5 模型,就可以创作二次元风格的图片了! 一、expressive 风格 expressive 风格是 niji 5 模型的默认风格。 Step into the world :: of a …

14个最佳创业企业WordPress主题

要创建免费网站?从易服客建站平台免费开始 500M免费空间,可升级为20GB电子商务网站 创建免费网站 您网站的设计使您能够展示产品的独特卖点。通过正确的主题,您将能够解释为什么客户应该选择您的品牌而不是其他品牌。 在本文中&#xff0…

信息(文档)和配置管理

信息(文档) 配置管理 小改动增加Y的值,大改动增加X的值 配置控制

jRebel实现热部署以及云热部署

idea使用jRebel教程很多,不再累述 服务器部署jRebel 1.下载激活工具(github,别忘了加速):下载链接 因为是linux,固下载下方资源 放进服务器执行下方命令运行,port就是端口号,看着改,我用的888…