本文主要内容:
前言:什么是协议?
1.http的由来(http是什么)
2.http消息格式
3.http的使用
4.http1.1
5.http2
6.https
注:本文内容纯手敲,但是很多知识参考自网络,图片也来源于网络,如有侵权,请告知,立删。在此,也感谢网络上各位分享知识的朋友们。
前言:什么是协议?
顾名思义,协议就是几个人一起商量制定的共同遵守的规范,这与我们生活的协议基本意义是一样的。举个例子,中国人与中国人交流都使用『普通话』,普通话就像一个协议,大家都使用了,交流无障碍。如果一个人使用普通话,一个人用方言,那么两个人是不能正常的沟通的。美国人可以听懂英国人讲话,为什么呢?因为他们都使用英语,『英语』就像一个协议,他们都能理解,都知道每句话的含义。程序员与计算机交流使用的是程序设计语言,计算机能够理解,其他程序员也能够理解,因为他们都遵循了『程序设计语言』这种协议,而其他人员可能就无法理解含义了。说了这么多,就是为了解释『协议』的概念,计算机与计算机之间要想很好的"交流",能够互相理解对方的意思,那么也要遵守各种各样的『协议』。
再举个例子,现有两台计算机,计算机A和计算机B,他两个之间约定了协议P,协议如下:
P:
a:早上七点
b:吃早饭
w:起床了
p:出去玩
s:写作业
f: 完成
此时,A向B发送了一串字母『awb』,B收到之后,就会根据约定的协议明白A的意思是『早上七点了该起床吃早饭了』。但是不知道协议的其他计算机是不会明白『awb』的含义的。假如所有的计算机都遵循了协议P,那么所有的计算机都可以明白它的意思了。所以,为了方便计算机交流,世界上的权威组织才制订了各种各样的协议,像TCP,UDP,IP,ICMP,DHCP,DNS,RPC等等,HTTP也是其中很重要的一种。当然了,计算机技术是不断更新的,那么协议也是会跟着更新,更加适应新的环境。
现在你明白什么是协议了吗?
一、http的由来(http是什么)
了解http之前,我们先来看一下http的发展史简图:

明白了什么是协议,那么也就很容易理解http协议了。它是为了解决从服务器向浏览器传输报文的一种协议。

我们把从浏览器发起请求的一端称为『客户端』或『终端』,把响应请求的一端称为『服务器端』。当然了,服务器也有很多种,我们这里说的服务器是指『web服务器』。
HTTP协议的全名是Hyper Text Transfer Protocol(超文本传输协议),是由万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果。他们在1996年定义了HTTP1.0版本。其实最早的版本是1991年制定的0.9版本。该版本非常的简单,只有一个get命令。
GET /index.html
上面的协议表示,当TCP链接建立以后,客户端向服务器端请求网页index.html。
协议规定,服务端收到请求后,只能回应html格式的字符串,不能有其他格式。
<html>
<body>你好</body>
</html>
随着计算机的发展,这样的单一格式是不能够满足计算机的通信的。于是在1996年5与的时候,HTTP1.0终于诞生了。
二、http的消息格式
http1.0 的内容大大的增加了,不仅仅支持字符串,还支持图片、视频、音频、二进制文件等等格式。
其次呢,不仅仅有get命令,还增加了post、head命令,增加了客户端和服务器的互动手段。
再次,请求和响应的格式也变了,每个请求和响应都必须增加『http header』,用来描述这个请求或者响应的一些基本信息,比如来自哪里,格式是什么,协议版本是多少等等。
1.0的请求头:

简单说明:
get请求,使用http1.0版本,可以接收任意类型的报文。
1.0的响应头:

