【协议】HTTP、HTTPS和HTTP2.0学习总结

1. TCP/IP四层协议

        记得大学学网络课程的时候,学的都是OSI/RM七层协议应用层 -> 表示层 -> 会话层 -> 传输层->网络层->数据链路层->物理层,当时学的时候,感觉太抽象了,学得个一知半解。大脑在接收新东西时,需要有个具体实物或模型对应,将知识具像化,再高深的知识都容易理解。

        言归正传,本文主要是总结一下HTTP通信过程,以及HTTPS是在HTTP基础上干了什么,而HTTP2.0又是对HTTP1.1做了啥大刀阔斧的改进。在讲这些之前,先讲讲TCP/IP四层协议。虽然OSI/RM七层协议是理论标准,TPC/IP四层协议是事实标准,多少层都无所谓,只是计算机/网络科学家按一定规则分的,便于理解和传播。

        TCP/IP四层协议应用层 -> 传输层 -> 网络层 -> 数据链路层,此处“应用层”对应OSI/RM的“应用层 -> 表示层 -> 会议层”,此处“数据链路层”对应OSI/RM的“数据链路层->物理层”(后续笔者再补个映射图吧)。

1.1 应用层协议

举例:HTTP、FTP、SMTP、POP3......

作用:应用层负责为用户提供网络服务,例如电子邮件、文件传输和远程登录

1.2 传输层协议

举例:TCP、UDP

作用:传输层负责在网络中建立端到端的连接,提供可靠的数据传输。注:

  • TCP协议是一种可靠的传输协议,通过三次握手建立连接,并通过序列号和确认号来保证数据的可靠传输。
  • UDP协议是一种无连接的传输协议,是基于IP协议的传输协议,不提供可靠的数据传输服务,较低的延迟和较小的数据包头部开销。
1.3 网络层协议

举例:IP、ARP、ICMP、IGMP......

作用:网络层负责将数据包从一个节点传输到另一个节点,并提供寻址和路由功能

  • IP协议是一种无连接的协议,是基于ARP协议的网络层协议,IP协议负责将数据从源主机发送到目的主机,通过IP地址来标识主机位置。
  • ARP协议是一种用于解析IP地址和MAC地址之间映射关系的协议,它是基于IP协议的网络层协议,ARP负责将IP地址转换为MAC地址,以便在局域网中进行数据通信。
  • ICMP协议是一种用于网络管理的协议,是基于IP协议的网络层协议,ICMP负责报告网络错误和状态信息,例如:网络不可达、主机不可达。
1.4 数据链路层协议

举例:Ethernet、Wi-Fi、PPP(Point-to-Point Procotol)、ATM(Asynchronous Transfer Mode)

作用:数据链路层负责将数据包从一个节点传输到另一个节点,并提供错误检测和修复功能

2. HTTP协议和TCP三次握手/四次挥手
2.1 HTTP协议数据包装过程

应用层:上层数据(HTTP头部 + HTTP body)

传输层:TCP头 + 上层数据

网络层:IP头 + TCP头 + 上层数据

数据链路层:LLC头 + IP头 + TCP头 + 上层数据 + FCS

MAC头 + LLC头 + IP头 + TCP头 + 上层数据 + FCS

2.2 TCP建立连接-三次握手

SYN seq=x(client -> sever)

SYN seq=y ACK=x+1(server -> client)

ACK=y+1(client -> server)

2.3 TCP断开连接-四次挥手

FIN seq=x+2 ACK=y+1(client -> server)

ACK=x+3(server -> client)

FIN seq=y+1(server -> client)

ACK=y+2(client -> server)

3. HTTPS

        HTTP数据是未加密的,别有用心者在网络某个节点上抓包,可以很容易知道传了什么数据。为了数据安全的传输,提出来超文本传输安全协议HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer)。HTTPS涉及对称加密非对称加密

