网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识
目录
1. 应用层
2. 自定义协议
2.1 根据需求 => 明确传输信息
2.2 约定好信息组织的格式
2.2.1 行文本
2.2.2 xml
2.2.3 json
2.2.4 protobuf
3. HTTP 协议
3.1 特点
4. 抓包工具
1. 应用层
在前面的博客中, 我们了解了 TCP/IP 五层协议模型:
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层
在实际开发中, 和我们程序员打交道最多的就是应用层, 我们写的的代码, 只要涉及到网络通信, 就可以认为是应用层的一部分.
应用层和应用程序直接相关, 也和我们程序员直接相关.
在应用层涉及到的网络通信协议, 通常分为以下两部分:
- 大佬已经约定好的, 现成的协议
- 我们程序员自定义的协议(我们写代码时, 自己规定的协议)
2. 自定义协议
上文说到, 应用层中的很多协议都是我们程序员自己规定的, 而自定义协议, 有以下两个关键步骤:
- 根据需求, 明确传输哪些信息
- 约定好信息组织的格式
2.1 根据需求 => 明确传输信息
客户端和服务器的交互, 首先第一步肯定是要明确传输哪些信息(请求和响应的内容), 而这些信息都是需要根据需求来确定的.
举个例子:
比如我们打开美团点外卖, 就会展示出很多的商家, 而这些商家都是在我们附近, 不会距离我们很远. 并且推荐的店铺是根据我们的口味来推荐的, 而不是随机的推荐.
这是因为我们(客户端)和服务器之间交互时, 客户端发出的请求以及服务器返回的响应, 都是根据我们的需求来确定好的.
- 请求: 用户的位置信息(一般来说是经纬度), 用户id(明确用户是谁), ....
- 响应: 商家id, 商家名字, 商家图片, 评分, 配送费, 种类, .....
2.2 约定好信息组织的格式
在明确好传输的信息后, 接下来来到第二个环节: 约定好信息/数据组织的格式.
信息组织的格式有很多种:
- 行文本方式
- xml 方式
- json
- protobuf
2.2.1 行文本
以行文本的方式来组织信息, 一条信息占一行, 一行中分为很多列, 每一列都表示了一小段信息.
而一个请求/响应, 就是由很多个行(很多条信息)构成的.
还是以上文外卖为例, 若以行文本组织数据,
那么协议中请求的规定可能如下:
- 用户id, 用户位置\n
响应的规定可能如下:
- 商家id, 商家名称, 商家logo, 商家照片, 评分, 配送费\n
那么在发送请求或者响应时, 信息的格式就需要遵循以上的约定.
(我这里 行与行之间使用 \n 分割, 列与列之间使用 , 分割. 因为是自定义协议, 所以只要客户端和服务器遵循的是同一套规则就可以了)
但是, 以行文本的形式来组织信息, 是比较老的一种方案(十几二十年前使用的).
2.2.2 xml
我们还可以通过 xml 格式, 去约定请求和响应中数据的格式.
xml 和 html 类似, 都是由成对的标签构成的键值对结构, 但是不同的是:
- html 的标签是固定的, 是大佬们制定好的, 供我们使用, 我们不能使用不存在的标签(不允许自定义标签)
- xml 的标签是自定义的, 我们可以自己制定标签来使用
注意, xml 只是和 html 结构类似(都是以标签构成的), 但是若以 xml 来规定数据的格式, 这些数据只是用来网络传输的, 和浏览器的显示无关(html 是规定浏览器怎么显示的).
还是以上文外卖软件为例:
若以 xml 格式来约定信息的格式, 那我们作为客户段, 发送的请求的内容, 以及服务器端, 返回的响应的内容, 可能如下:
此外, xml 能够组织格式化数据, 这些数据不仅能用来网络传输, 还可以作为配置文件 .....
总之, xml 有很多的应用场景.
以 xml 来组织信息格式, 有优点也有缺点:
- 优点: 可读性好(键值对形式, 易读)
- 缺点: 冗余信息太多(成对的标签), 消耗了更多的网络带宽资源
要知道, 带宽是最贵的资源:
- 硬盘最便宜
- 内存其次
- cpu 小贵
- 带宽 特别贵!!
以 xml 来约定数据格式的方案, 在十年前, 用的还是很多的, 但是在 2024.11.17 的今天, 已经很少使用 xml 进行网络传输了.....
2.2.3 json
json, 是当下最流行的网络数据组织格式的方案.
json 也是使用键值对来表示数据的, 格式如下:
json 保留的了 xml 的优点, 但也存在缺点:
- 优点: 可读性高
- 缺点: 依旧存在冗余信息, 消耗带宽(虽然相对于 xml 来说, 键的表示只有一个, 但是仍消耗了带宽)
2.2.4 protobuf
protobuf 方案, 约定的数据格式是二进制.
protobuf 使用二进制的格式, 对传输的数据进行压缩, 虽然这样一来, 没有了 xml / json 的冗余信息, 使得消耗的带宽最少, 但是也使得可读性变差.
- 优点: 消耗的带宽最少(性能高)
- 缺点: 可读性低
显而易见. protobuf 方案, 就是使用 开发效率换取执行效率(比较少见), 所以 protobuf 的方案, 更多的应用于对性能要求高的常见的下.
要知道, 在实际开发中, 开发效率(尽可能让代码好写)是要比执行效率重要的, 所以在平时开发中, 还是更建议使用 json 方案来约定数据格式.
到这里, 我们对上文提到的四种信息组织的格式进行一下小总结:
- 行文本(最原始)
- xml(比较原始, 冗余较多, 可读性高)
- json(目前最流行, 冗余一般, 可读性高) => Java Web 开发的基本盘
- protobuf(高性能场景下使用, 冗余最小, 可读性差)
3. HTTP 协议
在应用层中, 除了我们程序员自己制定的协议外, 还有很多大佬们搞好的现成的协议.
其中, HTTP 协议是应用层中最重要的一个协议, 也是 Web 开发中最核心的协议.
HTTP 协议诞生于 1991 年, 到目前为止已经有好几个版本的 HTTP 了, 但是目前最流行的 HTTP 版本依旧是二十年前的 HTTP 1.1 版本.
在本篇博客中, 也是围绕 HTTP 1.1 展开介绍.
3.1 特点
HTTP 协议是 一问一答 模式的协议.
所谓一问一答, 就是客户端发起一个请求, 服务器就返回一个响应(请求和响应是一一对应的).
在网络统一中, 当然也存在其他的问答模式:
- 多问一答: 上传大文件(上传时将一个大文件拆分为几个小文件分别上传, 上传成功后服务器返回一个响应)
- 一问多大: 下载大文件(我们只需点一下下载, 而服务器会将大文件拆分为几个小文件, 分别传送给客户端进行下载)
- 多问多答: 远程控制(ToDesk)
而像 浏览器打开网页, 手机 APP 加载数据这样的场景, 就是典型的一问一答的场景, 非常适合使用 HTTP.
4. 抓包工具
要学习 HTTP 的报文格式, 需要搭配一个重要的工具进行学习, 这个工具就是 --- 抓包工具.
抓包工具, 是一个软件, 能够获取到网络资源包, 将其中详细的格式都解析出来, 而我们就可以通过抓包工具来查看网络传输的信息.
简单来说, 就是我们电脑的上所有的网络通信, 都会先发送给这个抓包工具, 再由这个抓包工具把数据发送给客户端.
也就是说, 抓包工具能够洞察到我们的电脑和服务器间所进行的一切的通信内容, 而我们就可以通过抓包工具来查看这些内容.
抓包工具, 相当于 "代理", 分为正向代理和反向代理:
- 正向代理: 代表客户端干活
- 反向代理: 代表服务器干活
举个例子:
汤老湿想吃辣条了, 但是老湿比较懒, 不想动, 于是他就命令小汤去超市帮他买辣条.
此时, 老湿和超市老板之间的交易, 小汤是非常清楚的. 所以, 小汤就是老湿的"代理" , 并且是"正向代理".
这个过程就如下图:
如果超市老板也很懒, 也让他的儿子替他看店, 自己进去躺会, 那么超市老板的儿子也是一个"代理", 并且是"反向代理":
注意:
在使用抓包工具时, 一定要关闭和抓包工具产生冲突的软件, 例如: 梯子/梯子类浏览器插件.
我这里使用 fiddler 来进行演示(fiddler 只能抓取 http, 功能简单, 使用方便, 但也够用)
通过抓包工具, 我们就可以获得请求和响应的原始数据:
对响应进行解压缩, 仔细观察, 返回的响应其实就是 HTML.
也就是说, 我们在浏览器上进行一系列操作, 会向服务器发送请求, 而服务器返回的响应, 就是一份 HTML, 这份 HTML 就构建了一个新的网页(满足我们访问需求的网页).
本篇博客对应用层和 http 协议的介绍就到这里, 后续博客详细来聊 http 的协议格式.(请求和响应在 http 中的格式)
END
相关文章:

