HTTP与HTTPS详解

news2024/10/1 19:30:05

一、HTTP的概念

HTTP是超文本传输协议,是一种应用层协议,是基于为浏览器/服务器间提供统一的信息交换格式而出现的,其发展历程为HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3。

在这里插入图片描述

在HTTP/3之前,HTTP都是基于TCP传输的。

二、HTTP报文格式

作为一种应用层协议,其规定的信息交换格式如下:

1. 请求报文

请求报文为主动发送一个http请求的报文,格式说明:

  • 请求行(request line):包括请求方法,资源的URL,以及HTTP协议版本。
  • 请求头(header):包括请求服务器所需要的附加信息。
  • 空行(CRLF):请求头部后面必须是空行,即使请求数据为空,也要有空行。
  • 请求数据(body):也称为请求体,可以添加任意类型的数据,通过请求头中的Content-Length字段确定请求数据的长度。
    在这里插入图片描述

(1)GET请求报文

根据RFC规范,GET 的语义是从服务器获取指定的资源。GET请求一般不携带请求体,如果有请求参数则放在URL后面,一个GET请求报文的样例如下:

GET /video1?p=2 HTTP/1.1  # 请求行:GET请求方式 请求资源路径 HTTP协议版本
Host: www.bilibili.com  # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Upgrade-Insecure-Requests: 1 # 让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36  # 用户代理,也就是客户端的名称
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 可接受的数据类型
Accept-Encoding: gzip, deflate # 可接受的压缩格式
Accept-Language: zh-CN,zh;q=0.9 #可接受的语言
Cookie: pgv_pvi=1246921728; # 登录用户的身份标识
---- 空行 ----

(2)POST请求报文

根据 RFC 规范,POST 的语义是根据请求体(报文body)对指定的资源请求做出处理。一般提交表单时就会使用POST请求,例如登录,一个POST请求报文的样例如下:

POST /login HTTP/1.1 # 请求行:POST请求方式 请求资源路径 HTTP协议版本
Host: www.bilibili.com # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Content-Type: application/json;charset=utf-8  # 请求体的数据类型
Content-Length:32 # 请求体的数据长度
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 客户端的名称
---- 空行 ----
{username:hello,pass:123456} # 请求体

2. 响应报文

响应报文为响应一个http请求的报文,格式说明:

  • 状态行(status line): 包括HTTP协议版本,状态码和状态消息
  • 消息报头(header): 包括返回客户端的一些附加信息
  • 空行(CRLF): 必须有空行
  • 响应正文(body): 服务器返回给客户端的数据,可以是任意类型的数据
    在这里插入图片描述
    响应报文样例:
    在这里插入图片描述

HTTP常见响应状态码

在这里插入图片描述

参考:http协议详解 HTTP 请求报文

三、HTTP 与 HTTPS的区别

  • HTTP是明文传输,HTTPS比HTTP多一层SSL/TLS 安全协议,在TCP的三次握手之后,还需进行TLS握手,握手成功后通过秘钥对整个HTTP报文通过对称加密进行密文传输通信。
  • HTTP 默认端口号是 80,HTTPS 默认端口号是 443。

SSL/TLS 协议基本流程

  • 客户端向服务器索要并验证服务器的公钥。
  • 双方协商生产「会话秘钥」。
  • 双方采用「会话秘钥」进行加密通信。

前两步就是 TLS 握手阶段,握手过程中的密钥交换算法有两种:RSA 算法 和 ECDHE 算法。

1. 基于RSA的TLS握手机制

(1)第一次握手:客户端首先会发一个「Client Hello」消息,其中包括客户端使用的 TLS 版本号、支持的密码套件列表、以及生成的第一个随机数(Client Random)。

(2)第二次握手:当服务端收到客户端的「Client Hello」消息后,会确认 TLS 版本号是否支持,和从密码套件列表中选择一个密码套件,以及生成第二个随机数(Server Random)。接着返回「Server Hello」消息,其中包括确认 的TLS 版本号、选择的密码套件、Server Random。然后,服务端为了证明自己的身份,会发送「Server Certificate」给客户端,这个消息里含有数字证书。随后,服务端发了「Server Hello Done」消息,目的是告诉客户端,我已经把该给你的东西都给你了,第二次握手完毕。