3.1 对称加密
  • 明文 + 密钥 -> 密文
  • 密文 + 密钥 -> 明文

即加密和解密是用同一个密钥,需要保障密钥的安全。

3.2 非对称加密
  • 明文 + 私钥 -> 密文1
  • 密文1+ 公钥 -> 明文
  • 明文 + 公钥 -> 密文2
  • 密钥2 + 私钥 -> 明文

即私钥加密公钥解密,公钥加密私钥解密。

由于公钥是公开的,也即私钥加密的数据,没有安全性,因此需要结果对称加密一起使用。例如:对称加密的密钥Key,通过非对称加密的公钥PublicKey加密,传给对端;对端使用私钥PrivateKey解密拿到对称加密的密钥Key,后续二者就通过对称加密来交换数据即可。

(PS:对称和非对称加密,是一种比较有趣的二进制数学运算,有兴趣的同学可以了解一下,笔者后续推出详细介绍加解密的文章)

3.3 对称加密+非对称加密
  • 客户端向服务器请求公钥
  • 服务器响应公钥信息给客户端
  • 客户端随机生成一个随机数(对称加密的密钥),并使用公钥进行加密,发送给服务端
  • 服务端根据私钥对数据进行解密,得到对称加密的密钥
  • 后续客户端与服务端对称加密的方式进行通信

两个问题:

  • 数字签名解决报文被篡改的问题:将发送的数据用Hash算法生成消息摘要,然后用私钥生成数字签名,与原文一起发送,接收者用公钥解开得到摘要信息A,再用Hash对接收到的原文生成一个摘要信息B,A和B进行比较,说明信息未被篡改。
  • 数字证书解决通信身份被伪装的问题
3.4 HTTPS通信

TLS握手过程:明文 -> 非对称加密 -> 对称加密

Step 1:TCP三次握手

Step 2:浏览器给出TLS协议版本号、客户端生成随机数1、客户端支持的加密方法(明文通信) 

Step 3:服务器确认双方使用的加密方法,给出数字证书、服务器生成随机数2(明文通信)

Step 4:浏览器确认证书有效,生成随机数3,使用数字证书的公钥加密随机数3,发给服务器

Step 5:服务器使用私钥解密出随机数3(Premaster secret)

Step 6:客户端和服务器根据约定的加密方法,使用随机数1(Client random)、随机数2(Pre-mastersecret)、随机数3(Pre-mastersecret),经过特定算法生成对话密钥(session key),用来加密接下来的对话过程

Step 7:客户端和服务器都会第一次使用会话密钥加密一个消息发送给对方

简单一点说,HTTPS就是在在HTTP和TCP之间,多了一层TLS/SSL层,在TCP三次握手之后,TLS再和服务器交换加密信息,得到加密密钥

(PS:握草,在浏览器F12 network只看到一条HTTPS请求,底层程序已经干了这么多事情)。

4. HTTP2.0

这里参考深入理解http2.0协议,看这篇就够了! - 知乎 (zhihu.com)整理。

4.1 二进制分帧

        HTTP2.0更牛逼一些,在原来HTTP基础,对HTTP报文进行分帧,即新增了Binary Framing层(PS:不是四层协议么?怎么又多了TLS层、多了BinaryFraming层?笔者:别再提层不层的,科学家们都是为了技术的传播和理解呐)。

4.2 多路复用(Multiplexing)/连接共享

        在http1.1中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量的限制,超过限制数目的请求会被阻塞。这也是为何一些站点会有多个静态资源 CDN 域名的原因之一。

         而http2.0中的多路复用优化了这一性能。多路复用允许同时通过单一的http/2 连接发起多重的请求-响应消息。有了新的分帧机制后,http/2 不再依赖多个TCP连接去实现多流并行了。每个数据流都拆分成很多互不依赖的帧,而这些帧可以交错(乱序发送),还可以分优先级,最后再在另一端把它们重新组合起来。