简单说明:
第一行是使用http1.0协议,请求状态是200,也就是正常。
content-type: 响应的格式;
content-length: 响应的长度;
expires:服务器响应时间;
三、http的使用
我们平时在浏览器中输入网址,或者使用搜索引擎搜索东西,这个时候都是使用的http协议。现在的前端开发,更是无时不刻不在使用http协议。我们来看一个常见的例子:
https://www.jianshu.com/u/9cb1b23a59bc
这是我们常用的网址,开头就是https,说明它是使用https协议进行传输数据的。
http和html有什么关系呢?
http是传输协议,html是传输的内容。当然了,传输的内容还有很多,html只是其中很重要的一种。比如,我们常见的传输json,传输xml等。
四、http1.1
我们知道,http协议是建立在TCP协议的基础上,也就是客户端和服务器连接建立起来以后,才能够使用http传输数据。而http1.0版本的缺点就是,每次传输都要建立新的TCP连接,传完就断开连接。要知道,建立TCP连接需要进行三次握手,是消耗时间和性能的。尤其是刚开始建立连接的时候,发送速度是比较慢的。随着外部资源(js, css, image等)的增多,这种传输肯定是不能够满足时间就是金钱的人们的需要的。于是乎,在1997(也有说1999年的,但这不重要)年的时候,http1.1诞生了。
http1.1对http1.0做了很多优化,其中长连接是最重要的一种变化。也就是说,当TCP链接建立以后,不是发送完一个HTTP请求就关闭,而是复用这个TCP链接,直到服务器或者客户端主动断开连接。这样就大大提高了效率,不用频繁的建立连接,断开连接。
http1.1的具体优化如下:
1.缓存处理。
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
2.带宽优化以及网络连接的使用。
HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
3.错误通知的管理。
在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
4.Host头处理。
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
5.长连接。
HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
http1.1自从1999年制定,此后的一二十年,一直在稳定的使用。直到今天,http1.1也是一直在使用着。我用抓包工具随便抓了个包看了一下,果然还是http1.1呢。
http:

http1.1:

http1.1坚持了那么多年,除了一些商业因素,也可见它是多么的稳定。
但是,http1.1也是有缺点的。
虽然1.1版本里面允许复用TCP连接,但是同一个TCP链接里面,所有的http请求是按照顺序依次执行的。服务器只能处理完一个回应,才能处理下一个回应。如果前一个回应比较慢,那么后来的回应都得等待,导致响应时间较长。为了避免这个问题,很多前端开发的小伙伴就会想很多优化策略,比如合并脚本和样式表,将图片嵌入CSS代码等。
五、http/2
首先说明,http/2并没有普及,为什么呢?因为任何新的事物要取代就得事物是需要时间和成本的。先来直观的看一下http2吧。

为了解决http1.1效率不够高的问题,谷歌在2009年推出了SPDY协议,并且在2012年退出SPDY3.0,增加了流控制,随后又增加了流优先级等概念,在谷歌浏览器上运行良好,而且是http2.0的基础。
SPDY做了如下优化:
- 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。
2.请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。
3.header压缩。前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
4.基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。
5.服务端推送(server push),采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。SPDY构成图:

http2是在SPDY基础上,做了更多的优化,更加提高传输速度和效率。Akamai 公司建立的一个官方的演示,用以说明 HTTP/2 相比于之前的 HTTP/1.1 在性能上的大幅度提升。
同时请求 379 张图片,从Load time 的对比可以看出 HTTP/2 在速度上的优势。

但是,http2与SPDY还是有区别的。
1.HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
2.HTTP2.0 消息头的压缩算法采用 HPACK ,而非 SPDY 采用的 DEFLATE 。
再用一张图片来演示http2的请求。
有一次主页请求index.html、一次main.css,一次jq.js以及一些image文件和字体文件qq.tff。