网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识
目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…...

Python-链表数据结构学习(1)
一、什么是链表数据? 链表是一种通过指针串联在一起的数据结构,每个节点由2部分组成,一个是数据域,一个是指针域(存放下一个节点的指针)。最后一个节点的指针域指向null(空指针的意思࿰…...
性能优化经验:关闭 SWAP 分区
关闭 SWAP 分区,特别是在性能敏感场景(如 Elasticsearch 服务)中,主要与 SWAP 的工作机制和对应用性能的影响有关。以下是详细原因: 1. SWAP 的工作机制导致高延迟 SWAP 是什么: SWAP 分区是系统将物理内存…...

SpringBoot小知识(2):日志
日志是开发项目中非常重要的一个环节,它是程序员在检查程序运行的手段之一。 1.日志的基础操作 1.1 日志的作用 编程期调试代码运营期记录信息: * 记录日常运营重要信息(峰值流量、平均响应时长……) * 记录应用报错信息(错误堆栈) * 记录运维过程数据(…...
java虚拟机——jvm是怎么去找垃圾对象的
JVM(Java虚拟机)通过特定的算法和机制来查找和识别垃圾对象,以便进行垃圾回收。以下是JVM查找垃圾对象的主要方法和步骤: 一、可达性分析法 JVM使用可达性分析法来识别垃圾对象。这种方法从一组称为“GC Roots”的对象作为起始点…...

Macos远程连接Linux桌面教程;Ubuntu配置远程桌面;Mac端远程登陆Linux桌面;可能出现的问题
文章目录 1. Ubuntu配置远程桌面2. Mac端远程登陆Linux桌面3. 可能出现的问题1.您用来登录计算机的密码与登录密钥环里的密码不再匹配2. 找不到org->gnome->desktop->remote-access 1. Ubuntu配置远程桌面 打开设置->共享->屏幕共享。勾选允许连接控制屏幕&…...

hadoop_HA高可用
秒懂HA HA概述HDFS-HA工作机制工作要点元数据同步参数配置手动故障转移自动故障转移工作机制相关命令 YARN-HA参数配置自动故障转移机制相关命令 附录Zookeeper详解 HA概述 H(high)A(avilable): 高可用,意味着必须有容错机制,不能因为集群故障…...
【MySQL】MySQL中的函数之JSON_ARRAY_APPEND
在 MySQL 8.0 及更高版本中,JSON_ARRAY_APPEND() 函数用于在 JSON 数组的指定位置追加一个或多个值。这个函数非常有用,特别是在你需要在 JSON 数组的末尾或特定位置添加新的元素时。 基本语法 JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ..…...
torch.is_nonzero(input)
torch.is_nonzero(input) input: 输入张量 若输入是 不等于零的单元素张量 则返回True,否则返回False 不等于零的单元素张量:torch.tensor([0.]) 或 torch.tensor([0]) 或 torch.tensor([False])单元素张量: 只有一个数 的张量 import torch print(t…...
文本搜索程序(Qt)
头文件 #ifndef TEXTFINDER_H #define TEXTFINDER_H#include <QWidget> #include <QFileDialog> #include <QFile> #include <QTextEdit> #include <QLineEdit> #include <QTextStream> #include <QPushButton> #include <QMess…...
使用 Python 剪辑视频的播放速度
要使用 Python 调整视频的播放速度,可以利用 moviepy 库中的 fx(特效)模块来实现这一功能。通过 moviepy.editor 中的 VideoFileClip 类和 fx.speedx 函数,可以轻松地调整视频的播放速度。 安装 moviepy 首先,确保已…...

深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接
1.前言 从一个高级语言到可执行程序,要经过预处理、编译,汇编和链接四个过程。大家可以思考下,为什么要有这样的过程? 我们学习计算机之处,就应该了解到,计算机能够识别的只有二进制语言(这是…...
Linux开发者的CI/CD(11)jenkins变量
文章目录 1. **环境变量 (Environment Variables)**常见的环境变量:示例:2. **构建参数 (Build Parameters)**常见的构建参数类型:示例:3 **在 `stages` 块内定义局部变量**示例:使用 `script` 步骤定义局部变量4 变量引用陷阱在 Jenkins 中,变量是自动化流程中非常重要的…...
深度学习视频编解码开源项目介绍【持续更新】
DVC (Deep Video Compression) 介绍:DVC (Deep Video Compression) 是一个基于深度学习的视频压缩框架,它的目标是通过深度神经网络来提高视频编码的效率,并降低比特率,同时尽可能保持视频质量。DVC 是一个端到端的神经网络模型&…...
Canva迁移策略深度解析:应对每日5000万素材增长,从MySQL到DynamoDB的蜕变
随着数字化设计的蓬勃发展,Canva作为一款备受欢迎的在线设计平台,面临着日益增长的用户生成内容挑战。每天,平台上新增的素材数量高达5000万,这对数据库系统提出了前所未有的要求。为了应对这一挑战,Canva决定对其数据…...

nacos常见面试题(2024)
nacos永久实例与临时实例区别 nacos实例有2种,分别为临时实例(一般业务服务是临时的)和永久实例(如mysql、redis这种运维服务需要实时看到状态的设置为永久实例)。 临时实例只会缓存到服务注册列表中,下线…...

68000汇编实战01-编程基础
文章目录 简介产生背景应用领域 语言学习EASy68K帮助文档IDE使用 编程语言commentslabels开始标签指令标签位置标签 opcode 操作码常用操作码数据传送算术运算逻辑运算控制流分支跳转地址跳转子程序跳转 位操作比较堆栈操作 IO操作码其他操作码 directives 指令DC指令EQU 指令S…...
你的网站真的安全吗?如何防止网站被攻击?
你的网站被黑客攻击过,很可能不止一次! 这可不是危言耸听。微软最近发布了《2024 年微软数字防御报告》,报告中写到:“Windows 用户每天面临超过 6 亿次网络犯罪和国家级别的攻击,涵盖了从勒索软件到网络钓鱼再到身份…...
UE5 材质编辑器CheapContrast 节点
在 Unreal Engine 材质编辑器中,CheapContrast 节点是一个非常实用的节点,主要用于对图像或纹理的 对比度 进行调整,且执行效率较高,适合在性能要求较高的场景中使用。 CheapContrast 节点的作用 CheapContrast 节点通过调整输入…...

健身房小程序服务渠道开展
健身不单单是锻炼身体、保持身材,也是一种社交方式,城市里门店不少,每家都有一定流量和老客,但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户,而消费者也对门…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...