首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HTTP初始(二)——HTTP家族(HTTPS)

HTTP初始(二)——HTTP家族(HTTPS)

作者头像
东边的大西瓜
发布于 2022-05-05 03:27:13
发布于 2022-05-05 03:27:13
72001
代码可运行
举报
文章被收录于专栏:吃着西瓜学Java吃着西瓜学Java
运行总次数:1
代码可运行

Http家族

正文部分的MIME类型

在讲解各个版本的HTTP的异同前我们先来介绍以下MIME,全称为“Multipurpose Internet Mail Extensions”,中文名为“多用途网络邮件拓展协议”。从MIME的中文名称我们就不难得出,它最初的设计目的就是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。它使得HTTP传输的不仅可以是普通的HTML文本,还可有包含很多媒体类型,如image、video、application等。

我们知道HTTP/9.0后的请求和响应的正文部分是可以任意的数据格式,所以只有统一格式才能确保接收方能看得懂发送方的正文数据。而HTTP采用MIME协议来规范正文的数据格式,具体体现是在HTTP请求头和响应头中有一个Content-type项,用来指定请求正文和响应正文中MIME类型。每个MIME类型由两部分组成,前面是数据的大类别,后面是具体的子类别(文件拓展名)。如image/gif。

常见的文件拓展名于MIME类型的对应关系

文件拓展名

MIME类型

未知的数据类型或不可识别的拓展名

content/unknown

.bin、.exe、.o、.a、.z

application/octet-stream

.pdf

application/pdf

.zip

application/zip

.gif

image/gif

.jpg、.jpeg

image/jpeg

.htm、.html

text/html

HTTP/0.9

1991年发布的HTTP/0.9是第一个HTTP版本,同时也是最简单的HTTP。HTTP请求中不包括HTTP的版本号和头部信息,仅有一个GET方法,HTTP响应结果也只包含HTTP文档。该版本已过时。

HTTP/1.0

HTPP/1.0于1996年发布,它在HTTP/0.9的基础上做出了很大改进。

相比于HTTP/0.9的改动:

  • 格式上:HTTP/1.0中请求和响应都增加了版本号和头部信息。
  • 内容上:采用MIME协议,可以传输照片、视频等。响应结果中包含状态码(status code)、限权(authorization)、缓存(cache)和内容编码(content encoding)等信息。
  • 方法上不仅支持GET,还支持POST等。

HTTP/1.0的特点和缺点:

  1. 无连接:指服务器处理完客户的请求,并收到客户的应答后,就断开连接。也就是说每次HTTP请求都要建立一个新的TCP,而频繁的建立客户端与服务器端的TCP连接很耗资源,会降低服务器端的响应速度。
  2. 队列阻塞:在HTTP/1.0中,同一个TCP连接只能处理一个HTTP请求,只有前一个请求的响应收到了才能发送下一个HTTP请求,一旦收到响应非常慢,那么后面的请求只能等待,这就导致了队列阻塞。所以,HTTP1.0的队列阻塞发生在客户端。

HTTP/1.1

看名字就可以知道,HTTP1.1是为了克服HTTP1.0的缺点出现的升级版。它不仅继承了HTTP1.0简单的特点,还克服了诸多HTTP1.0性能上的问题。

HTTP/1.1的特点和缺点:

  1. 持久TCP连接(长连接):HTPP/1.1建立TCP连接后,允许处理多个有序的HTTP请求。在HTTP/1.1请求头中,以下选项用来设定持久TCP连接的参数:Connection: Keep-Alive Keep-Alive: max=5, timeout=120 Keep-Alive/Close表示保持连接或者断开连接,max表示允许处理的最大http请求数目,timeout表示TCP连接的最长闲置时间
  2. 管道机制:HTTP/1.1引入了管道机制,即不需要等待上一个请求的响应结果到来就可以发送下一个请求。基于管道机制,在一个TCP连接中,客户端可以连续发送几个请求,服务端按照接受请求的先后顺序,依次把响应返回给客户端。这样就解决了HTTP/1.0中的请求任务队列阻塞问题。
  3. 队列阻塞:尽管HTTP1.1支持持久TCP连接,并引入了管道机制,但是HTTP/1.1的处理机制的核心还是按照请求的先后顺序来处理HTTP请求的,并依次返回相应内容。所以只有前一个HTTP相应生成完毕,才能生成下一个响应。如果生成前一个响应非常慢,那么后面的响应任务只能等待,这样会导致响应任务队列阻塞。所以,HTTP/1.1的队列阻塞发生在服务器端。

HTTP/2.0

HTTP/2.0的显著特点是低延时传输。

