🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### Keep-Alive Keep-Alive是HTTP/1.0与HTTP/1.1提供的一种特性,意味着可以提供有效的HTTP会话,以避免客户端频繁的建立`TCP`链接。主要呢就包含图中4步~ ![](https://img.kancloud.cn/43/72/4372b3f9472c297d48e02963fa094b0e_440x390.jpg) 1. 建立`TCP`连接 2. 发送`HTTP`请求 3. 发送响应文档 4. 释放`TCP`连接 ***** 如果按照HTTP/1.0早起的时候,其实还不支持`Keep-Alive`属性,当时就是一种无状态的`短连接`,后续更新后才给加上去的,而且还得手动加。到了HTTP/1.1时期,`Keep-Alive`就直接给默认加上去了,它的作用就是保持一种`长连接`。 ![](https://img.kancloud.cn/9d/6f/9d6fbe0a12edd062bbf4c8c502e935ed_450x280.png) 1. 左图是**并行短连接** 2. 右图是**长连接** * 短连接 - 每次请求一个资源就建立连接,请求完成后连接立马关闭。 * 长连接 - 只建立一次连接,多次资源请求都复用该连接,完成后关闭。 --- #### **那为什么会有这个属性呢?** * 当时的互联网还不怎么发达,电脑也不是特别普及,上网浏览的内容呢也是少之又少。如果长时间保持`TCP`的连接状态将会耗费服务器端的大量资源。然后干脆就搞简单点,就搞这种`短连接`的,浏览器对这种连接也有一定的并发最大数限制,Chrome的是6个,其他的2(IE6/7)-10(IE9)个不等。 * 随着人类社会的发展,人们的需求日益增加,网页内容也越来越丰富,交互的形式也越来越新花样,新出的元素`img、script、css`等这些还要发起多次请求的怎么办?然后HTTP/1.0就增加了一个`Keep-Alive`属性,表示你只需要打开一次连接,多次资源访问通过这次连接访问就OK了,等到不需要的时候关闭就可以了。 ***** ![](https://img.kancloud.cn/de/07/de0741cb8aa9f3cf8ad2958a141ef89c_651x493.png) --- #### **那什么时候关闭Keep-Alive** 1. Ngnix配置的`keepalive_timeout`到时间了 2. Ngnix配置的`keepalive_requests`最大连接数满了~ 3. Content-Length里的长度 --- ##### 客户端如何知道`Content-Length`的长度 1. 服务器知道资源大小,通过header中的content-length这个属性 ``` Content-Length:1076 (body的大小是1024B,客户端读取1024B就可以了) Transfer-Encoding: null ``` 2. 服务器没法提前知道资源的大小,或者不愿意花费资源提前计算资源大小,就会把http回复报文中加一个header叫Transfer-Encoding:chunked,意思是分块传输。每一块都使用固定的格式,前边是块的大小,后面是数据,然后最后一块大小是0。这样客户端解析的时候就需要注意去掉一些无用的字段。 ``` Content-Length:null Transfer-Encoding:chunked(接下来一块一块的传,开始是一块的大小,等传到大小为0的块时,就没了) ``` 3. 服务器不知道资源的大小,同时也不支持chunked的传输模式,那么就既没有content-length头,也没有transfer-encoding头,这种情况下必须使用短连接,以连接结束来标示数据传输结束,传输结束就能知道大小了。这时候服务器返回的header里Connection一定是close。 ``` Content-Length:null Transfer-Encoding:null Connection:close(服务器端不知道大小,也用不了chunked,啥时候关了tcp连接,就说明传输结束了) ```