HTTP发展历程

HTTP是基于TCP/IP协议的应用层协议,不涉及数据包传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。

HTTP/0.9

只有一个命令GET

1
GET /index.html

上面命令表示,TCP连接建立后,客户端向服务器请求网页index.html。协议规定,服务器只能返回HTML格式的字符串,不能回应别的格式。服务器发送完毕之后关闭TCP连接。

HTTP/1.0

  • 增加POSTHEAD命令,丰富了浏览器与服务器的交互手段。
  • 增加了内容的可发送格式:不仅文字,还能传输图像、视频、二进制文件。
  • HTTP请求响应格式也变了,除了数据部分,每次通信必须包含头信息(HTTP header)。
  • 增加其他功能:状态码(status code),缓存(cache),内容编码(content encoding),权限(authorization),多字符集支持和多部分发送(multi-part type)。

HTTP请求

1
2
3
GET / HTTP/1.0	
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

第一行是请求行,格式为method + http version。后面是多行头信息,描述客户端情况。

HTTP响应

1
2
3
4
5
6
7
8
9
10
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>

响应的格式是“头信息 + 空行(\r\n) + 数据”。

第一行是“协议版本+状态码(status code)+状态描述”。

缺点

HTTP/1.0的主要缺点是,每个TCP连接只能发送一个请求,数据发送完毕,连接就关闭,如果还要请求其他资源,就必须重新建立连接。

TCP连接新建需要三次握手,成本很高,并且开始时发送效率慢(slow start)。所以性能较差。

为了解决这个问题,有些浏览器在请求时,使用了非标准字段Connection。这个字段要求服务器不要关闭TCP连接,以便其他请求复用。但这不是标准字段,不同实现的行为可能不一样。

1
Connection: keep-alive

HTTP/1.1

持久连接

TCP连接默认不关闭,可以被多个请求复用,不用声明Connection:keep-alive。客户端和服务器端发现对方一段时间没有活动,就主动关闭连接。不过规范的做法是,客户端在最后一个请求时,发送Connection:close,明确要求服务器关闭TCP连接。对于同一域名,大多数浏览器允许同时建立6个持久连接。

管道机制

在同一TCP连接里面,客户端可以同时发送多个请求。举个例子:客户端请求两个资源,以往的做法是在同一个TCP连接里面,先发送A请求,然后等待服务器做出响应,收到后再发出B请求。管道机制允许浏览器同时发送A和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。

其他功能

新增方法:PUT、PATCH、HEAD、OPTIONS、DELETE

新增了Host字段,用来指定服务器域名。有了host字段,就可以将请求发往同一服务器的不同网站,为虚拟主机的兴起打下基础。

1
Host:www.easywork.xin

缺点

虽然允许复用TCP,但是同一个TCP连接里面,所有的数据通信都是按次序进行的,服务器只有处理完一个回应,才会进行下一个回应,要是前面回应得特别慢,后面就会有许多请求排队等着,这成为队头阻塞(Head-of-line blocking)

为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这也催生了很多网页优化技巧:比如合并脚本和样式表,将图片嵌入css代码、域名分片等等。

SPDY协议

  • 多路复用请求:在单个SPDY连接能并发的发起请求,并不限制请求数;
  • 请求优先级:客户端能请求某个资源被优先传输。这避免了高优先级请求被非关键资源堵塞网络通道的问题;
  • 头部压缩:客户端现在发送了大量冗余的HTTP头部信息。因为一个页面可能有50到100个子请求,这些数据是巨大的;
  • 服务端推送流:服务端能向客户端推送数据不需要客户端发起一个请求。

2009年谷歌公开自行研发的协议spdy协议,主要解决HTTP/1.1效率不高的问题。这个协议是HTTP/2.0的基础。

HTTP/2

二进制协议

HTTP/1.1的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。

HTTP/2则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧和数据帧。

二进制协议的好处是可以定义额外的帧。并且二进制解析也较为方便。

多工(避免队头阻塞)

HTTP/2复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或响应,而且不用按顺序一一对应,这样就避免了队头阻塞。

举个例子:在一个TCP连接中,服务器同时受到了A请求和B请求,于是先回应A请求,结果发现处理过程非常耗时,于是就发送A请求已处理好部分,接着回应B请求,完成后,在发送A剩下部分。

这样双向的、实时的通信,就叫多工。

头信息压缩

HTTP协议不带状态,每次请求都必须附上所有信息,所以请求的很多字段都是重复的,比如CookieUser Agent,一模一样的内容,每次请求都必须附带,这样会浪费很多带宽,也影响速度。

HTTP/2对这一点做了优化,引入了头信息压缩机制(header compression):一方面,头信息使用gzipcompress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样的字段了,只发送索引号。

数据流

因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。

HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。

数据流发送到一半的时候,客户端和服务器都可以发送信号(RST_STREAM帧),取消这个数据流。1.1版取消数据流的唯一方法,就是关闭TCP连接。这就是说,HTTP/2 可以取消某一次请求,同时保证TCP连接还打开着,可以被其他请求使用。

客户端还可以指定数据流的优先级。优先级越高,服务器就会越早回应。

服务器推送

HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。

常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期到客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。

Https

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。历史上,HTTPS连接经常用于万维网上的交易支付和企业信息系统中敏感信息的传输。在2000年代晚期和2010年代早期,HTTPS开始广泛使用于保护所有类型网站上的网页真实性,保护账户和保持用户通信,身份和网络浏览的私密性。

Http是运行在TCP上的,Https是在SSL/TLS上的Http协议。

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

通信加密
内容的加密

Reference

HTPP入门协议