非持续连接的缺点很明显,那就是对于每一个请求/响应都需要建立TCP连接,这样将导致服务器需要维护的连接大大增加,比如一个页面包含10张图片,那总共就得2建立11给连接,这样将给服务器造成巨大的压力。而好处就是,多个连接可以同时建立(一个浏览器一般可以同时建立5-10个连接),表示有多个通道,通道之间传输数据是并行的,多个请求/响应可以同时进行,这样就不会造成排队的情况,效率较高。
(2)持续连接
持续连接表示某个客户端与一个服务器建立连接后,在一段时间内,向服务器发送的请求以及服务器发送的响应,都可以通过这一条连接来进行。这个应该很好理解。而持续连接也分为两种:
不带流水线的持续连接:这表示一次性只能进行一个请求/响应,而下一个必须得等上一次完成后才进行;
带流水线的持续连接:这表示对对象的请求可以一个个发出,而不需要等未完成的请求结束(但不是完全并行);
对于长时间未使用的连接,HTTP会将它关闭,而这个超时时间也可以进行配置。
持续连接的好处也很明显,那就是节省资源,多个请求共用一个连接;但是缺点就是效率可能相对要低一些。HTTP的默认模式就是带流水线的持续连接。
2.3 HTTP报文格式
接下来,我们就来谈一谈HTTP协议的报文格式吧。HTTP的报文分为请求报文和响应报文。
(1)请求报文
下面是一段我从浏览器截取下来的HTTP的请求报文,请求的资源是一张图片:
HTTP请求报文的第一行为请求行,剩下的都叫首部行,下面我来一行一行解释上面的内容:
首先是第一行,也就是请求行,它包含三部分内容:请求方法,资源路径,HTTP协议版本,它们三者由空格隔开。第一部分的请求方法表示客户端向浏览器发送的请求的类别,我们常用的请求方式是GET和POST请求:
GET:向服务器请求资源,服务器将请求的资源返回;
POST:向服务器提交数据并请求处理(比如说提交表单),数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改;
上面两个请求方式都是HTTP1.0中定义的,而HTTP1.0除了上面两个请求方法,还有一个HEAD请求:
HEAD:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头;
在HTTP1.1中,又新增了六种请求,分别是OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法,它们的定义我就不一个个列出来了,大家可以点击后面的连接查阅——HTTP请求方法。
紧随请求方法之后的是资源在HTTP服务器上的路径,报文中的路径是/img/prop3.png,表示我们请求的是HTTP服务器路径下,img文件夹下的prop3.png这张图片。这之后的HTTP1.1表示的就是这次请求使用的HTTP的版本了。
请求行下面的都是首部行,而首部行都是name: value格式的,name表示这个首部的名字,而value就是首部的具体值了。第一个首部行的名字叫Host,表示的是HTTP服务器所在的地址,而这里的地址是。第二个首部行的名字是Connection,这个表示的就是我们上面提到的HTTP的连接类型了,而它的值是keep-alive,就是告诉服务器,使用的是持续连接,若值为close,表示的就是非持续连接。第三个首部行User-Agent的作用就是指明用户代理,也就是告诉服务器,发送这次HTTP请求的浏览器的类型。第四个首部行Accept的作用告诉服务器自己希望接收的资源的类型,若服务器响应的资源与此不一致,将会报错,而从上面的报文中可以看出,这个请求希望受到一张图片。Referer的作用是用来防止恶意请求,提高访问资源的安全性。Accept-Encoding的作用是告知服务器,当前浏览器支持的编码类型。Accept-Language的作用是告知HTTP服务器客户端想要获取资源的语言版本,若服务器中不包含此语言版本,则将回送默认版本。
下面这张图是HTTP请求报文的标准格式:
(2)响应报文
同样,我们先来看一段响应报文: