HTTP协议
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。HTTP使用的默认端口号是80端口 HTTPS使用的默认端口是443端口
HTTP协议发展
http协议目前有4个版本,其中1.0和1.1版本在互联网上被广泛使用,2.0版本目前应用很少,是下一代的http协议。
http/0.9版本:1991年,原型版本,功能简陋,只有一个命令GET,服务器只能回应HTML格式字符串,该版本已过时。
http/1.0版本:1996年5月,支持cache、MIME、method等。
http/1.1版本:1997年1月,默认建立持久连接,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。
http/2 版本:2015年5月作为互联网标准正式发布,头部信息和数据体都是二进制,引入头信息压缩机制等。
HTTP1.0版本
- 任何格式的内容都可以发送,这使得互联网不仅可以传输文字,还能传输图像、视频、二进制等文件。
- 除了GET命令,还引入了POST命令和HEAD命令。
- http请求和回应的格式改变,除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。
- 头信息是 ASCII码,而后面数据可为任何格式。服务器回应时会告诉客户端,数据是什么格式,即Content-Type字段的作用。这些数据类型总称为MIME即多用途互联网邮件扩展,每个值包括一级类型和二级类型,预定义的类型,也可自定义类型,常见Content-Type值:text/xml image/jpeg audio/mp3
- 每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接
关于HTTP消息头 HTTP消息头是在客户端请求(Request)或服务器响应(Response)时传递的。以明文的字符串格式传送,是以冒号分隔的键/值对,如:Accept-Charset: utf-8,每一个消息头最后以回车符(CR)和换行符(LF)结尾。HTTP消息头结束后,会用一个空白的字段来标识,这样就会出现两个连续的CR-LF。
HTTP1.1版本
http1.1是目前最为主流的http协议版本。
- 引入了持久连接( persistent connection),即TCP连接默认不关闭,可以被多个请求复用,默认Connection: keep-alive,如果响应方不支持keep-alive,则修改为Connection: close
- 引入了管道机制(pipelining),即在同一个TCP连接里,客户端可以同时发送多个请求(大多数浏览器允许同时建立6个持久连接引入了管道机制),进一步改进了HTTP协议的效率。
- 新增方法:PUT、 PATCH、 OPTIONS、 DELETE。
- http协议不带有状态,每次请求都必须附上所有信息。请求的很多字段都是重复的,浪费带宽,影响速度。
其实 http1.X 还是有些问题没有解决的:
- 传输数据是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性。
- header头部数据太长。
- 每次传输还是要重新连接。
- server不能主动push。
- 1.1版本允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应,可能会造成Head-of-line blocking(队头阻塞)的问题。
HTTP2.0版本
http/2发布于2015年,目前应用还比较少,该版本主要有如下特点:
- http/2是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。
- 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了队头堵塞的问题。此双向的实时通信称为多工(Multiplexing)。
- HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送。
- 引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度。
|