【计算机网络】应用层自定义协议与序列化

记得在上一节我们说过TCP中的读取时需要改进,这节就可以解决读取问题了。

目录

  • 应用层
    • 再谈 "协议"
    • 网络版计算机
      • 方案一
      • 方案二
    • 序列化 和 反序列化
  • 重新理解 read、write、recv、send 和 tcp 为什么支持全双工

应用层

再谈 “协议”

我们在UDP与TCP中写的代码都是在应用层的,而协议栈每层都有协议,但是似乎没见到我们写的代码有协议?
实际上我们也定了协议,那就是都是字符串。

网络版计算机

但是更多的时候协议是结构体,而不是字符串。
但是如果是结构体,又该怎么样去进行网络传输?

方案一

这是肯定就有人说,和字符串一样直接传过去不就好了?这确实是一种解决办法。
我们的OS内部甚至就是这种方案,但是应用层并不推荐。

原因有二:技术与业务

技术方面:当我们在服务端在64位 Linux下,而客户端在Macos、win…
不用的OS大小端、内存对齐规则、字段大小都不一致的,所以这是第一方面的难题,直接使用结构体传是肯定难以实现的!
业务方面:就算有同学头铁,两眼一睁就是干,就是解决了技术方面问题,那算你牛。但是业务是一直会变化的,所以业务变化就会导致你的技术方面工作全部白费,因此应用层不推荐这么做。

而OS可以这么做的原因就在于写好了他就是万年不变的了,都是使用C语言写的,保证效率即可。

方案二

  • 定义结构体来表示我们需要交互的信息;
  • 发送数据时将这个结构体按照一个规则转换成字符串, 接收到数据的时候再按
    照相同的规则把字符串转化回结构体;
  • 这个过程叫做 “序列化” 和 “反序列化”

序列化 和 反序列化

协议就是结构体,服务端和客户端都要认识
在这里插入图片描述
上图就很清晰的展示了序列化与反序列化的过程,我们将结构体信息序列化,转化为特定的字符串格式发送即可,在按照规则反序列化在另一台主机得到结构体。

重新理解 read、write、recv、send 和 tcp 为什么支持全双工

现在我们要在系统层面上复盘一下文件系统。
在这里插入图片描述
我们的进程打开文件后,write函数会将你的数据拷贝内核级文件缓冲区,在由OS刷新到硬盘,这取决于OS的策略。

现在转过头看网络:
在这里插入图片描述

先输出一个结论:其实网络也有缓冲区,在传输层中,而传输层与网络层也都存在OS中。也就是说一个fd有一个连接,一个连接有两个缓冲区。

于是我们根据系统层面的文件理解,现在可以得到一个结论

  1. write read send recv并不是直接从网络中读取写入,本质都是拷贝函数!
  2. 发送数据的本质:是从发送方的发送缓冲区把数据通过协议栈和网络拷贝给接收方的接收缓冲区
  3. 因为有两个缓冲区的存在,读写并不冲突,所以支持全双工
  4. 我们的缓冲区为空或为满时,read或write就会阻塞,就会将PCB放入对应文件的等待队列中。这时就有几个问题了什么时候发?发多少?出错了怎么办? 这些都不用担心,因为我们的TCP(属于传输层,传输层也是在OS)会帮助我们,不然怎么叫传输控制协议?(就像是系统层面,内核缓冲区刷新到外设也是OS干的)
  5. 实际上,缓冲区就是临界资源,上层生产数据放入缓冲区,OS根据策略消费。
  6. 那些拷贝函数为什么会阻塞?
    好像这个结论一致都是别人告诉我们的,真正的原因在于为了维持生产者与消费者的同步!

因为是生产消费者模型,所以缓冲区内可能会积压一部分消息,剩一部分,然后剩的一部分并不能接受到完整的信息,比如hello,缺只收到hel,这也就是字节流。
通俗来说就是客户端发的与服务端收到不一样。
现实中的例子就是自来水厂分配一次的水够你用一个月,自然界你收集10天的水一下就用完了,发送与接收的是可能不一致的。

UDP是属于发快递,有快递包隔开的。

所以我们是不能随便序列化的,需要确保得到正确的信息才能序列化。
那么如何分割完整报文??
请听下回分解~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支持I2C接口、抗干扰性强、14通道触摸按键的电容式触摸芯片-GTX314L

电容式触摸芯片 - GTX314L是具有多通道触发传感器的14位触摸传感器系列,它是通过持续模式提供中断功能和唤醒功能,广泛适用于各种控制面板应用,可直接兼容原机械式轻触按键的处理信号。 GTX314L芯片内部采用特殊的集成电路,具有高…

基于YOLOv8-pose的手部关键点检测(3)- 实现实时手部关键点检测

目录 前言 1.扩大检测框区域 2.先检测手部,后检测手部关键点 3.正面视角检测 4.侧面视角检测 5.摄像头视角检测 6.遮挡视角检测 7.结论 前言 使用YOLOv8-m对图像进行手部检测,然后扩大检测框区域,并对该区域使用YOLOv8-s-pose使用关键…

大数据技术——实战项目:广告数仓(第六部分)报表数据导出至clickhouse

目录 第11章 报表数据导出 11.1 Clickhouse安装 11.2 Clickhouse建表 11.2.1 创建database 11.2.2 创建table 11.3 Hive数据导出至Clickhouse 第11章 报表数据导出 由于本项目最终要出的报表,要求具备交互功能,以及进行自助分析的能力,…

