Linux网络基础-2
在之前的网络基础博客中,我们对网络的基本概念进行了一个简单的介绍,那么接下来的网络内容中,我们将对网络通信中的典型协议进行详细解释。
我们根据网络协议中的分层来对典型协议进行注意介绍,不过对于物理层的传输我们不做考究,我们只从软件层面入手。接下来我们从应用层出发,讲述它的典型协议。
目录
1.应用层传输
1.1自定制协议
1.2HTTP协议
1.2.1内容
1.2.2特性
1.2.3格式
1.2.4Cookie
1.3HTTPS协议
1.应用层传输
应用层是负责应用程序之间的数据沟通,是一种面向程序员的协议。因为应用程序都是由程序员设计,所以它们之间的数据沟通也由程序员来设计完成。而其中一些协议的设计,在针对某些场景时,有很好的使用效果,并且使用人数较多。我们把这种协议称为知名协议。
1.1自定制协议
自定制协议时程序员自己定义的程序沟通数据格式约定,在我们设计自定制协议时,肯定需要就某些要素进行考虑,使得通向传输更加稳定,便捷和快速。
不过在了解这些要素之前,我们需要明白数据的序列化和反序列化的大致内容。对于序列化指的是,在网络传输或数据的持久化存储中,将多个数据对象按照指定格式组织成为一个二进程文件,进行传输或持久化存储的一个过程;对于反序列化指的是,对二进程数据进行指定格式的解析,得到各个数据对象内容的一个过程。
那么对于我们设计自定制协议需要考虑的要素内容便是:
- 传输性能:定制一个协议,传输的数据需要尽可能小(不影响表达),助于提高传输速度;
- 解析性能:传输和接收多个数据对象的时进行序列化和反序列化需要尽可能简单快捷;
- 调试便捷性:对于不同的程序员而言,拥有较好的可见性和可识别性。
在大致了解完毕自定制协议的内容之后,我们来讲述一些知名协议的内容。
1.2HTTP协议
1.2.1内容
HTTP协议是一种超文本传输协议,是现在互联网公司中使用最多的协议,它早期是用来传输web网页所设计的协议。
1.2.2特性
HTTP存在三点特性,即:
- 基于字符串明文传输,调试便捷性高;
- 是一种简单的请求--响应协议;(早期是短链接--一次请求响应结束后便关闭)
- 基于TCP协议传输,安全可靠。
1.2.3格式
HTTP的请求格式(请求报文)分为四部分,分别是:请求行(首行)、请求头部、空行和正文。
笔者引用《图解HTTP协议》书中的图示说明,其中请求方法、URL(URI)和协议版本构成的第一行内容是请求行(首行);接下来是请求头部(请求首部字段);然后空白部分是空行,用于分隔正文;最后剩下的内容便是正文(内容实体)。
对请求报文中内容进行逐一大致描述便是:请求行用于标识请求中的关键性描述信息;请求头部由多个键值对构成,用于对请求进行附加描述和对正文作以形容;空行用于分隔头部和正文;正文则是提交给服务器的数据内容。
解析来我们对请求报文的内容进行逐一细致解析,先对请求行中的内容进行仔细说明,首先是请求行中的请求方法:
GET | 获取资源,用来请求访问已被URI识别的资源 |
POST | 传输实体的主体,GET也能进行传输,但POST并不会获取响应的主体内容 |
PUT | 传输文件,要求在请求报文中包含文件内容,然后保存在URI指定位置 |
HEAD | 获得报文首部,同GET方法,但不返回报文主体 |
DELETE | 删除文件,是和PUT方法相反的方法 |
OPTIONS | 询问支持的方法,用于查询针对请求URI指定的资源支持的方法 |
TRACE | 追踪路径,让Web服务器端将之前的请求通信返回给客户端 |
CONNECT | 要求用隧道协议连接代理,用于和代理服务器实现用隧道协议进行TCP通信 |
其中最常使用的三种请求方法是:GET、POST和HEAD,还需注意GET和HEAD请求方法的区别。此外,附上HTTP1.0和HTTP1.1支持方法的差异:
然后是URL(URI),URL是统一资源定位符,是一个具体的网站定位信息(网址),我们可以直接通过URL连接来访问到具体的连接;而这部分内容也可以是URI,URI也是用于定位互联网上的信息,和URL不同的是URI是一种标识,是一个相对的路径连接。(https是对http协议的加密)
除此之外,如果不是访问特定资源而是对服务器本身发起请求时,我们可以使用一个 * 来代替请求URL(URI)。附上URL构成说明图片,同样出自于《图解HTTP》一书:
最后是协议版本,它所描述的是当前HTTP协议所使用的版本,不同的版本在功能支持力度上存在一些差距。具体的迭代过程,我们不做细究,有兴趣的伙伴可以阅读《图解HTTP》一书。
之后我们对请求头部内容进行解析,其中由一个个键值对构成,这是针对请求的一些附加描述,以及对请求正文的描述。需要注意的关键信息有:User-Agrant,Host,Referer……这些关键字来描述请求,还有:Content-Length和Content-Type者两者分别描述:正文长度和正文数据类型(决定对方如何解析数据)。
接下来是空行(/r/n)的解析,空行主要的作用也是前文我们所提到的:用于间隔HTTP头部和正文。实际上主要是用于实现HTTP解析时,先接收一个完整的HTTP头部,根据其中的Content-Length确定正文长度,然后根据长度取出指定大小的正文,则刚好能够获取一个完整的HTTP请求。
最后是正文,正文即是客户端提交给服务端的数据,其中的数据格式通过Content-Type来进行描述。
了解完HTTP请求格式(请求报文)后,我们来大概了解一些HTTP响应格式(响应报文):
首先是对于响应报文中的响应行(首行)中的内容,其中包括:协议版本、状态码和状态码描述。对于协议版本我们不做细究;然后是状态码,状态码主要用于明确告知客户端本次请求的处理结果,不同的状态码便代表不同的请求结果;最后是状态码的描述,状态码没有什么具体的功能意义,主要作用于告知程序员状态码的描述信息(文字)。
其次是对响应头部中的内容,需要注意的是Location关键字,其用来描述重定向,告知客户端上一次服务端所响应的连接;以及Connection关键字,用来描述当前所使用连接时短链接还是长连接。
然后是空行的作用同请求报文。最后正文即是响应给客户端的数据。
1.2.4Cookie
了解cookie之前,我们对HTTP的发展历程进行简单说明,也是为了回答我们在HTTP中为什么需要cookie。
在HTTP的初始版本中,每进行一次的HTTP通信就要断开一次TCP连接,这种连接方式也叫做短链接。这是因为在当时的通信情况中,数据都是一些容量很小的文本传输,所以即使每次连接都断开也不会产生问题。
但随着HTTP的普及,文本中包含大量图片的情况就多了起来。此时短链接的方式,在每次通信中会增加请求HTML页面的其他资源,扩大了通信量的开销。所以在HTTP1.1的一部分的HTTP1.0中提出了持久连接(长连接)。
这样的连接方式也叫做:HTTP keep-alive(HTTP connection reuse)方法。如此,在客户端和服务端通信中,只要其中任一端没有明确提出断开连接之前,则会一直保持TCP连接。在HTTP1.1中所有的连接默认都是持久连接,但在HTTP1.0中并未对其进行标准化。
持久化连接使得多数请求以管线化方式发送数据成为可能,在此之前发送请求后需要等待响应请求之后,才可以发送下一个请求。这样一问一答的方式,并不利于效率的提高。所以管线化技术实现后,我们不用等待也可以直接发送下一个请求。如此便可以做到通信并发多个请求,而不需要一个接一个的等待响应。
但仅对连接的优化使得通信效率提高并不能满足我们对通信的期待,因为HTTP是无状态协议,它并不会对之前发生的请求和响应状态进行存储和管理,这意味着我们无法根据之前的请求来对本次请求进行处理,我们无法将上下的响应内容相互联系。
当我们访问需要登录的Web页面时,由于它本身并不对登录状态进行管理(记录已登录的状态)。所以在每次跳转和刷新页面的时候,我们都需要重新在请求报文中添加登录信息。
从一方面来说,身为无状态协议的HTTP协议,由于不需要保存状态的原因,可以很有效的减少CPU及内存资源的消耗;但从另一方面来说,不保存状态并不列于我们对于一些场景的使用。
于是我们引入了Cookie技术(信息缓存机制),通过在请求报文和响应报文中写入Cookie信息来控制客户端的状态。Cookie根据响应报文中Set-Cookie的首部字段信息来通知客户端保存Cookie,当下一次客户端继续向服务端发送请求时,客户端会自动在请求报文中加入Cookie值再发送。
服务端会检查客户端发送过来的Cookie,通过其中内容识别出是那一个客户端发送的连接请求,然后对比服务器上的记录,最终得到之前的状态信息。
Cookie技术很好的解决的我们在多次通信中不断维护客户端的状态,但是这并不安全,当我们的通信被劫持之后,其中的敏感信息很容易被获取。所以我们并不能将敏感信息直接以Cookie的方式进行传输。
我们引入session会话机制,在客户端和服务端之间的通信建立一个会话,将会话的重要内容保存起来,会话内容将保存在服务器之中,接下来我们只需要通过Cookie传输session_id即可访问对应信息。如此便很好的避免了敏感信息的传输,提高了传输的安全性。
不过尽管如此仍存在一些安全隐患:Cookie篡改,于是引入token来解决。
1.3HTTPS协议
在了解HTTP协议之后,我们可以来讲述以下HTTPS协议。通俗而言,HTTPS协议实际上就是加密之后的HTTP协议。
因为HTTP协议在传输过程中容易被劫持,所以我们引入HTTPS协议对其进行加密,对于加密我们采取两种方式:身份加密和加密传输。
身份加密:我们采用CA认证,即电子认证服务。是通信双方到第三方权威机构,办理一份CA证书,当后面连接建立后,会将证书先发送给对方,对方对证书解析成功之后,双方才会进行正常的通信。
传输加密是对通信双方传输的数据进行加密。对于不同的加密方式我们存在不同的加密算法,通向双方需要对密钥(算法)进行协商,确定加密和解密的密钥。
我们将数据加密和解密使用相同密钥的传输加密称作对称加密;将数据加密和解密使用不同密钥的传输加密称作非对称加密。
对称加密:在传输过程中密钥容易被劫持,导致加密形同虚设,通信不安全;但是由于加解密采用密钥相同,其传输效率较高。
非对称加密:传输过程中我们使用相关算法生成一对密钥:公钥和私钥。在传输过程中,通信双发分别向对方发送自己的加密算法(公钥),并保留自己加密算法的解密密钥(私钥)。如此在通信过程中,客户端和服务端各自使用接收到的对方加密算法(公钥)来对传输的数据进行加密,通信双方再通过自己保留的解密算法(私钥)对数据进行解密,即可获得数据的原本内容。
非对称解密对传输数据的处理方式保证了数据传输的安全性,因为即使传输数据被劫持,对方知晓公钥也无法对数据解密;但是由于加解密算法的不同会导致传输更花费时间,效率较低。
为集合两种传输加密的优势,我们引入了混合加密的设计,来对对称加密和非对称加密都进行使用。其原理是:我们首先使用对称加密来快速对数据进行加密,数据将被处理为密文;然后我们将对称加密后的密文,当作非对称加密传输中的数据来进行处理即可。
因为对称加密对数据加密之后得到的密文长度比原数据长度更加简短,所以此时再采用非对称加密进行传输的话,便可以很好的避免非对称加密处理较长数据的解加密时间过长问题。
相关文章:

