HTTP的发展历史 【积一时之跬步,臻千里之遥程】

  1. http版本导图


  1. HTTP版本之概念篇
  • HTTP(超文本传输协议),是互联网上应用最为普遍的一种网络协议,定义了浏览器怎样向服务器请求文档,以及服务器怎样把文档传送给浏览器。HTTP基于TCP/IP协议的应用层协议,它不涉及数据包传输,主要规定了客户端和服务器之间的通讯格式,默认使用80端口。

  1. HTTP/0.9版本篇
要点
  • 客户端向服务器请求网页,服务器只能回应HTML格式的字符串,不能回应别的格式。
  • 只有GET方式
  • 服务器发送完毕。就关闭TCP链接
缺点
  • 每一个TCP链接只能发送一个请求;发送数据完毕,链接就关闭,若是还要请求其余资源,就必须再新建一个链接
  • TCP链接的新建成本很高,由于须要客户端和服务器三次握手,而且开始时发送速率较慢
  • 网页加载的外部资源越多,性能就越差
  • 只有一种请求方式

  1. HTTP/1.0版本篇
要点
  • 任何格式的内容均可以发送。互联网不只能够传输文字,还能够传输图像,视频,二进制文件。(因为发送的数据能够是任何格式,所以能够把数据压缩后再发送。CONTENT-ENCODING字段说明数据压缩的方法
压缩的方式有(能够并列多个,用逗号隔开):
CONTENT-ENCODING:GZIP
CONTENT-ENCODING:COMPRESS
CONTENT-ENCODING:DEATE
复制代码
  • 除了GET命令,还引入POST命令和HEAD命令,丰富了浏览器与服务器的互动手段。
  • HTTP请求和回应格式发生改变,除了数据部分,每次通讯都包括头部分,用来描述数据,
  • 新增的功能还包括:状态码(STATUS CODE),多字符集支持,多部分发送(MULTI-PART TYPE),权限(ANTHORIZATION),缓存(CACHE),内容编码(CONTENT ENCODING)等
HTTP/1.0请求的例子:

GET/HTTP/1.0 
USER-AGENT:MOZILLA/5.0(MACINTOSH;INTEL MAC OS X 10_10_5 ) 
ACCEPT:*/*
第一行为请求命令,必须在尾部添加协议版本(HTTP/1.0)
后面为多行头信息,描述客户端状况
复制代码
HTTP/1.0回应的例子:
HTTP/1.0 200 OK              /*协议版本+状态码+状态描述*/
CONTENT-TYPE: TEXT/PLAIN   
CONTENT-LENGTH: 137582
EXPIRES: THU, 05 DEC 1997 16:00:00 GMT
LAST-MODIFIED: WED, 5 AUGUST 1996 15:55:28 GMT
SERVER: APACHE 0.84

<HTML>
  <BODY>HELLO WORLD</BODY>
</HTML>
CONTENT-TYPE:字符编码,HTTP 1.0规定 头部必须是ASCII码,后面能够是任何格式,
所以,服务器回应时,CONTENT-TYPE的做用是:告诉客户端,数据是什么格式
复制代码
缺点
  • 非持续链接:每一个TCP链接只能发送一个请求,每请求一个文档就须要两倍的RTT往返时间开销(一个RTT用于链接TCP链接,另外一个用于请求和接收文档)。
如图所示:当HTTP协议首先要与服务器创建TCP链接,这就须要三次握手。当三次握手的前两部分完成后(即通过一个RTT时间后),万维网客户就把HTTP请求报文做为第三次握手的第三个报文的数据发送给万维网服务器,服务器收到HTTP报文后,就把所请求的文档做为响应报文返回给客户。

请求一个文档须要的时间
请求一个文档须要的时间

  • 发送数据完毕,链接就关闭,若是还要请求其余资源,就必须再新建一个链接。
  • TCP链接的新建成本很高,由于须要客户端和服务器三次握手,而且开始时发送速率较慢。(为了解决这个问题:有些浏览器在请求时,用了一个非标准的CONNECTION字段。即CONNECTION:KEEP-ALIVE请求服务器不要关闭TCP链接,以便其余请求复用,服务器一样回复这个字段;以实现TCP的复用,直到客户端或服务器主动关闭链接,但,这不是标准字段,不一样实现的行为可能不一致,所以不是根本的解决办法。
  • 网页加载的外部资源越多,性能就越差。

5. HTTP/1.1版本篇html

要点
  • 引入了持久链接(PERSISITENT CONNECTION),即TCP链接默认不关闭,能够被多个请求复用,不用声明(简单的说:就是服务器在发送响应后仍热在一段时间内保持这条链接,使同一个用户(浏览器)和该服务器能够继续在这条链接上传送后续的HTTP请求报文和响应报文)。CONNECTION:KEEP-ALIVE客户端和服务器发现对方一段时间没有活动,就能够主动关闭链接。不过,规范的作法是,客户端在最后一个请求时明确要求服务器关闭TCP链接。CONNECTION:CLOSEgit

  • 目前,对于同一个域名,大多数浏览器容许同时创建6个持久链接。github

  • 引入了管道机制,即在同一个TCP链接里面,客户端能够同时发送多个请求。(提升HTTP协议的效率);举例说明:客户端须要请求两个资源,HTTP1.0是在同一个TCP链接里面,先发送A请求,而后等待服务器作出回应,收到后再发送B请求;管道机制是容许浏览器同时发生A请求和B请求,可是服务器仍是按照顺序,先回应A请求,完成后再回应B请求数组

  • 一个TCP链接能够传送多个回应,势必要有机制,区分数据包是属于哪个回应的。这就是CONTENT-LENGTH字段的做用,声明本次回应的数据长度。浏览器

CONTENT-LENGTH:3495
告诉浏览器本次回应的长度是3495个字节,后面的字节就属于下一个回应
复制代码
  • 分块传输编码;HTTP1.1采用分块传输编码;使用CONTENT-LENGTH字段的前提是服务器发送回应以前,必须知道回应数据的长度。但对于一些耗时的动态操做来讲,这意味着,服务器要等全部操做完成,才能发送数据,显然效率不高,更好的处理方式是:服务器每产生一块数据,就发送一块,采用“流模式(STREAM)”取代“缓存模式(BUFFER)”.所以1.1版规定能够不使用CONTENT-LENGTH字段,而使用“分块传输编码”,只要请求或回应的头信息有TRANSFER-ENCODING字段,就代表回应的数据将由数量未定的数据块组成。TRANSFER-ENCODING:CHUNKED 每一个非空的数据块以前,会有16进制的数值,表示这个块的长度,最后是一个大小为0的块,就表示本次回应的数据发送完。
Eg:
HTTP/1.1 200 OKCONTENT-TYPE: TEXT/PLAINTRANSFER-ENCODING: CHUNKED

25
THIS IS THE DATA IN THE FIRST CHUNK

1C
AND THIS IS THE SECOND ONE

3
CON

8
SEQUENCE

0

复制代码
  • ** 新增功能**:PUT,PATCH,HEAD,OPTIONS,DELECT. 客户端的头信息增长HOST字段,用来指定服务器的域名。 HOST:WWW.EXAMPLE.COM 有了HOST字段,就能够将请求发往同一台服务器的不一样的网站,为虚拟主机的新起打下了基础。
缺点
  • 虽然复用TCP链接,可是在同一个TCP链接里面,全部的数据通讯都是按照次序进行的。服务器只有处理完一个回应,才能进行下一个回应。(解决办法:A. 减小HTTP请求数;B:同时多开持久链接)

6. HTTP/2版本篇缓存

要点
  • 采用二进制协议:HTTP/1.1的头信息是文本(ASCII编码),数据体能够是文本(解析很是麻烦),也能够是二进制。而HTTP/2则是一个完全的二进制协议,头信息和数据体都是二进制,通称为“帧”(FRAME):头信息帧和数据帧。二进制协议的一个好处是:能够定义额外的帧,解析方便。
  • 多路复用(双向,实时的通讯):HTTP/2复用TCP链接,在一个链接里,客户端和服务端均可以同时发送多个请求或回应,而不用按照顺序一一对应,这样就避免“队头阻塞”。举例来讲:在一个TCP链接里面,服务器同时收到A请求和B请求,先回应A请求,结果发现处理过程很是耗时,因而就发送A请求已经处理好的部分,接着回应B请求,完成后,才发送B请求剩下的部分。
  • 数据流:HTTP/2的数据流是不按顺序发送的,同一个链接里面连续的数据包,可能属于不一样的回应。所以必需要对数据包标记,指出它属于哪一个回应。HTTP/2将每个请求或回应的全部数据包,称为一个数据流。每一个数据流都有一个独一无二的编号。数据包发送时,都必须标记数据流ID,用于区分它属于哪个数据流,另外规定:客户端发出的数据流,ID一概为奇数,服务器发出的,ID为偶数。数据流发送一半时,客户端和服务器均可以发送信号,取消这个数据流。即HTTP/2能够取消某一个请求,同时保证TCP链接还开着,能够被其余请求使用。客户端还能够指定数据流的优先级,优先级越高,服务器就越早回应。
  • 头信息压缩:HTTP2之前的版本协议不带有状态,每次请求都必须附上全部的信息。因此,请求的不少字段都是重复的,好比COOKIE和USER AGENT,如出一辙的内容,每次请求都必须附带,这很浪费不少宽带,也影响速度。HTTP/2优化了这一点。引入了头信息压缩机制。一方面:头信息使用GZIP或COMPRESS压缩后再发送,另外一方面,客户端和服务端同时维护一张头信息表,全部字段都会存入这个表,生成一个索引号,之后就不发送一样字段,只发送索引号,提升速度。
  • 服务器推送:HTTP/2容许服务器未经请求,主动向客户端发送资源-->服务器推送。eg:客户端请求一个网页,这个网页里面包含静态资源。正常状况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发送静态资源请求;其实,服务器能够预期到客户端请求网页后,极可能再请求静态资源,因此主动把这些静态资源随网页一块儿发给客户端。
缺点
  • 请求太多时也须要排队

7. HTTPS版本篇安全

要点
  • HTTPS 是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,所以加密的详细内容就须要SSL
  • HTTPS协议的主要做用是:创建一个信息安全通道,来确保数组的传输,确保网站的真实性
  • HTTPS的SSL加密是在传输层实现的
工做原理
  • 客户使用HTTPS URL访问服务器,则要求WEB 服务器创建SSL连接。
  • WEB服务器接收到客户端的请求以后,会将网站的证书(证书中包含了公钥),返回或者说传输给客户端。
  • 客户端和WEB服务器端开始协商SSL连接的安全等级,也就是加密等级。
  • 客户端浏览器经过双方协商一致的安全等级,创建会话密钥,而后经过网站的公钥来加密会话密钥,并传送给网站。
  • WEB服务器经过本身的私钥解密出会话密钥。
  • WEB服务器经过会话密钥加密与客户端之间的通讯。
优势
  • 使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器
  • HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全,可防止数据在传输过程当中不被窃取、改变,确保数据的完整性。
  • HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增长了中间人攻击的成本。
缺点
  • HTTPS握手阶段比较费时,会使页面加载时间延长50%,增长10%~20%的耗电。
  • HTTPS缓存不如HTTP高效,会增长数据开销。
  • SSL证书也须要钱,功能越强大的证书费用越高。
  • SSL证书须要绑定IP,不能再同一个IP上绑定多个域名,IPV4资源支持不了这种消耗。
HTTP和HTTPS的区别
  • HTTPS协议须要证书,费用较高。
  • HTTP是超文本传输协议,传输的数据都是未加密的即明文传输,HTTPS则是具备安全性的SSL加密传输协议。
  • 使用不一样的连接方式,端口也不一样,通常而言,HTTP协议的端口为80,HTTPS的端口为443
  • HTTP协议是无链接,无状态的;(无链接:虽然HTTP使用了TCP链接,但通讯的双方在交换HTTP报文以前不须要创建HTTP链接;无状态:是指服务端对于客户端每次发送的请求都认为它是一个新的请求,上一次会话和下一次会话没有联系);HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
  • HTTPS提高访问速度(能够对于,请求资源所需时间更少,访问速度更快,相比HTTP1.0)
  • HTTPS容许多路复用:多路复用容许同时经过单一的HTTP/2链接发送多重请求-响应信息。改善了:在HTTP1.1中,浏览器客户端在同一时间,针对同一域名下的请求有必定数量限制(链接数量),超过限制会被阻塞。
  • 二进制分帧:HTTP2.0会将全部的传输信息分割为更小的信息或者帧,并对他们进行二进制编码
  • HTTP2首部压缩;服务器端推送(相对于HTTP1.0)

7. SSL/TLS协议介绍

互联网的通讯安全是创建在SSL/TLS协议之上。不使用SSL/TLS的HTTP协议,就是不加密的通讯;会带来三大风险:bash

  • (1)窃听风险:第三方能够获取通讯内容;
  • (2)篡改风险:第三方能够修改通讯内容。
  • (3)冒失风险:第三方能够冒充他人身份参与通讯。
SSL/TLS就是为了解决这三大风险而设计的,但愿达到:
  • (1)全部信息都是加密传播,第三方没法窃听
  • (2)具备校验机制,一旦被篡改,通讯双方当即发现。
  • (3)配备身份证书,防止身份被冒充。
SSL/TLS协议的基本思路

采用公钥加密法,即客户端先向服务端索要公钥,而后用公钥加密信息,客户端收到密文后,用本身的私钥解密。服务器

如何保证公钥不被篡改?

解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。网络

公钥加密计算量太大,如何减小耗用的时间?

解决方法:每一次对话(SESSION),客户端和服务器端都生成一个"对话密钥"(SESSION KEY),用它来加密信息。因为"对话密钥"是对称加密,因此运算速度很是快,而服务器公钥只用于加密"对话密钥"自己,这样就减小了加密运算的消耗时间。

SSL/TLS协议的基本过程
  • (1) 客户端向服务器端索要并验证公钥。
  • (2) 双方协商生成"对话密钥"。
  • (3) 双方采用"对话密钥"进行加密通讯。 上面过程的前两步,又称为"握手阶段"(HANDSHAKE)。 开始加密通讯以前,客户端和服务器首先必须创建链接和交换参数,这个过程叫作握手;HTTP耗时 = TCP握手;HTTPS耗时 = TCP握手 + SSL握手 因此,HTTPS确定比HTTP耗时,这就叫SSL延迟
8.** 参考文章**

2019-05-12 21:16:45 星期日

相关文章
相关标签/搜索