CSS——字体背景(Font Background)

一、字体族 1、字体的相关样式: ① color 用来设置字体颜色(前景颜色) ② font-size 字体的大小 和font-size相关的单位: em 相对于当前元素的一个font-size rem 相对于根元素的一个font-size ③ font-family 字体族&#x…

命令行参数环境变量

目录 前言: 命令行参数: 现象: 这些参数的意义: 为什么要这么做? 这些事是谁做的呢? 环境变量 现象: 创建环境变量: 结合程序理解: 前言: 我们在前…

1.Linux_常识

UNIX、Linux、GNU 1、UNIX UNIX是一个分时操作系统,特点是多用户、多任务 实时操作系统:来了请求就去解决请求 分时操作系统:来了请求先存着,通过调度轮到执行时执行 2、Linux Linux是一个操作系统内核 发行版本&#xff1…

C++(10)类语法分析(1)

C(10)之类语法分析(1) Author: Once Day Date: 2024年8月17日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …

基于单片机的智能晾衣系统设计

摘 要 :在网络信息技术的推动下,智能家居得到了广泛应用,文章根据当前的市场动态,针对基于单片机的智能晾衣系统设计展开论述,具体包括两个方面的内容———硬件设计和软件设计。 关键词 :单片机&#xff…

【数据结构篇】~顺序表

顺序表前言 想要学好数据结构的三大基本功:1.结构体2.指针3.动态内存开辟,这三样将是贯彻整个数据结构的工具。(可以去这里了解这三大基本功) 顺序表也是线性表的一种,那线性表又是什么呢? 线性表(linear …

应急响应-DDOS-技术指南

初步预判 通常,可从以下几方面判断服务器/主机是否遭受DDoS攻击查看防火墙、流量监控设备、网络设备等是否出现安全告警或大量异常数据包。如图所示,通过流量对比,发现在异常时间段存在大量UDP数据包,并且与业务无关。 通过安全设…

uniapp多图上传uni.chooseImage上传照片uni.uploadFile,默认上传9张图

uniapp多图上传uni.chooseImage上传照片uni.uploadFile 代码示例: /**上传照片 多图*/getImage() {uni.chooseImage({count: 9, //默认9sizeType: [original, compressed], //可以指定是原图还是压缩图,默认二者都有sourceType: [album], //从相册选择/…

8 Java常用API(基本语法6)-- Object和Objects类、Math、System、浅克隆和深克隆、手动下载导入第三方jar包

文章目录 前言一、Math(工具类)1 属性2 常见方法二、System(工具类,和系统相关的)1 public static void exit(int status) --- 终止当前运行的 Java 虚拟机。2 public static long currentTimeMillis() --- 以毫秒为单位返回当前unix时间。3 public static void arraycopy(Obj…

在Windows上配置VSCode MinGW+CMake(包括C++多线程编程的两套API:posix和win32)

创建目录 首先,需要电脑上安装VSCode, 并且创建三个文件夹:cmake、MinGW-posix、MinGW-w32 文件下载 下载posix-seh posix和win32分别是c多线程变成的两套API,可根据不同需求安装,现在先下载配置环境需要的几个文件 百度搜索MinGW-64 点…

Apache--简介与基本使用

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、Apache简介 Apache HTTP Server(在Red Hat发行版中俗称Apache或httpd)是由Apache Software Foundation在Apache License…

WPF打印控件内容

当我们想打印控件内容时&#xff0c;如一个Grid中的内容&#xff0c;可以用WPF中PrintDialog类的PrintVisual()方法来实现 界面如下&#xff1a; XAML代码如下 <Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width"300"…

pygame开发课程系列(4): 游戏元素

第四章 游戏元素 在本章中&#xff0c;我们将深入探讨如何在 Pygame 中处理游戏元素&#xff0c;包括键盘输入、鼠标输入、图像加载和声音播放。这些元素是构建互动游戏的基础&#xff0c;能够让你的游戏变得更生动、更有趣。 4.1 处理键盘输入 键盘输入是控制游戏角色或元素…

Redis相关介绍

本文介绍了Redis&#xff0c;一种开源的内存数据结构存储系统&#xff0c;强调其高性能、多种数据结构支持、内存存储、持久化策略、发布订阅功能及工作原理。 一、Redis的介绍 Redis&#xff08;Remote Dictionary Server&#xff09;&#xff0c;即远程字典服务&#xff0c…

[000-01-030].第7节:Zookeeper工作原理

1.Zookeeper工作原理&#xff1a; 1.1.Zookeeper的工作机制 1.Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff1b;2.Zookeeper负责存储和管理大家都关心的数据&#xff0c;然后接受观察者的注册&#xff0c;一旦这些数据的…

Unity Recttransform操作

1、拉伸铺满 RectTransform rect GetComponent<RectTransform>();rect.anchorMin Vector2.zero;rect.anchorMax Vector2.one;rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Verti…

Ciallo~(∠・ω・ )⌒☆第二十篇 入门mysql 数据库

要入门MySQL数据库&#xff0c;首先需要了解数据库的基本概念和原理。MySQL是一种广泛使用的开源关系型数据库管理系统&#xff0c;它能够处理大量的数据&#xff0c;并提供了多种功能。 一、创建数据库 连接到MySQL后&#xff0c;你可以使用SQL语句来创建数据库。例如&#x…