4.3 头部压缩

        http1.x的头带有大量信息,而且每次都要重复发送。http/2使用encoder来减少需要传输的header大小,通讯双方各自缓存一份头部字段表,既避免了重复header的传输,又减小了需要传输的大小。

        对于相同的数据,不再通过每次请求和响应发送,通信期间几乎不会改变通用键-值对(用户代理、可接受的媒体类型,等等)只需发送一次。

4.4 请求优先级

        把http消息分为很多独立帧之后,就可以通过优化这些帧的交错和传输顺序进一步优化性能。每个流都可以带有一个31比特的优先值:0 表示最高优先级;2的31次方-1 表示最低优先级。

        服务器可以根据流的优先级,控制资源分配(CPU、内存、带宽),而在响应数据准备好之后,优先将最高优先级的帧发送给客户端。高优先级的流都应该优先发送,但又不会绝对的。绝对地准守,可能又会引入首队阻塞的问题:高优先级的请求慢导致阻塞其他资源交付。

4.5 服务器推送

        服务器可以对一个客户端请求发送多个响应,服务器向客户端推送资源无需客户端明确地请求。并且,服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。

5. 总结

        知识点真的很多很多,如果不是长时间从事或使用相关技术的人员,真心记不住,有个大概印象就好。

注:本篇仅为学习笔记,如有不合理之处,还请帮忙指出,大家一起交流学习~

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

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

相关文章

Unity3D和three.js的比较

一、Unity3D和three.js简介 Unity3D是一款跨平台的游戏引擎,可以用于开发2D和3D游戏。它提供了一个可视化的开发环境,包含了强大的编辑器和工具,使开发者可以方便地创建游戏场景、添加物体、设置物理效果、编写脚本等。Unity3D支持多种平台,包括PC、移动设备、主机等,可以…

新版AndroidStudio配置maven阿里云镜像

project下的build.gradle: // Top-level build file where you can add configuration options common to all sub-projects/modules. // 注意jdk版本需要17以上,因为8.1.3的gradle需要jdk17以上 //plugins { // id com.android.application version…

解析exe文件

概述:上次用java生成exe文件。那如何解析exe文件呢?0.0 首先我们要了解exe文件里面有什么。用360压缩解压一下。 .data: 存储程序中的初始化的全局和静态变量。在程序运行之前,这些变量会被赋予特定的初始值。 .pdata (Procedu…

销售方法用得好,业绩蹭蹭蹭!

新零售模式是随着科技的发展而崭露头角的零售业态,它融合了传统零售与先进技术,为消费者带来了更便捷、智能的购物体验。 其中,自动售货机作为新零售的一种代表形式,通过高度自动化和数字化的手段,为消费者提供更加便利…

【RT-DETR有效改进】移动设备网络ShuffleNetV1(超轻量化网络主干)

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

计算机网络-计算机网络的概念 功能 发展阶段 组成 分类

文章目录 计算机网络的概念 功能 发展阶段总览计算机网络的概念计算机网络的功能计算机网络的发展计算机网络的发展-第一阶段计算机网络的发展-第二阶段-第三阶段计算机网络的发展-第三阶段-多层次ISP结构 小结 计算机网络的组成与分类计算机网络的组成计算机网络的分类小结 计…

【史上最全】前端页面深入浅出浏览器渲染原理

前言 浏览器的核心组件,即通常所说的浏览器内核,是支撑整个浏览器运行的关键性底层软件架构,它由两个关键组成部分构成:一个是负责网页内容解析和渲染的渲染引擎,另一个则是用于执行JavaScript代码的JS引擎。各浏览器厂…

双向搜索的理解和板子

"互相奔赴,各司其职。“ ——双向搜索 双搜的要求: 当我们发现,要从一种状态开始,经过很多次操作,来得到一种给定的状态。 这时候,我们就可以考虑用双向搜索。 从起点和终点开始搜。当二者相遇&…

【React】组件性能优化、高阶组件

文章目录 React性能优化SCUReact更新机制keys的优化render函数被调用shouldComponentUpdatePureComponentshallowEqual方法高阶组件memo 获取DOM方式refs如何使用refref的类型 受控和非受控组件认识受控组件非受控组件 React的高阶组件认识高阶函数高阶组件的定义应用一 – pro…

如何用Python进行数据分析(保姆级教程)

有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂。 很多网上的资料都是从语法教起的,花了很多时间还是云里雾里,摸不清方向。今天就给大家来捋一捋思路!帮助大家提高学习效率! Pyt…

mysql 自动生成随机数

在MySQL中,生成随机数可以使用RAND()函数。以下是一些基本用法: 1. **生成0到1之间的随机浮点数**: sql SELECT RAND(); 2. **生成指定范围内的随机整数**(例如,生成1到100之间的随机整数)&…

QT网络通信-TCP、UDP通信

时间记录:2024/1/17 pro文件添加模块network 一、TCP服务端 (1)创建TCP服务器对象QTcpServer (2)为QTcpServer对象的newConnection信号绑定槽,用来监听TCP客户端的新连接,有新的客户端连接便会…

ArrayList 可以添加 null 值吗?

如果你现在需要准备面试,可以关注我的公众号:”Tom聊架构“,回复暗号:”578“,领取一份我整理的50W字面试宝典,可以帮助你提高80%的面试通过率,价值很高!! ArrayList 中可…

Markdown 类图绘制详解

✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向) 🐳博客主页: 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN 🔔如果文章对您有一定的帮助请&#x1f…

