该文章是我本身学习笔记及理解,但愿通篇读完能让你对HTTP和HTTPS有一个更全面的理解,若是错误地方烦请指正。文字较多,全篇预计阅读耗时20分钟。html
超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协做式和超媒体信息系统的应用层协议[1]。HTTP是万维网的数据通讯的基础。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。经过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。《维基百科》前端
从 1990 年开始HTTP就在 WWW 上普遍应用。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户 信息和内容的相似于MIME的消息结构。服务器以一个状态行做为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。程序员
HTTP刚出现是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器,随着WEB的持续发展,例如CSS、JS丰富了页面展现和基于HTTP协议的ajax增长了咱们向服务器获取数据的方式,HTTP也不断的进行优化迭代。web
版本 | 发布时间 | 主要内容 | 现状 |
---|---|---|---|
HTTP/0.9 | 1991 | 无状态、只支持GET请求、无协议头、只支持纯文本 | 已过期 |
HTTP/1.0 | 1996 | 有协议头、支持GET/POST/HEAD等方法、传输内容不限 | 仍被采用 |
HTTP/1.1 | 1999 | 默认持久链接、请求管道化、增长缓存处理、增长Host字段、支持断点传输、增长错误通知处理 | 目前最被普遍使用 |
HTTP/2 | 2015 | 新的二进制格式(帧)、多路复用、header压缩、请求优先级、服务端推送 | 将来的发展趋势 |
HTTP/3 | 2018.11 | 新的二进制格式(帧)、多路复用、header压缩、请求优先级、服务端推送 | 发展中 |
HTTP/2继承于Google的SPDY协议。HTTP/2: the Future of the Internet | Akamai这是Akamai公司用来讲明HTTP/2的优点所建立的demo。同时请求379张图片,HTTP/2速度占了绝对的优点。
ajax
HTTP 2.0 的全部帧都采用二进制编码算法
之因此速度能有如此优化,主要得益于HTTP2.0的多路复用技术。
有了新的分帧机制后,HTTP/2再也不依赖多个TCP 链接去处理更多并发的请求,每一个数据流都拆分红不少互不依赖的帧,而这些帧能够交错(乱序发送),还能够分优先级。最后再在另外一端根据每一个帧首部的流标识符把它们从新组合起来。从始至终,客户端与服务器之间只须要一个链接(同个域名下)便可。 segmentfault
HTTP 协议不带有状态,每次请求都必须附上全部信息。因此,请求的不少字段都是重复的,好比Cookie和User Agent,如出一辙的内容,每次请求都必须附带,这会浪费不少带宽,也影响速度。
HTTP/2 对这一点作了优化,引入了头信息压缩机制(header compression)。一方面,头信息使用gzip或compress压缩后再发送;另外一方面,客户端和服务器同时维护一张头信息表,全部字段都会存入这个表,生成一个索引号,之后就不发送一样字段了,只发送索引号,这样就提升速度了。浏览器
由于 HTTP/2 的数据包是不按顺序发送的,同一个链接里面连续的数据包,可能属于不一样的回应。所以,必需要对数据包作标记,指出它属于哪一个回应。
HTTP/2 将每一个请求或回应的全部数据包,称为一个数据流(stream)。每一个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪一个数据流。另外还规定,客户端发出的数据流,ID一概为奇数,服务器发出的,ID为偶数。
数据流发送到一半的时候,客户端和服务器均可以发送信号(RST_STREAM帧),取消这个数据流。1.1版取消数据流的惟一方法,就是关闭TCP链接。这就是说,HTTP/2 能够取消某一次请求,同时保证TCP链接还打开着,能够被其余请求使用。
客户端还能够指定数据流的优先级。优先级越高,服务器就会越早回应。缓存
HTTP/2 容许服务器未经请求,主动向客户端发送资源,这叫作服务器推送(server push)。常见场景是客户端请求一个网页,这个网页里面包含不少静态资源。服务端能在客户端请求静态资源前主动把这些静态资源随着网页一块儿发给客户端了,省去了客户端创建链接、发起请求等过程,极大提高了速度。安全
因为底层支持TCP协议的缺陷,致使HTTP/2仍是存在一些问题。
Connection:keep-alive
,TCP链接在发送后将仍然保持打开状态,因而,浏览器能够继续经过相同的链接发送请求。保持链接节省了为每一个请求创建新链接所需的时间,还节约了网络带宽。一个完整的请求由请求行
、请求头
和请求体
三部分组成。
请求行包含:请求方法、请求地址(URL)和协议版本。
方法名 | 功能 |
---|---|
GET | 向指定的资源发出“显示”请求,使用 GET 方法应该只用在读取数据上,而不该该用于产生“反作用”的操做中 |
POST | 指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会建立新的资源或者修改现有资源,或二者皆有。 |
PUT | 向指定资源位置上传其最新内容 |
DELETE | 请求服务器删除 Request-URI 所标识的资源 |
OPTIONS | 使服务器传回该资源所支持的全部HTTP请求方法。用* 来代替资源名称,向 Web 服务器发送 OPTIONS 请求,能够测试服务器功能是否正常运做 |
HEAD | 与 GET 方法同样,都是向服务器发出指定资源的请求,只不过服务器将不传回资源的本文部分,它的好处在于,使用这个方法能够在没必要传输所有内容的状况下,就能够获取其中关于该资源的信息 (原信息或称元数据) |
TRACE | 显示服务器收到的请求,主要用于测试或诊断 |
CONNECT | HTTP/1.1 中预留给可以将链接改成通道方式的代理服务器。一般用于 SSL 加密服务器的连接(经由非加密的 HTTP 代理服务器) |
请求头包含客户端主机名和客户端环境信息。 常见的请求头:
名称 | 做用 |
---|---|
Authorization | 用于设置身份认证信息 |
User-Agent | 用户标识,如:OS 和浏览器的类型和版本 |
Accept-Encoding | 告诉服务器能接受什么编码格式,如 gzip、deflate |
If-Modified-Since | 值为上一次服务器返回的Last-Modified值,用于肯定某个资源是否被更改过,没有更改过就从缓存中读取 |
If-None-Match | 值为上一次服务器返回的 ETag 值,通常会和If-Modified-Since |
Cookie | 已有的Cookie |
Referer | 标识请求引用自哪一个地址,好比你从页面 A 跳转到页面 B 时,值为页面 A 的地址 |
Host | 请求的主机和端口号 |
通用的首部字段:
名称 | 做用 |
---|---|
Cache-Control | 响应输出到客户端后,服务端经过该属性告诉客户端该怎么控制响应内容的缓存 |
Date | 代表HTTP报文建立的日期和时间 |
Trailer | 报文某段的的首部一览 |
Warning | 错误通知 |
请求体(又叫请求正文)是 post 请求方式中的请求参数,以 key = value 形式进行存储,多个请求参数之间用&链接,若是请求当中请求体,那么在请求头当中的 Content-Length 属性记录的就是该请求体的长度
一个完整的响应由响应行
、响应头
和响应体
三部分组成。
响应行包含:协议版本、状态码和状态描述。
2XX成功
3XX重定向
4XX客户端错误
5XX服务器错误
同请求头同样,用来传递附加信息。 常见的响应头:
名称 | 做用 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
ETag | 表示你请求资源的版本,若是该资源发生啦变化,那么这个属性也会跟着变 |
Location | 在重定向中或者建立新资源时使用 |
Set-Cookie | 服务端能够设置客户端的cookie |
响应体也就是网页的正文内容,通常在响应头中会用 Content-Length 来明确响应体的长度,便于浏览器接收,对于大数据量的正文信息,也会使用 chunked 的编码方式。
回到开篇的图片可知,HTTPS是在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并保护交换数据的隐私与完整性。为了解决HTTP的明文通讯,没法验证对方身份和报文的完整性等问题,网景公司(Netscape)在1994年提出了HTTPS协议,随后拓展到互联网上。目前HTTPS已经取代HTTP成为主流协议,并且HTTP/2以后都只能用于HTTPS加密链接。
对称加密 对称密钥(Symmetric-key algorithm)又称为共享密钥加密,加密和解密使用相同的密钥。常见的对称加密算法有DES、3DES、AES、RC五、RC6。对称密钥的优势是计算速度快,可是它有缺点,双方须要都知道密钥才能加解密,所以如何安全的发送密钥给接收者成为了一个问题。
非对称加密 公开密钥加密(public-key cryptography)简称公钥加密。公钥能够随意分发,发送方使用公钥进行加密处理,接收方用本身的私有私钥进行解密。这种方式没必要担忧密钥被攻击者窃听而盗走,但服务器没法验证公钥信息,存在被中间人截获替换的风险,另外非对称加密的传输效率比对称加密低。
解决方案:对称加密+非对称加密 对称加密效率高,非对称加密能够防止传输内容被截获。结合二者的优点,HTTPS在交换秘钥阶段采用非对称加密,创建通讯后经过对称加密来传递信息。例如发送信息的一方先使用对方的公钥加密对称密钥,对方接收到信息后用私钥进行解密得到对称密钥,以后双方的通讯都用对称密钥进行加解密。
至此,完成了服务器向客户端的单向验证,若要使客户端对服务器也进行验证操做(双向验证),则须要将CA证书放在客户端。 若采用双向验证,则在步骤2服务器会额外向客户端请求客户端的CA证书信息,客户端在步骤3验证服务器证书后,会将客户端证书发给服务器进行验证。 双向验证能更好的预防中间人攻击,客户端内置了仅接受指定域名的证书,保障了客户端与服务端通讯的惟一性和安全性,但要注意证书续期后需从新将证书放入到客户端中。
文章 用信鸽来解释 HTTPS 详细描述了整个过程,这里再也不累述,想了解的能够自行阅读。
Charles的抓包原理是假装成中间人,拦截服务器响应,用Charles制做的CA证书替换服务器证书发给客户端,再拦截客户端响应用以前拦截的服务器证书公钥从新加密发给服务器,让双方误觉得仍是在正常的验证通讯中。这一切发生的前提是客户端选择信任并安装Charles的CA证书,不然客户端校验不过CA证书就会报错并停止校验。 具体过程如图:
HTTP 协议入门
HTTP 0.9 HTTP 1.0 HTTP 1.1 HTTP 2.0区别
HTTP 基础与变迁
5分钟让你明白HTTP协议
程序员都该懂点 HTTP
前端必备HTTP技能之HTTP请求头响应头中经常使用字段详解
解密HTTP/2与HTTP/3 的新特性
深刻理解HTTPS工做原理
也许,这样理解HTTPS更容易
HTTP与HTTPS的区别
HTTPS协议详解(五):HTTPS性能与优化
扯一扯HTTPS单向认证、双向认证、抓包原理、反抓包策略