当前位置: 首页 > news >正文

Linux 网络基础(2)应用层(http/https协议、请求格式、响应格式、session、cookie、加密传输)

说明:网络基础2讲解的是应用层的典型协议, 通过对于典型协议的理解,来体会数据的网络传输的软件层面的流程与原理。

面试中网络通信相关问题占了很大的比重,而网络通信相关的问题大多都集中在网络基础2这个单元中

下面是应用层的位置:

应用层: 自定制协议 (私有协议) ,HTTP协议;

传输层: UDP & TCP协议

1.应用层

应用层: 负责应用程序之间的数据沟通

应用层协议其实是面向程序员的协议,因为应用程序是程序员写的,因此应用程序之间如何沟通是程序员定的。

程序员自己定理的程序沟通的数据格式约定,而针对某些场景,大佬们定制出的协议,大家觉得非常好,都用了这种协议,这种协议叫做知名协议

自定制协议: 程序员自己定义的程序沟通的数据格式约定

序列化:在网络传输或者数据的持久化存储时,将多个数据对象按照指定格式组织成为一个二进制数据传进行传输或持久化的过程

反序列化: 对二进制数据传,按照指定格式进行解析,得到各个数据对象的过程

程序员设计自定制协议的时候需要考虑的要素有哪些?

1.传输性能:定制一个协议,传输的数据尽可能短小,传输数据的时候才能尽可能的快。

2.解析性能:传输多个数据对象的时候需要进行序列化,对方拿到数据后要进行反序列化,解析性能指得就是序列化和反序列化要足够快

3.调试便捷性:讨论的更多的式对于程序员的可见性,可识别性。

举例:网络版计算器

一个客户端要进行两个数据的运算,运算的过程并不自己进行,而是将数据传输给服务器,让服务器运算,并返回结果。

数学运算: 11 + 22

需要向服务器传输的数据对象有三个: 第一个数字,第二个数字,运算符

协议如何定制:

方案1: 11+22字符串传输, 解析过程:获取数字字符,遇到其他字符截止,取出第一个数字,特殊字符为运算符,剩下的获取数字字符

方案2:解析过程: 先以;进行字符串分割,前两个字符串转换为数字,最后是运算符11;22;+;

方案3:二进制序列化,将三个对象的二进制数据分别放到一整块内存的指定位置,最终按照位置进行解析即可

因为网络传输是跨主机的传输,因此结构体序列化需要考虑:

  1. 结构体内存对齐问题

  1. 传输的数据字节序问题

2.http协议

HTTP协议: 互联网公司中使用最多的协议。

认识: HTTP--超文本传输协议 (最早期就是为用来传输web网页而设计的)

特性:

1.基于字符串明文传输的,调试便捷性高,

2.是一种简单的请求-响应协议(早期是短链接-一次请求-响应结束就关闭)

  1. 基于TCP协议,传输安全可靠。

3.请求格式

格式:想要使用一个协议,用的好,就必须去了解他的格式,了解协议中每一个字段的功能.

1.请求行:请求中的第一行,主要对请求进行关键性描述

请求行中的内容分为三部分,以空格作为间隔,请求行以\n \r作为结尾(请求行,其实刚好就是一行数据)

第一部分: 请求方法:多种多样,描述不同的请求目的