Linux网络基础-2
在之前的网络基础博客中,我们对网络的基本概念进行了一个简单的介绍,那么接下来的网络内容中,我们将对网络通信中的典型协议进行详细解释。 我们根据网络协议中的分层来对典型协议进行注意介绍,不过对于物理层的传输我们不做考究…...
软件测试报告模板
目录 2 1 概述... 3 1.1 测试目的... 3 1.2 测试策略... 3 1.3 测试方法... 3 1.4 计划验收标准... 3 1.5 测试用例... 4...

记一次azkaban调度异常处理
一、背景 预发布环境使用的数据库性能比较低,根据业务测试的需求,需要将数据库更换成 稳定高性能的数据库。更换业务数据库后azkaban定时任务失败 二、数据库服务信息 说明:该部分使用代号来代替,非真实信息 该数据库存储了azka…...
开发一个vue自定义指令的npm库-系列三:使用rollup打包npm库并发布
配置 rollup 使用rollup将 TypeScript 代码转换为 JavaScript,然后进行压缩和输出到目标文件。 项目根目录新建rollup.config.js import typescript from "rollup/plugin-typescript"; import terser from "rollup/plugin-terser"; import de…...

C嘎嘎的运算符重载基础教程以及遵守规则【文末赠书三本】
博主名字:阿玥的小东东 大家一起共进步! 目录 基础概念 优先级和结合性 不会改变用法 在全局范围内重载运算符 小结 本期送书:盼了一年的Core Java最新版卷Ⅱ,终于上市了 基础概念 运算符重载是通过函数重载实现的…...

