#### 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连接,就说明传输结束了)
```
- 版本控制之Git简介
- Git工作流程
- Git工作区、暂存区、版本库
- Git 指令汇总
- Git 忽略文件规则 .gitignore
- pull request
- HTTP简介
- HTTP - Keep-Alive
- HTTP缓存
- XMLHttpRequest
- Fetch
- 跨域
- HTTP 消息头
- TCP/IP
- TCP首部
- IP首部
- IP 协议
- TCP/IP漫画
- 前端开发规范
- 前端开发规范整理
- 前端未来规划
- HTML思维导图
- CSS思维导图
- 布局
- position,float,display的关系和优先级
- line-height、height、font-size
- 移动端适配
- JS 对象
- JS 原型模式 - 创建对象
- JS 预编译
- 探索JS引擎
- ES