#### Keep-Alive
Keep-Alive是HTTP/1.0與HTTP/1.1提供的一種特性,意味著可以提供有效的HTTP會話,以避免客戶端頻繁的建立`TCP`鏈接。主要呢就包含圖中4步~

1. 建立`TCP`連接
2. 發送`HTTP`請求
3. 發送響應文檔
4. 釋放`TCP`連接
*****
如果按照HTTP/1.0早起的時候,其實還不支持`Keep-Alive`屬性,當時就是一種無狀態的`短連接`,后續更新后才給加上去的,而且還得手動加。到了HTTP/1.1時期,`Keep-Alive`就直接給默認加上去了,它的作用就是保持一種`長連接`。

1. 左圖是**并行短連接**
2. 右圖是**長連接**
* 短連接 - 每次請求一個資源就建立連接,請求完成后連接立馬關閉。
* 長連接 - 只建立一次連接,多次資源請求都復用該連接,完成后關閉。
---
#### **那為什么會有這個屬性呢?**
* 當時的互聯網還不怎么發達,電腦也不是特別普及,上網瀏覽的內容呢也是少之又少。如果長時間保持`TCP`的連接狀態將會耗費服務器端的大量資源。然后干脆就搞簡單點,就搞這種`短連接`的,瀏覽器對這種連接也有一定的并發最大數限制,Chrome的是6個,其他的2(IE6/7)-10(IE9)個不等。
* 隨著人類社會的發展,人們的需求日益增加,網頁內容也越來越豐富,交互的形式也越來越新花樣,新出的元素`img、script、css`等這些還要發起多次請求的怎么辦?然后HTTP/1.0就增加了一個`Keep-Alive`屬性,表示你只需要打開一次連接,多次資源訪問通過這次連接訪問就OK了,等到不需要的時候關閉就可以了。
*****

---
#### **那什么時候關閉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