相比于HTTP/1.1其特点和改进主要有:

  1. 二进制协议:在HTTP/1.1中请求和响应的头部信息是文本,正文信息既可以是文本,也可以是二进制数据。HTTP/2.0则是一个彻底的二进制协议,头部和正文信息都是二进制数据;HTTP/2.0将数据分成一个一个的帧,头部帧存储元数据(即头部信息),数据帧存放正文数据。
  2. 多路复用 在HTTP/2.0中,同一个TCP连接,可以并发传输多个响应的结果二进制数据流。这样就解决了HTTP/1.1中的响应任务队列堵塞问题。
  3. 头部压缩 我们这里先过一遍压缩的概念:1.通信双方各拥有一本字典,记录着某些字符所对应得文本内容,例如d代表着东边的,x代表着大西瓜;2.消息发送方根据字典生成消息“dx"; 3.消息接受方,接收到消息后根据字典还原内容:“东边的大西瓜”。我们在第一篇提到过,HTTP协议具有无状态特点,所以每次请求都要带上所有信息。当同一个客户端重复访问服务器时,会有很多重复的数据,比如User Agent和Cookie,这样会增加带宽的用以及延迟。为了解决这个问题,HTTP/2.0中专门为头部压缩设计了一套压缩算法——HPACK。 官方文档里的对Hpack的主要思想说明,RFC 7541协议:
    • 将header里的字段列表视为可包括重复对的name-value键值对的有序集合,分别使用8位字节表示name和value
    • 当字段被编码/解码时,对应的字典会不断扩充
    • 在编码形式中,header字段可以直接表示,也可以使用header field tables 中对应的引用。因此,可以使用引用和文字值的混合来header字段列表。
    • 文字值要么直接编码,要么使用静态huffman代码
    • 编码器负责决定在标题字段表中插入哪些标题字段作为新条目。解码器执行对编码器规定的报头字段表的修改,重建处理中的报头字段列表

总结:头部信息以霍夫曼编码对文本值进行编码,所有的头部信息都被放在一张头部信息表里面,由客户端和服务器端共同维护,随后的请求中省略所有重复的信息,仅使用一个索引号,服务端根据索引号从头部信息表中检索响应的信息。

  1. 推送 这是一个很厉害的功能,它使得在HTTP/2.0中,服务端可以主动地向客户端推送消息,甚至不需要客户端去发送请求。

HTTPS

我们在HTTP初识(一)中提到过“https就是在http的基础上加入了SSL”,现在我们就来聊一聊这具体是怎么一回事。HTTPS其实相比于HTTP而言没什么新花样,只是将默认端口更改为443,去掉明文传输。

图来!

从图上我们可以很直观的得出,其实HTTPS就是在HTTP下面加入了SSL,让HTTP运行在SSL上。而SSL依靠证书来验证服务器的身份,并对浏览器和服务器之间的通信进行数据加密,以保证数据传输的安全性,其主要流程如下:

参考自《Offer来了》

  1. 发起请求:客户端在通过TCP和服务器建立连接之后(默认使用44端口),发出一个请求证书的消息给服务器,在该请求消息里包含自己可实现的算法列表和其他需要的消息。
  2. 证书返回:服务器端在收到消息后回应客户端并返回证书,在证书中包含服务器信息、域名、申请证书的公司、公钥、数据加密算法等。
  3. 证书验证:客户端在收到证书后,判断证书签发机构是否正确,并使用该签发机构的公钥确认签名是否有效,客户端还会确保在证书中列出的域名为正在连接的域名、如果客户端确认证书有效,则生成对称密钥,并使用公钥将对称密钥加密。
  4. 密钥交换:客户端将加密后的对称密钥发送给服务器,服务器在收到对称密钥后使用私钥解密。
  5. 数据传输:经过上述步骤,客户端和服务器就完成了密钥对的交换,在之后的数据传输过程中,客户端和服务器端就可以基于对称加密(加密和解密使用相同的加密算法)将数据加密后在网络上传输,保证了网络数据传输的安全性。

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吃着西瓜学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MyBatis-多表查询(一对一)
因为一个学生信息只能在一个班级里,所以从查询学生信息出发关联查询班级信息为一对一查询。
星哥玩云
2022/09/14
3780
MyBatis-多表查询(一对一)
MyBatis注解(多表)
@Result(column=" “,property=”",one=@One(select=""))
星哥玩云
2022/09/14
5870
MyBatis-多表查询(多对多)
老师信息与学生信息为多对多的关系,一个学生有多个老师,一个老师同样可以有多个学生。要想知道老师下的学生信息,不能直接查到我们的学生信息,只能通过中间表(tors)才能关联到学生信息。
星哥玩云
2022/09/14
1.6K0
MyBatis-多表查询(多对多)
MyBatis-延迟加载
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。
星哥玩云
2022/09/14
1.2K0
MyBatis 多表操作
  关系数据库中第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。
