一、概况http
是超文本传输协议,它定义了客户端和服务器之间交换报文的格式和方式,默认情况下使用80
端口。它使用tcp
作为传输层协议,保证了数据传输的可靠性。http
是一个无状态的协议,http
服务器不会保证关于用户的任何信息。http
协议存在两种连接,一种是持续连接
, 另一种是非持续连接
。非持续连接
是服务器必须为每一个请求建立和维护一个全新的连接。持续连接
下,TCP
连接默认不关闭,可以被多次请求复用。采用持续连接
的好处是:避免每次建立TCP
连接三次握手所花费的时间。在HTTP1.0
以前使用的是非持续连接
。HTTP1.1
以后默认采用的是持续的连接。目前对于同一个域,大多数浏览器支持同时建立6
个持续连接
。
二、HTTP请求报文HTTP
报文存在两种,一种是请求报文,另一种是响应报文。HTTP请求报文的格式如下:
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
http
请求报文的第一行叫做请求行,后面的行叫做首部行。
请求行包含三个字段:方法字段,url字段和http版本字段
。
方法字段可以有几种不同的取值:GET, POST, HEAD, PUT和DELETE
。一般get
方法只被用来向服务器获取数据。POST
方法被用来向服务器提交数据,通常会造成服务器资源的修改。HEAD
请求和GET
方法类似,但是返回的相应中,不包含请求对象,只是请求头。PUT
方法用于上传文件到服务器,DELETE
方法用于删除服务器上的对象。虽然请求方法有很多,但是更多表达式一种语义上的区别,并不是说POST
能做的事情,GET就不可以做。
三、HTTP响应报文http响应报文的格式如下所示
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>
http
响应报文的第一行叫做状态行,后面的行是首部行,最后是实体主体。
状态行包含三个字段:协议版本字段
,状态码
,对应的状态信息
。
实体部分是报文的主要内容,它包含了所请求的对象。
常见的状态有:
1xx: 表示请求已经接受,仍然可以继续处理。
200:表示请求成功。
301:表示资源的永久重定向。
302:表示资源的临时重定向。
304:表示客户端资源是最新的,无需给出最新的响应。
400: 服务器不理解客户端请求的方法。
401:表示客户端需要认证。
403:表示服务器理解客户端请求,但是拒绝处理该请求。
404:请求资源不存在。
405:Method Not Allowed,http请求方法不允许。
500:服务器内部错误。
502:bad gateway,表示一个internet上一台服务器接受另一台服务器的无效请求,也就是网关错误。
四、首部行
首部可以分为四种首部,请求首部,响应首部,通用首部和实体首部。通用首部和实体首部在请求报文和响应报文中都可以设置,区别在于请求首部和响应首部。常见的请求首部有
Accept: 可接收媒体资源的类型。
Accept-charset: 可接收的字符集。
Host:请求的主机名。
常见的响应首部:
Etag资源的匹配信息,
Location:客户端重定向的uri。
常见的通用首部
:
Cache-control: 控制缓存策略
Connection:管理持久连接。
常见的实体首部:
Content-Length: 实体主体的大小。
Expires: 实体主体的过期时间。
Last-Modified: 资源最后修改的时间。
五、HTTP1.1的缺点HTTP1.1
采用的是持久连接
, 也就是多个HTTP
请求可以共用一个TCP
连接。此时就会出现一个问题,如果前面的请求没有完成,后面的请求就必须等待。如果前面的请求阻塞,就会形成对头阻塞
的情况。为了避免这个问题,我们经常采用的措施是:1、减少请求的数量
,2、开启多个持久连接
。这也就是雪碧图
,多个脚本合并
的原因。
六、HTTP2.0
2009年,谷歌公开了自行研发的SPDY
协议,主要解决HTTP/1.1
效率不高的问题。这个协议在Chrome
浏览器上证明可行以后,就被当做HTTP2.0
的基础,主要都在HTTP2.0
中得到继承。2015
年,HTTP2.0
发布。HTTP/2中的主要新的特性
6.1、二进制协议
http2.0
是一个二进制协议。在http1.1
版本中,报文的头信息必须是文本(ASCLL),报文的数据体可以是文本也可以是二进制。HTTP2.0
则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为帧
,可以分为头信息帧
和数据帧
。
帧的概念是实现多路复用的基础。6.2、多路复用:
http/2
实现了多路复用,http2.0
依然采用复用TCP连接
, 但是在一个连接里,客户端和服务器都可以同时发送多个请求和回应,而且不用按照顺序一一发送,这样就避免了对头阻塞的问题。
6.3、头信息压缩
http2.0
实现头信息压缩,由于http1.0
协议不带有状态,每次请求都必须携带所有信息,导致存在很多的信息都是重复的,比如cookie
和user agent
,一模一样的内容,每次请求都必须携带上,这样浪费很多的宽带,也影响速度。http2.0
对这一点进行了优化,引入头部信息压缩。一方面,头信息可以使用gzip
压缩或者compress
压缩后再发送,另一方面,客户端和服务端共同维护一个头信息表,所有的字段都会存入表中,生成一个索引,以后就不用发送相同的字段了,只发送索引号就行了,这样就能提高速度了。6.4、服务器推送
http2.0
允许服务器未经允许向客户端推送资源,这就叫服务器推送。使用服务器推送,提前给客户端推送必要的资源,这样就可以减少一些延迟时间。这里需要注意的是http2.0
下服务器推送的是静态资源,和websocket
等方式向客户端推送计时数据是不一样的。
七、HTTP2.0协议的缺点
因为HTTP2.0使用多路复用技术,一般来说在同一个域名下只需要使用一个TCP
连接,由于多个数据流使用同一个tcp连接,遵守同一个流量控制和拥塞控制。只要数据流遭遇到拥塞就会导致后面的数据无法发送。HTTP2.0出现这样的问题的原因在于TCP协议的问题。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_47450807/article/details/123458600
内容来源于网络,如有侵权,请联系作者删除!