一、HTTP协议
http协议,是超文本传输协议,此协议是基于TCP/IP的协议,是互联网上应用最为广泛的一直网络协议是一种无状态协议,默认端口为80,。设计HTTP的最初目的是为了提供一种发布和接受HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(URI)来标识。
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个指示头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
二、各版本的http对比
1、HTTP/0.9
HTTP 0.9是第一个版本的HTTP协议,1991年发布。它的组成极其简单,只允许客户端发送GET这一种请求,且不支持MIME类型和请求头。由于没有协议头,造成了HTTP 0.9协议只支持一种内容,即纯文本。不过网页仍然支持用HTML语言格式化,同时无法插入图片。
HTTP 0.9具有典型的无状态性,每个事务独立进行处理,事务结束时就释放这个连接。由此可见,HTTP协议的无状态特点在其第一个版本0.9中已经成型。一次HTTP 0.9的传输首先要建立一个由客户端到Web服务器的TCP连接,由客户端发起一个请求,然后由Web服务器返回页面内容,然后连接会关闭。如果请求的页面不存在,也不会返回任何错误码。
2、HTTP/1.0
HTTP/1.0是在1996年发布,在原来HTTP/0.9的版本上添加了许多方法,各种HTTP首部,以及对多媒体对象的处理,是请求和响应消息的协议版本。除了GET命令,还引入了POST命令。HTTP的请求和回应格式也变了,除了数据部分,每次通信都必须包含头信息(HTTP Header),用来描叙一些元数据。相对于HTTP/0.9,HTTP/1.0也支持了MIME,使HTTP协议扩大了处理的数据类型,支持对多媒体流信息的处理。
虽然,HTTP/1.0相对于HTTP/0.9有了革命性的改变,但HTTP/1.0依然有一些缺点,主要就是每个TCP连接只能发生一个请求,发送数据完毕之后连接就会自动关闭,如果还要再请求其他的资源,就要再创建一个连接。有些浏览器为了解决这个问题,用了一个非标准的Connection头部,也就是Keep-Alive模式(Connection:Keep-Alive)来避免了重新建立连接。但这个不是标准头部,各个浏览器和服务器实现可能不一致,因此不是根本解决办法。
3、HTTP/1.1
HTTP/1.1在1999年正式发布,是目前用得最广泛的协议版本。
HTTP1.1在HTTP1.0的基础上实现的一次飞跃,主要的改进集中在性能、安全、数据类型处理等方面提出Server端缓冲 对象的概念,是减少网络上相同类型内容的反复传送,提高访问速度。默认的是Keep-Alive模式(持久连接),提高了性能。同时还增加了以下功能
- Host协议头: 在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此,Host头的引入就很有必要了。
- Range分段请求: 请求头中,指定第一个字节的位置和最后一个字节的位置。用于告诉服务器自己想取对象的哪部分。如果服务器能够正常响应的话,服务器会返回 206 Partial Content 的状态码及说明。如果不能处理这种Range的话,就会返回整个资源以及响应状态码为 200 OK。
- 分块传输编码(chucked):该编码将实体分块传送并逐块标明长度,直到长度为0块表示传输结束, 这在实体长度未知时特别有用(比如由数据库动态产生的数据)
- 缓存处理等:HTTP/1.1在1.0的基础上加入了一些cache的新特性,新增更为强大的Cache-Control头。
- 请求的流水线处理:在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。例如,一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独网页文件的请求和应答仍需要使用各自的连接。HTTP/1.1还允许客户端不用等待上一次请求结果的返回,就可以发出下一次请求,但服务器端必须按照请求的先后顺序一次返回响应的结果,以保证客户端能够区分出每次请求的响应内容。
4、HTTP/2
HTTP/2是最新的HTTP协议,与2015年5月发布,谷歌、IE11以及火狐等浏览器已经支持HTTP/2协议了。
注意是HTTP/2而不是HTTP/2.0,因为IEFT(互联网工程任务组)认为HTTP/2已经很成熟了,没有必要再发布子版本了,以后要是有重大改动就直接发布HTTP/3。而HTTP/2与HTTP/1.1也存在着挺大的差别,下面我们来看看HTTP/2独有的特性。
1、二进制协议
我们都知道,HTTP/1.1是超文本传输协议,而HTTP/2是采用二进制协议。相比 HTTP/1.1 的纯文本数据,二进制数据一个显而易见的好处是:更小的传输体积。这就意味着更低的负载。二进制的帧也更易于解析而且不易出错,纯文本帧在解析的时候还要考虑处理空格、大小写、空行和换行等问题,而二进制帧就不存在这个问题。
消息头和消息体均采用二进制格式,并成为帧(Frame)。目前有10个Frame,由Type字段来区分,各个Frame都有自己的二进制格式,都封装在Frame Payload中。其中有两个重要的Frame:Header Frame(Type=0x1)和Date Frame(Type=0x0),分别对应HTTP/1.1中的消息头(Header)和消息体(Body),由此可见语义并没有太大变化,而是文本格式变成二进制的Frame。两者的转换关系如下图:
此外,HTTP/2中还有流(Stream)和消息(Message)的概念,通过Strame Identifier(流ID)字段来标识,流ID一样的是同一个流,流中包含消息,这个消息对于HTTP/1.x的请求消息或者响应消息,消息是通过帧来传输的,响应消息比较大时,可能由多个Data Frame来传输
2、多路复用
每个http2连接上传输的帧都关联到一个“流”。流是一个逻辑上的结合,一个独立的,双向的帧序列。它在客户端和服务器端中间通过http2连接进行帧交换。每个单独的http2连接都可以包含多个并发的流,任何一端都可以交错地插入帧。流既可以被客户端/服务器端单方面的建立、使用,也可以被双方共享。同时,两边都可以关闭流。
也就是说,在一个TCP连接里,客户端和服务器端都可以同时发生多个请求或者响应,对于HTTP/1.x来说各个请求和响应都是有严格的次序要求的,而在HTTP/2中,不用按照次序一一对应,而且并发的多个请求或者响应中任何一个请求阻塞了不会影响其他的请求或者响应,这样也就避免了"队头阻塞"。
3、头部压缩
HTTP是无状态协议。简而言之,这意味着每个请求必须要携带服务器需要的所有细节,而不是让服务器保存住之前请求的元数据。因为http2没有改变这个范式,所以它也需要这样(携带所有细节),因此 HTTP 请求的头部需要包含用于标识身份的数据比如 cookies和User Agent,而这些数据的量也在随着时间增长。每一个请求的头部都包含这些大量的重复数据,无疑是一种很大的负担。对请求头部进行压缩,将会大大减轻这种负担,尤其对移动端来说,性能提高非常明显。
而HTTP/2则是采样HPACK格式进行压缩传输,而HPACK简单的说,就是使用2个索引表(静态索引表和动态索引表)来把头部映射到索引值,并对不存在的头部使用 huffman 编码,并动态缓存到索引,从而达到压缩头部的效果。也就是说客户端和服务器端都需要维护一个索引表,相同的消息头只要发送索引号,从而提高效率和速度。
具体关于HPACK的介绍请参考: http://www.jianshu.com/p/f44b930cfcac
4.服务器推送
服务器推送就是说在HTTP/2中服务器未经请求可以直接把资源推送给客户。而在HTTP/1.1中,对服务器请求一个页面,等页面解析之后会再去请求和这个页面有关的css或者js等资源。而HTTP/2则是在响应了某个页面进行请求之后,会顺便把和这个页面有关的css和js等资源推送到到浏览器,当浏览器解析了响应的页面之后发现要请求的有关这个页面的一些css和js等资源就已经在本地之后,就会直接引用,而不会说再次去请求服务器。这就节省了两次请求所花的网络时间,大大提高了网络性能和用户体验。
三、HTTPS
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。其主要用途如下:
1.认证用户和服务器,确保数据发送到正确的客户机和服务器
2.加密数据以防止数据中途被窃取
3.维护数据的完整性,确保数据在传输过程中不被改变。
SSL存在三个特性:
1.机密性:SSL使用密钥加密通信数据
2.可靠性:服务器和客户都会被认证,客户的认证是可选的
3.完整性:SSL协议会对传输的数据进行完整性检查
HTTPS和HTTP的区别主要为以下四点:
一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。