Demo_Null
2020/09/28
3710
MyBatis 多表操作
MyBatis注解(单表)
1、MyBatis注解开发前的准备 1.1、MyBatis常用注解 @Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询 @Result:实现结果集封装 @Results:可以与@Result 一起使用,封装多个结果集 @ResultMap:实现引用@Results 定义的封装 @One:实现一对一结果集封装 @Many:实现一对多结果集封装 @SelectProvider: 实现动态SQL映射 @CacheNamespace:实现注解二级缓存的使
星哥玩云
2022/09/14
2970
MyBatis_resultMap 的关联方式实现多表查询(多对一)
项目结构 1.实体类 2.Mapper层 3.service层 4.工具层 5.测试层 项目截图 1、实体类 创建班级类(Clazz)和学生类(Student),添加相应的方法。
时间静止不是简史
2020/07/26
1.4K0
Spring入门
Spring 是一个主流的 Java Web 开发框架,该框架是一个轻量级的应用框架,具有很高的凝聚力和吸引力。Spring 以 IoC(Inverse of Control,控制反转)和 AOP(Aspect Oriented Programming,面向切面编程)为内核。
星哥玩云
2022/09/14
8110
Spring入门
Mybatis 注解
  我们可以看到,明明结果已经查询出来了,为什么打印出来却是空的。这个是因为属性名和列名不一致造成的,类似于我们这种 sId ☞ s_id 可以打开驼峰之自动转换。如果二者之间没有任何联系就需要使用 @Results 一一映射。
Demo_Null
2020/09/28
3640
Mybatis 注解
java进阶|Mybatis系列文章(三)表关联查询操作
整个项目所需要的xml文件进行数据的增删改查操作ClassesMapper.xml文件
码农王同学
2020/04/27
8540
【愚公系列】2023年03月 Java教学课程 118-Mybatis(多表操作)
多表模型是一种关系型数据库设计模式,它使用多个表格来存储和管理数据。在多表模型中,每个表格都包含一组相关的数据,并使用外键等关系来与其他表格建立连接。这种模型通常用于处理复杂的数据结构,例如具有多个关系的实体或需要动态添加或删除属性的实体。
愚公搬代码
2023/04/04
6950
【愚公系列】2023年03月 Java教学课程 118-Mybatis(多表操作)
MyBatis多表查询详解
MyBatis多表查询 0. 分析 一对一 一个用户只能拥有一个一个账户 sql语句: select u.*,a.id as aid,a.uid,a.money from account a,user u where a.uid =u.id; 一对多 一个用户可以拥有多个账户 sql语句 select u.*,a.id as aid ,a.uid,a.money from user u left outer join account a on u.id =a.uid 多对多
不愿意做鱼的小鲸鱼
2022/09/24
1K0
MyBatis多表查询详解
_Mybatis关联查询【附实战案例】
会洗碗的CV工程师
2023/11/20
2210
_Mybatis关联查询【附实战案例】
Mybatis分解式查询
一、Mybatis一对多分解式查询 分解式查询就是将一条Sql语句拆分成多条 在MyBatis多表查询中,使用连接查询时一个Sql语句就可以查询出所有的数据。如: # 查询班级时关联查询出学生 select *    from classes    left join student    on student.classId = classes.cid 也可以使用分解式查询,即将一个连接Sql语句分解为多条Sql语句,如: # 查询班级时关联查询出学生 select * from
会洗碗的CV工程师
2023/04/12
4180
Mybatis分解式查询
MyBatis一对多,多对一(图文并茂)
链接:https://pan.baidu.com/s/1FX4TmyKqZQx39ncn8TItfw 密码:1h1i
CBeann
2023/12/25
2950
MyBatis一对多,多对一(图文并茂)
MyBatis多表查询
MyBatis的多表查询只需要DAO接口和sql语句即可,主要的是mapper里的返回字段要正确
用户3112896
2019/09/26
8540
Mybatis 实战:一对多关系
公司有若干名员工,此时,该公司与其员工之间的关系就属于一对多的关系。根据以上信息,我们可以创建公司信息与员工信息两张表。其中,公司表沿用上一个例子中的表。根据公司编号(ID)查询公司信息及其员工信息。
耕耘实录
2021/12/07
4020
_MyBatis注解开发---实现自定义映射关系和关联查询
会洗碗的CV工程师
2023/11/21
3720
_MyBatis注解开发---实现自定义映射关系和关联查询
MyBatis 详解(一对一,一对多,多对多)
1、什么是MyBatis?   MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,
IT可乐
2018/01/04
5.6K0
MyBatis 详解(一对一,一对多,多对多)
Mybatis【关联映射】
Mybatis【多表连接】 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联起来的…那么在我们Mybatis中又怎么做呢??? 先来回顾一下我们SQL99的语法: 一)内连接(等值连接):查询客户姓名,订单编号,订单价格 --------------------------------------------------- select c.name,o.isbn,o.price fr
Java3y
2018/03/15
9990
Mybatis【关联映射】
相关推荐
MyBatis-多表查询(一对一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档