Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HTTP初始(二)——HTTP家族(HTTPS)

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

作者头像
东边的大西瓜
发布于 2022-05-05 03:27:13
发布于 2022-05-05 03:27:13
7200
举报
文章被收录于专栏:吃着西瓜学Java吃着西瓜学Java

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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android技能树 — 网络小结(3)之HTTP/HTTPS
介于自己的网络方面知识烂的一塌糊涂,所以准备写相关网络的文章,但是考虑全部写在一篇太长了,所以分开写,希望大家能仔细看,最好可以指出我的错误,让我也能纠正。
青蛙要fly
2018/08/29
7710
Android技能树 — 网络小结(3)之HTTP/HTTPS
HTTP2和HTTPS来不来了解一下?
试想一下:请求一张图片,新开一个连接,请求一个CSS文件,新开一个连接,请求一个JS文件,新开一个连接。HTTP协议是基于TCP的,TCP每次都要经过三次握手,四次挥手,慢启动…这都需要去消耗我们非常多的资源的!
Java3y
2018/08/08
8010
HTTP2和HTTPS来不来了解一下?
【大厂面试】腾讯面试,你真的懂HTTP吗?
大彬:嗯,HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。协议实际上就是双方约定好的格式,确保双方都能理解这种格式。
程序员大彬
2022/02/15
4090
【HTTP】267- HTTP 的15个常见知识点复习
前言 自从入职新公司到现在,我们前端团队内部一直在做 ?每周一练 的知识复习计划,我之前整理了一个 [每周一练 之 数据结构与算法] (https://juejin.im/post/5ce2a20e6
pingan8787
2019/07/25
5810
【HTTP】267- HTTP 的15个常见知识点复习
HTTP、HTTPS协议详解
POST: 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件,数据被包含在请求报文的主体中
_咯噔_
2022/03/14
1.4K0
【面经】 HTTP 基础知识
大家好,我是图图。也有一个多月没有写文章了。由于各种原因,被迫提桶,真是艰难。经过几轮的面试之后,被面试官虐得惨惨的,其中许多原因是没有仔细的学过 HTTP 的知识,我对这块的知识相对来说比较薄弱,所以决定把数据结构和算法得先放一放了。所以把 HTTP 的知识学一遍,然后再补一下JS的基础。
后端码匠
2021/05/10
7450
【面经】 HTTP 基础知识
前端应该知道的 HTTP 知识
HTTP 是由蒂姆·伯纳斯-李(TimBerners—Lee)于1989年在欧洲核子研究组织(CERN)所发起
GopalFeng
2020/09/24
6220
前端应该知道的 HTTP 知识
HTTP和HTTPS
最近学习了一下HTTP和HTTPS相关的知识,由于内容比较多,这里总结了一下自己经常错的地方
全栈开发Dream
2021/05/30
6480
HTTP和HTTPS
二、《图解HTTP》- HTTP协议历史发展(重点)
这一章节基本上大部分为个人扩展,因为书中的内容讲的实在是比较浅。本文内容非常长,另外哪怕这么长也只是讲到了HTTP协议的一部分而已,HTTP协议本身十分复杂。
阿东
2022/08/12
7130
二、《图解HTTP》- HTTP协议历史发展(重点)
http协议
当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次分手”。
愤怒的小鸟
2021/01/06
7640
HTTP应知应会知识点复习手册(上)
上篇主要内容: 状态码、Http1.0/1.1/2.0、Https、GET和POST
蛮三刀酱
2019/03/26
5470
HTTP应知应会知识点复习手册(上)
终、《图解HTTP》读书笔记 - 汇总篇(总结)
又一本网络基础的书啃完了,这本书建议结合[[《网络是怎么样连接的》读书笔记 - 汇总篇]]这一篇读书笔记食用(当然也可以直接看原书)。
阿东
2022/12/06
7190
终、《图解HTTP》读书笔记 - 汇总篇(总结)
HTTP 请求全解
HTTP(Hyper Text Transfer Protocol)是一套计算机通过网络进行通信的规则。计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务。
码脑
2019/04/11
1.6K0
HTTP 请求全解
HTTP第二弹——HTTP前世今生大比较
Hello,小伙伴们,这两天有点忙,没有及时推送,那么闲话不多说,继续上次的HTTP话题,我们今天就从HTTP的前世今生入手,HTTP1.0?HTTP1.1?HTTP2.0?HTTPS?都有点啥子区别~~GET和POST又有啥区别呢?
萌兔IT
2019/07/25
4070
HTTP第二弹——HTTP前世今生大比较
为什么我们要熟悉这些通信协议?
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
Peter谭金杰
2019/08/02
1.1K0
HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事
作为一个经常和web打交道的程序员,了解这些协议是必须的,本文就向大家介绍一下这些协议的区别和基本概念,文中可能不局限于前端知识,还包括一些运维,协议方面的知识,希望能给读者带来一些收获,如有不对之处还请指出。 1、web始祖HTTP ---- 全称:超文本传输协议(HyperText Transfer Protocol) 伴随着计算机网络和浏览器的诞生,HTTP1.0也随之而来,处于计算机网络中的应用层,HTTP是建立在TCP协议之上,所以HTTP协议的瓶颈及其优化技巧都是基于TCP协议本身的特性,例如
前朝楚水
2018/04/03
2.7K0
HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事
https 加密、http2.0、keep-alive
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少
Krry
2018/10/10
1.1K0
https 加密、http2.0、keep-alive
「查缺补漏」巩固你的HTTP知识体系
这次梳理的篇幅主要是涉及网络部分,包括HTTP等,对巩固自己的网络知识体系也是很有帮助的,进一步的对性能优化而言也是帮助很大的。
童欧巴
2020/12/31
6500
【面试题】HTTP知识点整理(附答案)
HTTP/1 的几种优化可以弃用: 合并文件、内联资源、雪碧图、域名分片对于 HTTP/2 来说是不必要的,使用 h2 尽可能将资源细粒化,文件分解地尽可能散,不用担心请求数多
木子星兮
2020/07/17
1.5K0
【面试题】HTTP知识点整理(附答案)
Android 面试必备 - http 与 https 协议
在讲解 http 与 https 之间的区别之前,我么先来看一下一个常见的面试问题。
程序员徐公
2020/01/13
8600
Android 面试必备 - http 与 https 协议
相关推荐
Android技能树 — 网络小结(3)之HTTP/HTTPS
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档