【计算机网络】应用层自定义协议与序列化
记得在上一节我们说过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有一个连接,一个连接有两个缓冲区。
于是我们根据系统层面的文件理解,现在可以得到一个结论
- write read send recv并不是直接从网络中读取写入,本质都是拷贝函数!
- 发送数据的本质:是从发送方的发送缓冲区把数据通过协议栈和网络拷贝给接收方的接收缓冲区
- 因为有两个缓冲区的存在,读写并不冲突,所以支持全双工
- 我们的缓冲区为空或为满时,read或write就会阻塞,就会将PCB放入对应文件的等待队列中。这时就有几个问题了
什么时候发?发多少?出错了怎么办?
这些都不用担心,因为我们的TCP(属于传输层,传输层也是在OS)会帮助我们,不然怎么叫传输控制协议?(就像是系统层面,内核缓冲区刷新到外设也是OS干的) - 实际上,缓冲区就是临界资源,上层生产数据放入缓冲区,OS根据策略消费。
- 那些拷贝函数为什么会阻塞?
好像这个结论一致都是别人告诉我们的,真正的原因在于为了维持生产者与消费者的同步!
因为是生产消费者模型,所以缓冲区内可能会积压一部分消息,剩一部分,然后剩的一部分并不能接受到完整的信息,比如hello
,缺只收到hel
,这也就是字节流。
通俗来说就是客户端发的与服务端收到不一样。
现实中的例子就是自来水厂分配一次的水够你用一个月,自然界你收集10天的水一下就用完了,发送与接收的是可能不一致的。
UDP是属于发快递,有快递包隔开的。
所以我们是不能随便序列化的,需要确保得到正确的信息才能序列化。
那么如何分割完整报文??
请听下回分解~
相关文章:

【计算机网络】应用层自定义协议与序列化
记得在上一节我们说过TCP中的读取时需要改进,这节就可以解决读取问题了。 目录 应用层再谈 "协议"网络版计算机方案一方案二 序列化 和 反序列化 重新理解 read、write、recv、send 和 tcp 为什么支持全双工 应用层 再谈 “协议” 我们在UDP与TCP中写的…...

企业级无线局域网(WLAN)架构:高效部署策略与技术指南
前言:无线网络直接影响整体网络性能,在当今企业网环境中,已有超过一半的数据流量通过无线信道传输,随着物联网技术的普及,无线网将承载更多的关键业务流量。企业/园区场景的无线网络值得考虑的关键因素有很多ÿ…...

【Python-办公自动化】1秒筛选12个月指定逻辑数值
欢迎来到"花花 Show Python",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。 自我介绍: 我热衷于将复杂的技术概念以简单易懂…...

Linux:进程替换
什么是进程替换? 我们的可执行程序,在运行起来的时候就上一个进程 一个进程就会有他的内核数据结构代码和数据 把一个已经成型的进程的代码和数据替换掉,这就叫进程替换 也就是可以通过系统调用把当前进程替换位我们需要的进程 那么替换…...

带你认识:数据仓库宽表~~~浅显易懂
1. 构建宽表的目的 讲宽表我想从为什么需要宽表入手,而不是一上来就抠概念。因为我觉得一门知识叫什么名字并不是最核心的,关键是搞清楚它的诞生背景以及如何在特定场景用好它。 构建宽表的目的很简单,就是为了"一站式"尽可能多的展示我们需要…...