【MCAL_UART】-1.2-图文详解RS232,RS485和MODBUS的关系
目录 1 UART,RS232和RS485通信拓扑 2 什么是RS232 2.1 RS232标准的演变 2.2 RS232标准讲了哪些 2.2.1 RS232通信的电平 2.2.2 RS232通信的带宽 2.2.3 RS232通信距离 2.2.4 RS232通信的机械接口 3 什么是RS485 3.1 RS485标准的演变 3.2 RS485标准讲了哪些…...
设计模式详解(二)——单例模式
单例模式简介 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛,它提供了一种创建对象的最佳方式。 单例模…...

为什么hooks不能在循环、条件或嵌套函数中调用
hooks不能在循环、条件或嵌套函数中调用 为什么? 带着疑问一起去看源码吧~ function App() {const [num, setNum] useState(0);const [count, setCount] useState(0);const handleClick () > {setNum(num > num 1)setCount(2)}return <p …...

互联网赚钱项目有哪些?目前最火的互联网项目
互联网是一个神奇的行业,大门不出二门不迈,一根网线一台电脑,甚至一台手机就可以赚钱。它给我们创造了前所未有的商业机会,让成千上万有梦想,敢想敢干的人通过互联网获得了巨大的成功!正因为如此࿰…...

队列、栈专题
队列、栈专题 LeetCode 20. 有效的括号解题思路代码实现 LeetCode 921. 使括号有效的最少添加解题思路代码实现 LeetCode 1541. 平衡括号字符串的最少插入次数解题思路代码实现 总结 不要纠结,干就完事了,熟练度很重要!!ÿ…...

TensorFlow vs PyTorch:哪一个更适合您的深度学习项目?
在深度学习领域中,TensorFlow 和 PyTorch 都是非常流行的框架。这两个框架都提供了用于开发神经网络模型的工具和库,但它们在设计和实现上有很大的差异。在本文中,我们将比较 TensorFlow 和 PyTorch,并讨论哪个框架更适合您的深度…...
大项目环境配置
目录 Linux的龙蜥8是什么? OpenGL是什么? 能讲讲qt是什么吗? 我可以把qt技术理解为c工程师的前端开发手段吗? 我其实一直有些不懂大家所说的这个开发框架啥的,这个该如何理解呢 那现在在我看来,框架意…...
Elasticsearch——》正则regexp
推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...

五面阿里Java岗,从小公司到阿里的面经总结
面试 笔试常见的问题 面试常见的问题下面给的面试题基本都有。 1 手写代码:手写代码一般会考单例、排序、线程、消费者生产者 排序。 2 写SQL很常考察group by、内连接和外连接 2.面试1-5面总结 1)让你自我介绍 2)做两道算法…...