GET:向服务器请求一个网页实体资源,请求中没有正文,但是也可以向服务器提交数据,提交的数据在URL中(安全性低,长度受限

POST: 向服务器提交表单数据,请求中有正文

HEAD:面试中经常会问GET和HEAD有什么区别--目的与GET类似,但是不同的是,实际的响应中不要实体资源,只要响应头部

PUT: 更新服务器上的资源

DELETE:删除服务器上的资源

................

第二部分: URL

第三部分: 协议版本

描述了当前请求所使用的HTTP协议版本,不同的版本之间有功能支持力度上的差异

HTTP协议的版本迭代:

HTTP/0.9--- 0.9版本,是一个不成熟的版本,只能使用GET获取网页,而且也没有当前的完善的协议格式

HTTP/1.0---1.0版本,完善了协议格式,新增支持了更多的请求方法:GET,HEAD,POST,并且有了缓存的控制,以及流媒体的传输

HTTP/1.1---1.1版本,是当前用的最多的版本,新增支持了更多的请求方法:PUT,

DELETE ....;针对当前的网络,觉得以前的通信效率太低了: 支持了长连接,对缓存的管理更加精细了

长连接与短链接:

短链接:建立TCP连接-》发送请求-》接收响应-》关闭连接

每次要获取一个资源,都要重新建立连接,关闭连接,效率很低

长连接(管线化传输):

长连接: 建立连接-》发送请求-》接收响应-》发送请求-》接收响应。。。。-》关闭连接

长连接管线化传输:建立连接-》发送请求-》接收响应-》发送请求1-》发送请求2-》接收响应1-》接收响应2-》关闭连接

HTTP/1.1版本的迭代,更多的是对传输效率的改进

HTTP/2这个版本是一个大跃进,因为并不向前兼容

1.使用二进制传输,以前是名文字符串

2.不用重复每次请求传输相同的头部字段

3.长连接的一些改进,不需要按序响应,解决了队头阻塞问题

4.主动推送功能的加入,服务器响应数据的时候,可以主动响应依赖数据

2.请求头部:一个个的键值对,对于请求的附加描述以及对正文的描过

请求头部: 由的键值对组成,key: val r nkey:针对请求的些附加描述,以及对于请求正文的描述valrin

请求头部 (只会在请求中出现的头部字段,描述请求)

User-Agent,Host,Referer....

正文头部 (在请求与响应中都会出现,主要是对于正文的描述),

Content-Length:129 用于描述正文长度

Content-Type: application/json;charset=UTF-8 用于描述正文的数据类型,决定了对方如何解析处理正文

响应头部(只会在响应中出现的头部字段,描述响应)

Location: http://baidu.com 用于描述重定向

通用头部(在请求与响应中都会出现,属于对于本次通信或者连接的一些描述)

Connection: keep-alive/close : 用于描述当前的连接使用的是短链接还是长连接

3.空行: 间隔头部与正文

空行: \rn 主要用于间隔HTTP头部与正文

主要是实现在HTTP协议解析时,先接收一个完整的HTTP协议头部,根据其中的Content-Length确定正文长度,然后根据正文长度,取出指定长度的正文,则刚好能够完整的获取到一条HTTP请求。

4.正文:提交给服务器的数据

正文: 提交给服务器的数据,类型格式通过Content-Type描述

4.响应格式

响应格式:响应行,响应头部,空行,正文

响应行: 协议版本 状态码 状态码描述\r\n ---> HTTP/1.1 200 0K\r\n

状态码: 用于明确直接的向客户端表示本次请求的处理结果

1xx:继续请求或者协议切换,101---协议切换

2xx:请求已经成功处理了,200---成功处理:206---区间内容处理成功

3xx:表示请求进行了重定向 301---永久重定向 302---临时重定向:

303-see other 304--not modifvy,

重定向:把一个请求,重定向到其他链接。示例:一个请求,要请求的资源,被移动到了其他位置。但是想要依然保持原链接有效301.302,303这种要跟 Location响应头字段搭配使用,Location字段用于指定的重定向的新链接, Location: htp:/baidu.com

4xx:表示客户端的错误, 400--bad request,404--Not Found 请求的资源不存在

5xx: 表示服务器的错误, 500--服务器内部错误

502--bad gateway,代理服务器连接服务器失败; 504-gateway timeout--代理请求超时

状态码描述:没有实际的功能性意义,给程序员看的,是对于状态码的文字描述信息

响应头部: Connction, Location 。。。。

空行:间隔头部与正文

5.Cookie

头部字段中的 Cookie (请求头) & Set-Cookie (响应头)

:http是一个简单的请求-响应协议,不管是短链接还是长连接,连接都不是一直持续的。

这样就会存在一个问题: 例如在购物网站购物,因为连接不是持续的,导致每次买东西都要重新建立连接,进行登录因此就需要不管连接是不是原来的,但是都要能够区分出用户,为了解决这个问题就提出了一个方案: cookie机制

cookie:小饼干,cookie是一种信息缓存机制,将一些信息保存到客户端主机上,等下一次请求服务器的时候读取出来发送给服务器

Set-Cookie (响应头) :告诉客户端,那些信息需要保存起来,保存到客户端本地

6.session(会话)

session: 会话,就是为客户端与服务器的通信建立一个会话,将会话重要内容保存起来,会话内容被保存在服务器上,通过cookie只需要传输Session id 即可这样做有个好处,不会在网络上传输用户的敏感信息

session会话机制,是在cookie的基础上,避免了敏感信息的传输,提高了安全性

cookie和session的区别:

1.cookie是将关键信息保存在客户端本地,每次通信前发送给服务器

2. session是将会话信息保存在服务器,通过session id进行cookie传输,保护隐私性

本质上来说这两种还是有一些安全隐患的: cookie篡改 --- 解决方案: token

7.HTTPS协议

HTTPS协议:在HTTP协议的基础上进行了一层加密,因此HTTPS不是一个新的协议,而是一个加密后的HTTP协议。

加密: SSL/TLS加密

为什么要加密:

身份验证:小明和小红是小学同学,小明有一天给小红表白,我喜欢你,小红说我也喜欢你,你先给我打200块行不行过了一段时间,过年了,小明和小红都回村子了,小明去找小红,小红说我的gg早都已经被盗了。在网络通信的时候,我们都必须明确知道对方是谁,并且还要能够验证,现在通信的就是这个人,而且还要防止对方赖账

解决方案:第三方权威机构+CA认证

8.加密传输

对传输的数据进行加密

通信双方进行传输加密,需要进行密钥的协商

对称加密:数据的加密和解密使用的是相同的密钥

缺点:进行密钥协商的时候容易被劫持,加密形同虚设;

优点:加解密的效率高

非对称加密:数据加密和解密使用的密钥是不一样的

缺点:加解密效率较低

优点:安全,不怕劫持

思想:通过指定的算法(RSA),可以生成一对密钥(公钥&私钥),使用公钥进行数据加密,加密后的数据只能使用私钥进行解密

流程:连接成功后,将自己的公钥发送对方,对方使用公钥加密要传输的数据,这个数据就只能用私钥解密

混合加密

思想:假设是客户端对服务器进行验证

  1. 服务器生成一对非对称密钥,连接成功建立,通信前,将公钥发送客户端

  1. 客户端收到后,使用公钥加密一个随机数A,以及自己支持的对称加密算法

  1. 服务器收到后,使用私钥进行解密,得到随机数A,以及对方的对称加密算法

  1. 服务器向客户端发送一个随机数B,以及自己支持的对称加密算法

客户端和服务器,各自根据两个随机数以及支持的对称加密算法,计算出一个对称,密钥。

e.往后的通信使用对称密钥进行加密解密

在实际的SSL加密中,身份验证和加密传输是整合在一起的。CA证书中包含了更多的信息: 通信方的公钥,机构信息,证书颁发机构信息,失效时间.....整体流程: 单向验证,以服务端验证为主

1.服务器自己生成一对密钥,拿着公钥,去第三方权威机构颁发证书

2.权威机构根据服务器的公钥,生成一个CA证书,给服务器

3.客户端与服务器建立连接后,通信前,服务器先将CA证书发送给客户端

4.客户端收到CA证书,进行解析验证权威机构是否自己信任,在权威机构验证对方身份,解析出公钥

5.客户端生成一个随机数,使用公对随机数+加密算法进行加密,发送给服务器

6.服务器收到数据后,使用私钥进行解密,生成一个自己的随机数,将随机数和加密算法发送给客户端

7.客户端收到数据后,客户端和服务器都有对方的随机数,和自己的随机数,以及加密算法,进行计算得到一个对称密钥

8.往后通信,使用对称密钥进行传输加密

相关文章:

Linux 网络基础(2)应用层(http/https协议、请求格式、响应格式、session、cookie、加密传输)

说明:网络基础2讲解的是应用层的典型协议, 通过对于典型协议的理解,来体会数据的网络传输的软件层面的流程与原理。 面试中网络通信相关问题占了很大的比重,而网络通信相关的问题大多都集中在网络基础2这个单元中 下面是应用层的位…...

解决sshfs挂载报错

使用ssh命令和sshfs命令报错 read: Connection reset by peer rootjiangcheng01:~/common/remote# sshfs -o allow_other htrdxxx.xxx.xxx.xxx:/home/htrd /root/common/remote/dev01 read: Connection reset by peer 报错问题排查,追加命令 -o debug -o sshf s_d…...

由于过多的连接错误而被 MySQL服务器 阻止

Caused by: com.mysql.cj.exceptions.CJException: null, message from server: "Host 10.105.***.** is blocked because of many connection errors; unblock with mysqladmin flush-hosts" 这个错误可能表示当您尝试使用 IP 地址为 "10.105.***.**" 的…...

Go语言实现JDBC

Go语言操作数据库 Go语言提供了关于数据库的操作,包下有sql/driver 该包用来定义操作数据库的接口,这保证了无论使用哪种数据库,操作方式都是相同的; 准备工作: 下载驱动 需要在代码所在文件夹下执行相应的命令 go get github.com/go-sql-driver/mys…...

ubuntu修改环境变量的几种方法

ubuntu修改环境变量的几种方法 有多种方法可以修改Ubuntu系统的环境变量,包括: 临时修改环境变量:在终端中使用export命令可以临时修改环境变量。例如,要将PATH环境变量添加到新目录,可以运行以下命令: …...

基于html+css的图展示95

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…...

数据库基础——5.运算符

这篇文章我们来讲一下SQL语句中的运算符操作。 说点题外话:SQL本质上也是一种计算机语言,和C,java一样的,只不过SQL是用来操作数据库的。在C,java中也有运算符,这两种语言中的运算符和数学中的运算符差距不…...

JMeter 性能测试基本过程及示例

jmeter 为性能测试提供了一下特色: 2023年最新出炉性能测试教程,真实企业性能压测全流程项目实战训练大合集!_哔哩哔哩_bilibili2023年最新出炉性能测试教程,真实企业性能压测全流程项目实战训练大合集!共计11条视频&…...

漏洞复现 CVE-2018-2894 weblogic文件上传

vulhub weblogic CVE-2018-2894 1、 搭建好靶场,按提示访问 http://192.168.137.157:7001/console 按照给出的文档,会查看容器的日志,找到管理员用户名/密码为 weblogic / h3VCmK2L,暂时用不到,不需要登录 2、未授权…...

二叉树:填充每个节点的下一个右侧节点指针(java)

leetcode116:填充每个节点的下一个右侧节点指针 leetcode原题链接:题目描述递归解法一递归方法二(效率更高)二叉树专题 leetcode原题链接: 116题:填充每个节点的下一个右侧节点指针 题目描述 给定一个 完美二叉树 &a…...

Android 12.0修改系统默认设备类型的平板电脑类型为设备类型

1.概述 在12.0的系统rom产品开发中,对于产品设备类型都默认为tablet即平板电脑类型,即 product="tablet" 在一些不是平板的项目中,可能需要修改这个类型为device类型 即 product="device",这就需要找到相关设置系统属性的代码,修改系统属性就可以了 2…...

debug研究

debug研究 debug的condition 通常用在for循环里面 for循环中实际使用 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UsmJ93w5-1685344057464)(D:\typora_pic_all\image-20230529145417753.png)] log.info("当前共有{}条数据待处理", vos…...

zabbix监控系统

一、Zabbix概述 1、使用zabbix的原因 作为一个运维,需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数据去了解上线发布的结果,和网站的健康状态。 利用一个优秀的监控软件,我们可以: ●通过一个友好的界面进…...

Python入门学习

一、执行Python(Hello World)程序 对于大多数程序语言,第一个入门编程代码便是 “Hello World!”,以下代码为使用 Python 输出 “Hello World!” 1.1 创建hello.py文件 1.2 编写程序 #!/usr/bin/python…...

自动驾驶嵌入式开发工程师:车载SOC开发修炼秘籍

声明:本文档是博主在开发学习过程中写的笔记,本意是便于以后开发复盘,参考《 ug1144-petalinux-tools-reference-guide》、《ug1085》、黑金Zynq UltraScale MPSoC 5EV开发板资料、英伟达官方资料。大佬勿喷 大佬勿喷 大佬勿喷!&a…...

Linux之搭建环境

文章目录 1 FileZilla软件2 Linux搭建samba文件共享服务器,实现基于Linux和Windows的共享文件服务2.1 smaba的安装与基本应用2.2 samba的账号权限配置2.3 win系统下的文件无法复制到Linux共享文件夹中 1 FileZilla软件 在跟着正点原子教程安装后,出现如下…...

泡利矩阵(一)

〇、厄米矩阵 厄米矩阵(Hermitian Matrix),也称为自共轭矩阵(Self-adjoint Matrix),是线性代数中的一个重要概念。它是指一个复数域上的方阵,其转置矩阵与共轭矩阵相等。 具体来说&#xff0c…...

通用支付系统设计

支付永远是一个公司的核心领域,因为这是一个有交易属性公司的命脉。那么,支付系统到底长什么样,又是怎么运行交互的呢?抛开带有支付牌照的金融公司的支付架构,下述链路和系统组成基本上符合绝大多数支付场景。其实整体可以看成是…...

metaRTC+ZLMediaKit实现webrtc的推拉流

概述 ZLMediaKit是一个基于C11的高性能运营级流媒体服务框架,是一个支持webrtc SFU的优秀的流媒体服务器系统。 metaRTC新版本支持whip/whep协议,支持whip/whep协议的ZLMediaKit推拉流。 信令通信 ZLMediaKit新版本支持whip和whep协议,支…...

【JavaSE】Java基础语法(八)

文章目录 🍓1. 类和对象🍹🍹1.1 类和对象的关系🍹🍹1.2 类的定义 🍓2. 对象内存图🍹🍹2.1 单个对象内存图🍹🍹2.2 多个对象内存图2.3 多个对象指向相同内存图…...

Java如何配置环境变量

Java如何配置环境变量 0. 前言1. 下载Java2. 配置环境变量2.1新建 Java_Home2.2 编辑Path情况1情况2 3. 验证安装 0. 前言 本节记录如何配置Java环境变量,用自己重装过的系统实操 操作系统:Windows10 专业版 Java版本:jdk1.7.0_07 1. 下载…...

android 12.0SystemUI 状态栏下拉快捷添加截图快捷开关

1.概述 在12.0的系统产品rom定制化开发中,对SystemUI的定制需求也是挺多的,在下拉状态栏中 添加截图快捷开关,也是常有的开发功能,下面就以添加 截图功能为例功能的实现 2.SystemUI 状态栏下拉快捷添加截图快捷开关的核心代码 frameworks/base/packages/SystemUI/res/va…...

【无标题】 Vue 路由库Router 【重点】 - 安装 - 基本使用 - 路由配置 - 路由模式 - 路由传递参数 - 路由内置对象 - 路由守卫

0.0 课程介绍 Vue 路由库Router 【重点】 安装基本使用路由配置路由模式路由传递参数路由内置对象路由守卫 Vue的内置API 【掌握】 ref Vue.set Vue.nextTick Vue.filter Vue.component Vue.use Vue.directive 1.0 Vue的路由Router 【重点】 1.1 路由作用 进行页面…...

RocksDB笔记 -- 整体架构

RocksDB是由Facebook开发的存储引擎, 它最初的目标是用于快速存储, 特别是Flash存储. 一个基于C开发keys-values存储引擎库. 整体架构 RocksDB由这三个基本结构组成: memtable, sstfile 和 logfile. 其中: memtable是一个内存数据结构, 新的写入会插入到memtable中, 同时可选…...

设计模式之单例模式入门介绍

一、设计模式概念 设计模式是被广泛使用的软件开发中的一种解决方案,它提供了一套被验证过的、可重用的设计思想,帮助开发人员更加高效地开发出可维护、易扩展的软件系统。 设计模式可以分为三类:创建型模式、结构型模式和行为型模式。 1.1…...

RHCE 作业三

1.基于域名访问网站 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld [rootserver ~]# systemctl disable firewalld [rootserver ~]# yum install httpd -y [rootserver ~]# systemctl start httpd [rootserver ~]# syst…...

90.qt qml-Table表格组件(支持表头表尾固定/自定义颜色/自定义操作按钮/插入排序)

众所周知,qml table在目前版本还很废,qt5的table完全就没法用,在之前章节就写过: 88.qt qml-TableView学习(一)_诺谦的博客-CSDN博客 所以本章便参考VUE-Element的Table外观组件实现一个可排序可操作的Table组件. 1.组件介绍 GIF如下所示: 排序支持数字和字符串排序。 …...

android 12.0SystemUI屏蔽某个app的通知

1.概述 在12.0的产品开发中,对于系统的通知部分,要求根据app包名来过滤掉一部分通知,就是在接收到系统通知时,根据包名判断是否需要接收通知的功能,首选要分析通知流程,然后实现功能 2.SystemUI屏蔽某个app的通知相关代码 frameworks\base\packages\SystemUI\src\com\…...

注意力机制(一)SE模块(Squeeze-and-Excitation Networks)论文总结和代码实现

Squeeze-and-Excitation Networks(压缩和激励网络) 论文地址:Squeeze-and-Excitation Networks 论文中文版:Squeeze-and-Excitation Networks_中文版 代码地址:GitHub - hujie-frank/SENet: Squeeze-and-Excitation Ne…...

L2-001 紧急救援(dijkstra算法练习)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的…...