水电站智能监测泄洪预警系统介绍

一、背景 近年来由于危险河道管理措施不到位,调峰电站泄水风险长期存在,信息通报制度缺失以及民众安全警觉性不高等因素导致的水电站在泄洪时冲走下游河道游客以及人民财产的事故频发。 二、系统介绍 水电站智能监测泄洪预警系统是一种集成了物联网、云…

Java SE入门及基础(20)

目录 类和对象 1. 类的由来 2. 如何定义类 语法 示例 3. 类图 4. 类和对象的关系 解释说明 语法 示例 示例 结论 Java SE文章参考:Java SE入门及基础知识合集-CSDN博客 类和对象 1. 类的由来 人们在日常生活中,经常会将具有相同特征或者相同行为的事…

ElasticSearch的常用增删改查DSL和代码

es增删改查常用语法 我们日常开发中,操作数据库写sql倒是不可能忘记,但是操作es的dsl语句有时候很容易忘记,特地记录一下方便查找。 DSL语句 1、创建索引 -- 创建索引 PUT /my_index {"mappings": {"properties": {&…

AWS Cognito 实战指南

Amazon Cognito 是 AWS 提供的一项身份验证和访问控制服务,适用于构建安全的用户身份验证和访问控制功能。本指南将介绍如何使用 AWS Cognito 创建用户池和身份池,并在 Java 、 Python 和JavaScript应用程序中实现用户注册和登录功能。 步骤 1: 创建用户池 登录 AWS 控制台。…

GEE中Landsat、Sentinel、Modis主要数据集区别

一、Landsat 1. Collection 1/2 的区别 Collection 2 是Landsat Level 1 数据的又一次重大再处理,显著提高了绝对地理定位精度。 Collection1Collection2时间跨度1972~2021底1972~至今数据等级level 1level1:1972~2021底 level2:1982~至今 …

docker 安装mysql 并支持远程访问

docker mysql 安装 拉取镜像 docker pull mysql运行 mysql 容器 docker run --name mysql-container -e MYSQL_ROOT_PASSWORDmy-secret-pw -p 3306:3306 -d mysql:tag这里 mysql-container 是您给容器指定的名字,my-secret-pw 应替换为您希望设定的密码。tag 是镜…