密码套件基本的形式是「密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法」

(3)第三次握手:客户端首先对证书进行验证,认为可信则继续往下走。接着客户端就会生成第三个随机数 (pre-master),用服务器公钥加密后传给服务端。然后客户端用这三个随机数生成一个会话秘钥,用于后续通信的对称加密。生成完「会话密钥」后,然后客户端发一个「Change Cipher Spec」,告诉服务端开始使用加密方式发送消息。然后,客户端再发一个「Encrypted Handshake Message(Finished)」消息,把之前所有发送的数据做个摘要,再用会话密钥(master secret)加密一下,让服务器做个验证,验证加密通信「是否可用」和「之前握手信息是否有被中途篡改过」。

数字证书的签发与验证:
在这里插入图片描述

(4)第四次握手:服务端收到加密后的第三个随机数 (pre-master)后,用服务端私钥进行解密,然后进行与客户端同样的操作:用这三个随机数生成同样的会话秘钥、发送「Change Cipher Spec」、发送会话秘钥加密后的摘要信息「Encrypted Handshake Message(Finished)」。之后客户端和服务端就可以开始用会话秘钥加密通信了。

2. 基于ECDHE的TLS握手机制

使用 RSA 密钥协商算法的最大问题是不支持前向保密。

因为客户端传递随机数(用于生成对称加密密钥的条件之一)给服务端时使用的是公钥加密的,服务端收到后,会用私钥解密得到随机数。所以一旦服务端的私钥泄漏了,过去被第三方截获的所有 TLS 通讯密文都会被破解。

为了解决这个问题,后面就出现了 ECDHE 密钥协商算法,我们现在大多数网站使用的正是 ECDHE 密钥协商算法。

参考:

  1. https://xiaolincoding.com/network/
  2. https到底把什么加密了?

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

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

相关文章

设计模式之状态模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、状态模式是什么? 状态模式是一种行为型的软件设计模式,当一个对象的内在状态改变时,其行为…

C++ Linux Web Server 面试基础篇-操作系统(二)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏定期更新Qt的一些项目Demo 项目与…

ClickHouse分区表的正面与侧面

当我们处理连续数据并需要基于移动窗口(如,仅使用过去三个月数据)计算时使用分区功能非常有用,因为分区无需删除数据,就能高效避过不使用的(或过期)数据。本文介绍分区表原理,对比查…

一文读懂|数字化到底是什么?

现在大家都在说数字化,数字化到底是什么? 翻阅很多关于数字化的文章,大部分都在混淆术语,部分文章已经开始将数字化标记为数字化转型,以安抚管理层、获得项目批准或进行销售...... 所以这篇内容,我会尽可…

第十四章 动手,高级写法应用让SQL飞