记录|MessageBox.Show()的使用
目录 前言一、解析1.1 代码1.2 具体图片解析 更新时间 前言 遇到了其他人写的MessageBox.Show()的用法,有点懵,特此记录。 一、解析 1.1 代码 MessageBox.Show("登录失败!", "用户登录", MessageBoxButtons.OK, MessageBoxIcon.E…...

LabVIEW软件定制开发公司的前景如何?
LabVIEW软件定制开发公司的前景在当前的技术发展环境下展现出一定的潜力与挑战。这一领域的市场前景主要受到工业自动化、物联网、智能制造等技术趋势的推动,同时也受到行业竞争、技术更新以及人才市场的制约。 市场需求与增长潜力 随着工业4.0、物联网和智能制…...

vue3列表页搜索条件封装
搜索框组件 封装常用搜索框组件,类型有: input(默认值)selectselectV2 (value/label键值对数组)datePickeryear 集成新增、修改、删除、导入、导出按钮,支持slot自定义其他按钮封装搜索、重置按钮封装按钮权限封装导入弹框 本例仅…...

十三、切片的复制
1、使用函数copy 注意点:复制前必须再声明一个与要复制对象类型相同的切片 var cheeses make([]int, 5)cheeses[0] 1cheeses[1] 2cheeses[2] 3cheeses[3] 4cheeses[4] 5var myCheeses make([]int, 5)copy(myCheeses, cheeses) 使用copy函数将cheeses的数据…...

Java Stream API 的应用:提取并处理多属性集合
Java Stream API 是一个功能强大的工具,可以帮助开发者高效地处理集合数据。本篇博客将专注于一个具体的应用示例,即如何使用 Java Stream API 从一个对象列表中提取多个属性值,并进行过滤和去重。这种技术在处理需要从多个字段中提取数据的情…...

【技术方案】智慧城市大数据平台技术方案(Doc原件)
第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障体系 4.1 政策…...

vue项目中引入字体文件样式
需求:关于一些样式需要自定义的,所以需要ui提供字体文件,然后引入项目中,就可实现自定义 首先看一下实现效果图: 第一步:新建一个字体样式文件用于放字体文件和css样式 font.css文件: /* 数字特殊字体 */ font-face {/*给字体命名*/font-family: DINCondBold;/*引入字体文件*…...

Android 11强制App固定user_rotation方向显示
Android11 强制App按照user_rotation方向显示。 diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index b1d349d8e93d..f7fd2983c668 100644 --- a/services/core/java/com/an…...

Harbor仓库push显示
背景: 在做测试时发现harbor仓库端口开放这,却一直登录不上去,重启harbor资源包docker-compose还是不行,修改了docker.service文件不行,json文件也不行,以下是涉及到的命令和报错(好像是这个&am…...

Windows 上设置 MySQL 的主从复制
Windows 上设置 MySQL 的主从复制 一、前言1. 环境准备2. 主服务器配置3. 从服务器配置6. 测试复制7. 注意事项 一、前言 在 Windows 上设置 MySQL 的主从复制涉及几个步骤。下面是一个详细的指南,帮助你实现这一过程。 1. 环境准备 安装 MySQL: 确保你…...

鸿蒙内核源码分析(原子操作篇) | 谁在为原子操作保驾护航
基本概念 在支持多任务的操作系统中,修改一块内存区域的数据需要“读取-修改-写入”三个步骤。然而同一内存区域的数据可能同时被多个任务访问,如果在修改数据的过程中被其他任务打断,就会造成该操作的执行结果无法预知。 使用开关中断的方…...

vue3+ts封装axios以及解决跨域问题
目录 一、前言二、封装axios三、 解决跨域四、调用接口五、运行结果 一、前言 前端请求后端数据时,会用到axios,但是如果不将axios封装好,会导致代码冗余 二次封装的好处如下: 求头能统一处理便于接口的统一管理解决回调地狱配置…...

各厂家BI对比
帆软BI、奥威BI、永洪BI、思迈特BI、亿信华辰BI是国内知名的BI产品,不少企业在选型BI软件时都需要对这些BI软件进行了解,从中选择适合自己的一款。经过过年的发展,这些BI(商业智能)软件各自在多个行业中都有广泛的应用…...

SQL - 触发器
触发器是在插入、更新和删除语句前后自动执行的一堆SQL代码,但是触发器被触发后只会执行一次,通常我们使用触发器增强数据的一致性。创建触发器 -- 创建触发器 drop trigger if exists payments_after_insert; delimiter $$ -- 在 payments表 insert 之后…...

Redis中缓存穿透、缓存击穿、缓存雪崩的详解
如何理解Redis缓存的穿透、击穿、雪崩问题: 缓存穿透 是指缓存中和数据库中都没有数据,而用户不断访问,导致这个不存在的数据每次请求都要到存储层去查询,这样失去了意义。 缓存穿透的解决方案有哪些? 缓存null值布隆过滤增强…...

[Meachines] [Medium] Popcorn SQLI+Upload File+PAM权限提升
信息收集 IP AddressOpening Ports10.10.10.6TCP:22,80 $ nmap -p- 10.10.10.6 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.1p1 Debian 6ubuntu2 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: …...

【Linux】python进程管理之supervisor安装使用教程
安装supervisor pip install supervisor生成配置文件 echo_supervisord_conf > /etc/supervisord.conf修改配置文件 vim /etc/supervisord.conf[unix_http_server] file/run/supervisor.sock ; the path to the socket file[supervisord] logfile/var/log/supervisord.log…...

BEM架构
视频 总结: BEM架构:一个命名类的规范而已,说白了就是如何给类起名字使用sass的目的:在<style>中模块化的使用类名,同时减少代码数量 1、 BEM架构 (通义灵码查询结果) BEM (Block Ele…...

物联网(IoT)详解
物联网(IoT)详解 1. IoT定义简介2. IoT工作原理3. IoT关键技术4. 物联网与互联网区别5. IoT使用场景6. 开源物联网平台7. 参考资料 1. IoT定义简介 首先第一个问题,什么是物联网(IoT)? 物联网(英文&#…...

ansync/await 运行流程图
1、流程图: 2、await 之后的方法是何时执行,如何执行的? await 的方法在 Task 执行完成之后,通过调用 Finish 方法执行的。 具体的执行步骤是先将 MoveNext 方法注册到 Task 的回调里,然后在 Task 执行完后调用这个方法…...

生产环境docker nginx+php8.0镜像
生产环境docker nginxphp8.0镜像 自定义创建php8.0镜像,创建dockerfile FROM php:8.0-fpm# 安装系统依赖 RUN sed -i s|http://deb.debian.org/debian|http://mirrors.aliyun.com/debian|g /etc/apt/sources.list && \apt-get update && apt-get i…...

【Hadoop】核心组件深度剖析:HDFS、YARN与MapReduce的奥秘
🐇明明跟你说过:个人主页 🏅个人专栏:《大数据前沿:技术与应用并进》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Hadoop简介 2、Hadoop生态系统概览 二、Hadoo…...

Docker Swarm部署SpringCloud Alibaba微服务踩坑记录
为了方便部署和维护微服务项目,还是得上集群部署方案,决定采用Docker的swarm,为什么不是k8s,因为部署骑来又是个新的工具,之前就一直用的docker,自带了类k8s的工具,索性就直接使用swarm了&#…...

深入理解Spring Boot中的AOP应用:从基础组件到高级功能的实现
深入理解Spring Boot中的AOP应用:从基础组件到高级功能的实现 在现代Java开发中,Spring Boot因其简洁性和强大的功能而被广泛采用。而AOP(面向切面编程)作为Spring框架的核心特性之一,为开发者提供了在不修改业务代码的…...

《区块链与监管合规:在创新与规范之间寻求平衡》
区块链技术作为近年来最具创新性和颠覆性的技术之一,已经在金融、供应链、医疗、物联网等多个领域展现出巨大的潜力。然而,随着其应用的不断拓展,如何应对监管和合规性要求成为了区块链发展道路上一个至关重要的问题。 区块链的去中心化、匿…...