redis(7)
全局ID生成器: 全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足以下特性 唯一性高可用(随时访问随时生成)递增性安全性(不能具有规律性)高性能(生成ID的速度快) 为了增加ID的安全性,我们不会使用redis自增的数值&am…...
互联网从业者高频单词 300个
测试 (Test) 软件 (Software) 用例 (Test Case) 缺陷 (Defect) 提交 (Submit) 回归测试 (Regression Testing) 验收测试 (Acceptance Testing) 单元测试 (Unit Testing) 集成测试 (Integration Testing) 性能测试 (Performance Testing) 负载测试 (load Testing) 压…...

初始化vue中data中的数据
当组件的根元素使用了v-if的时候, 并不会初始化data中的数据 如果想完全销毁该组件并且初始化数据,需要在使用该组件的本身添加v-if 或者是手动初始化该组件中的数据 初始化化数据的一些方法 Object.assign(this.$data, this.$options.data()) this.$data:当前的da…...
神经网络的建立-TensorFlow2.x
要学习深度强化学习,就要学会使用神经网络,建立神经网络可以使用TensorFlow和pytorch,今天先学习以TensorFlow建立网络。 直接上代码 import tensorflow as tf# 定义神经网络模型 model tf.keras.models.Sequential([tf.keras.layers.Dense…...

python基于卷积神经网络实现自定义数据集训练与测试
注意: 如何更改图像尺寸在这篇文章中,修改完之后你就可以把你自己的数据集应用到网络。如果你的训练集与测试集也分别为30和5,并且样本类别也为3类,那么你只需要更改图像标签文件地址以及标签内容(如下面两图所示&…...

跟着LearnOpenGL学习3--四边形绘制
文章目录 一、前言二、元素缓冲对象三、完整代码四、绘制模式 一、前言 通过跟着LearnOpenGL学习2–三角形绘制一文,我们已经知道了怎么配置渲染管线,来绘制三角形; OpenGL主要处理三角形,当我们需要绘制别的图形时,…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...