参考《收获,不止SQL优化》作者: 梁敬彬 / 梁敬弘 所谓高级SQL,就是内部被优化过的SQL,可以用简单的语法实现复杂的功能,同时性能上还有提升。比如INSERT ALL、WITH子句、MERGE…… 一、 高级写法思维导图(自己整理&am…

java连接webservice

前言 WebService 也叫XML Web Service,WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。 一、…

什么是 IT 基础架构管理

各行各业的企业组织不断面临创新和扩展的压力。就在十多年前,一个企业组织可以争取时间,在投资新技术方面保持保守,同时仍然保持竞争优势。快进到今天,随着业务实践的变化和新技术的不断涌现,商业和技术格局更加动态。…

【C++】文件IO流及stringstream流的使用

文章目录 一、引入二、自定义类型隐式类型转换三、sync_with_stdio同步四、文件IO流4.1 open和close文件4.2 写入文件与读出文件 五、stringstream流的使用5.1 将数值类型数据格式化为字符串5.2 序列化和反序列化 一、引入 int main() {string str;while (cin >> str){c…

适合零基础小白,循序渐进学习--文件操作--相关函数

目录 一. 前言 二. 正文 2. 1什么是文件 (1)程序文件 (2)数据文件 2.2文件名 2.3文件类型 2.4 文件缓冲区 2.5 文件指针 2.7 文件操作函数 (1) fopen()--- 打开文件 (2) fclose()--- 关闭文件 2.7 文件的顺序读写&…

ArcGIS制图技巧

目录 1、经纬度网置于底层 2、设置经纬网刻度为英文 3、设置左右经纬度为垂直,不显示分秒,以及改变字体等 4、拖动制图中的图层 5、设置经纬度网为曲线 6、根据经纬度导入样本点 1、经纬度网置于底层 最初我们的网格是下图这个样子: 然…

智慧化工业企业能耗管理系统平台的构建

节能监测技术是节能减排、有效节能的重要支撑技术,当前能源资源日渐枯竭的紧张形势下,节能意识的增强以及各行业对节能技术的需求不断增加,使得节能技术的开发越来越受到人们的重视。工业企业能耗监测系统的构建是按照“统一规划、分期分批”…

头像展示样式

先上效果图 再上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>body {align-items: center;background-color: #f2f2f2;display: flex;font-fa…

代码随想录算法训练营第三十天| 332.重新安排行程、回溯总结

文章目录 332.重新安排行程:star:回溯总结:star:1.组合问题2.切割问题3.子集问题4.排列问题5.棋盘问题(未完待续)6.复杂度分析 332.重新安排行程⭐️ 链接:代码随想录 本题是一道困难题&#xff0c;其实困难点也就在容器的选择和使用上 结果集采用数组存取即可操作集要用一个m…

算法篇——栈与队列大集合(js版)

232.用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int…

SpringBoot集成Redis及问题解决

SpringBoot集成Redis 此篇文章为SpringBoot集成Redis的简单介绍&#xff0c;依赖、序列化操作、工具类都可以在后面的实操中直接搬运使用或者在此基础上进行改进使用 1、集成Redis 1.1、新建SpringBoot项目 新建项目这边就不一一介绍了&#xff0c;大家如果还有不会的可以自行…

【LeetCode】144.二叉树的前序遍历

1.问题 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1]…

七大排序的时间复杂度和空间复杂度

文章目录 七大排序的分类时间复杂度空间复杂度稳定性直接插入排序希尔排序选择排序堆排序冒泡排序快速排序归并排序总结 七大排序的分类 时间复杂度 时间复杂度是指一个程序中基本语句被执行的次数,一般认为是最坏情况。 空间复杂度 空间复杂度是指在一个程序执行时要额外开…

美团DAT:A Dual Augmented Two-tower Model for Online Large-scale Recommendation

A Dual Augmented Two-tower Model for Online Large-scale Recommendation 美团的对偶增强双塔为了user塔和item塔操碎了心&#xff0c;众所周知&#xff0c;双塔的一个大毛病就是item和user的交叉太晚&#xff0c;重要的信息经过层层神经网络的抽象提取&#xff0c;有些重要…

15、异常处理

文章目录 1、错误处理1、默认规则2、定制错误处理逻辑3、异常处理自动配置原理4、异常处理步骤流程 【尚硅谷】SpringBoot2零基础入门教程-讲师&#xff1a;雷丰阳 笔记 路还在继续&#xff0c;梦还在期许 1、错误处理 1、默认规则 默认情况下&#xff0c;Spring Boot提供/er…

傻傻的分不清 Comparator 和 Comparable 接口? 两分钟弄懂~

目录 一、Comparable 接口 二、Comparator 接口 一、Comparable 接口 Comparable 是一个排序接口&#xff08;意味着该支持排序&#xff09;&#xff0c;可以看作内比较器&#xff0c;也就是说可以和自己比较&#xff0c;通常用来自己属性与自己属性进行比较&#xff0c;最后通…