上图描述了http2请求的依赖树。
说明:
HTML的优先级最高,在HTML传输完成之前,其他文件不会被传输。HTML传输完成后,JS和CSS根据其分配的权重占比分配信息传输资源。如果CSS传输完成后,TFF和PNG如果是相同权重,那么他们将占有1/4的信道资源。
这里抛出3个问题和答案。
-
如果CSS被阻塞了,那么 JS 得到本属于CSS的通信资源;
-
如果CSS传输完成但没有被移依赖树, TFF和PNG继承CSS的通信份额 (假设TFF和PNG权重一样,那么各分得1/4通信资源);
-
如果CSS在依赖数被移除,JS, TFF, PNG平分通信资源(假设3个权重一样,那么三者各分得1/3通信资源)。
如果想知道如何部署http2,请参考这里:
https://www.cnblogs.com/qcloud1001/p/9591172.html
如果想知道http2为什么还没有普及,请参考这里:
https://neue.v2ex.com/t/289749
六、https
https是http发展史上的一颗明星,因为它更加的安全,还有就是它迅速的普及,一是因为它很优秀,二是因为它很幸运。网景在1994年的时候创建了https(想不到吧,它居然比我们很多程序员小哥哥还要大呢),2000年的时候,https由RFC 2018正式亮相,走上历史舞台。
https也是在近两年的时候才迅速普及了,Google、Baidu、Facebook 等这样的互联网巨头,不谋而合地开始大力推行 HTTPS, 国内外的大型互联网公司很多也都已经启用了全站 HTTPS。优秀很重要,被人赏识也很重要。
为鼓励全球网站的 HTTPS 实现,一些互联网公司都提出了自己的要求
1.Google 已调整搜索引擎算法,让采用 HTTPS 的网站在搜索中排名更靠前;
2.从 2017 年开始,Chrome 浏览器已把采用 HTTP 协议的网站标记为不安全网站;
3.苹果要求 2017 年App Store 中的所有应用都必须使用 HTTPS 加密连接;(后来又放宽了要求。)
4.微信小程序也要求必须使用 HTTPS 协议;
这样的推广力度,也让https风光无限,一时各大网站都出现了https如何配置的文章。
那么,什么是https呢?
https = http + SSL/TLS
就是http加了一层加密层,用于安全的数据传输。

SSL:安全套接字,是网景公司研发的,位于TCP/IP
与各种应用层协议之间,保证数据的安全性的协议。
TLS:传输层安全,前身是SSL。
我们加密的方式也有很多,有对称加密,非对称加密,哈希算法,数字签名等方式。
先来看一下,http传输的简单示意图吧。

都是明文传输,抓包能清晰的知道传输的内容是什么。
随便抓了一个APP,看一下http的内容:

我们很清晰的看到了传输的内容。万一我们是坏人,是不是就可以利用这些内容干坏事了呢?
http面临着诸多风险,如下三条是常见的。
(1) 窃听风险:黑客可以获知通信内容。
(2) 篡改风险:黑客可以修改通信内容。
(3) 冒充风险:黑客可以冒充他人身份参与通信。
https就是为了防止明文传输的不安全性,使用密文传输。先看下示意图:

说明:
这里使用了非对称加密和对称加密两种加密方式。
如上图所示,在第 ② 步时服务器发送了一个SSL证书给客户端,SSL 证书中包含的具体内容有:
- 证书的发布机构CA
- 证书的有效期
- 公钥
- 证书所有者
- 签名
······
客户端在接受到服务端发来的SSL证书时,会对证书的真伪进行校验,以浏览器为例说明如下:
(1)首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验 (2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发。 (3)如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。 (4)如果找到,那么浏览器就会从操作系统中取出 颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密 (5)浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比 (6)对比结果一致,则证明服务器发来的证书合法,没有被冒充 (7)此时浏览器就可以读取证书中的公钥,用于后续加密了。
(1)第 ③ 步时,客户端说:(咱们后续回话采用对称加密吧,这是对称加密的算法和对称密钥)这段话用公钥进行加密,然后传给服务器。
(2)服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,服务器说:(好的)对称密钥加密。
(3)后续两者之间信息的传输就可以使用对称加密的方式了。
看下我使用抓包工具抓到的https的数据,因为我没有合法证书,所以是无法看到正常的数据信息的。

https是很安全的,但是并不是十全十美的,它也是有缺点的。
HTTPS 缺点:
(1)SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐。
(2)HTTPS 降低用户访问速度(多次握手)。
(3)网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)。
(4)HTTPS 涉及到的安全算法会消耗 CPU 资源,需要增加大量机器(https访问过程需要加解密)。
网友评论