# HTTP
HTTP 分為 HTTP1.0 和 HTTP1.1 兩個版本。
## 生命周期
#### HTTP 1.0
HTTP 的生命周期通過 Request 來界定,也就是一個 Request 一個 Response ,那么在 HTTP1.0 中,這次HTTP請求就結束了。
#### HTTP 1.1
對 HTTP 1.0 進行了改進,使得有一個 keep-alive,也就是說,在一個HTTP連接中,可以發送多個Request,接收多個Response。
> 但是,Request = Response,在 HTTP 中永遠是這樣,也就是說一個 request 只能有一個 response。而且這個 response 也是被動的,不能主動發起。
## http 方式的實時獲取信息(仿 WebSOcket)
### http long poll
`long poll` 其實原理跟 ajax輪詢 差不多,都是采用輪詢的方式。
不過采取的是阻塞模型(一直打電話,沒收到就不掛電話),也就是說,客戶端發起連接后,如果沒消息,就一直不返回Response給客戶端。
直到有消息才返回,返回完之后,客戶端再次建立連接,周而復始。
### ajax 輪詢
ajax輪詢的原理非常簡單,讓瀏覽器隔個幾秒就發送一次請求,詢問服務器是否有新信息。
> 無論是 http long poll 還是 ajax 輪詢都是被動的,都是由客戶端不停的發起請求,都是非常消耗資源的。
> 不同的是,ajax輪詢 需要服務器有很快的處理速度和資源(速度)。 而,long poll 需要有很高的并發,也就是說同時接待客戶的能力。
> 而且,http連接是無狀態的,每次連接都是一個新的連接。
## HTTP1.0 和 HTTP1.1 和 HTTP2.0 的區別
### HTTP1.0 和 HTTP1.1 主要區別
- 長連接
HTTP 1.0需要使用keep-alive參數來告知服務器端要建立一個長連接,而HTTP1.1默認支持長連接。
HTTP是基于TCP/IP協議的,創建一個TCP連接是需要經過三次握手的,有一定的開銷,如果每次通訊都要重新建立連接的話,對性能有影響。因此最好能維持一個長連接,可以用個長連接來發多個請求。
- 節約帶寬
HTTP 1.1支持只發送header信息(不帶任何body信息),如果服務器認為客戶端有權限請求服務器,則返回100,否則返回401。客戶端如果接受到100,才開始把請求body發送到服務器。這樣當服務器返回401的時候,客戶端就可以不用發送請求body了,節約了帶寬。
另外HTTP1.1還支持傳送內容的一部分。這樣當客戶端已經有一部分的資源后,只需要跟服務器請求另外的部分資源即可。這是支持文件斷點續傳的基礎。
- HOST 域
現在可以web server例如tomat,設置虛擬站點是非常常見的,也即是說,web server上的多個虛擬站點可以共享同一個ip和端口。
HTTP1.0是沒有host域的,HTTP1.1才支持這個參數。
### HTTP1.1 和 HTTP2.0 主要區別
- 多路復用
HTTP2.0使用了多路復用的技術,做到同一個連接并發處理多個請求,而且并發請求的數量比HTTP1.1大了好幾個數量級。
當然HTTP1.1也可以多建立幾個TCP連接,來支持處理更多并發的請求,但是創建TCP連接本身也是有開銷的。
TCP連接有一個預熱和保護的過程,先檢查數據是否傳送成功,一旦成功過,則慢慢加大傳輸速度。因此對應瞬時并發的連接,服務器的響應就會變慢。所以最好能使用一個建立好的連接,并且這個連接可以支持瞬時并發的請求。
> 二進制分幀,在 應用層(HTTP/2)和傳輸層(TCP or UDP)之間增加一個二進制分幀層,在這個二進制分幀層,所有傳輸的消息被分為更小的消息和幀,并對它們采用二進制編碼,其中 http1.x的首部信息會被封裝到HEADER frame,而相應的 request body 則被封裝到 DATA frame 中。在建立連接之初,http2.0會限制連接的速度,當數據傳輸成功后,會逐步增大信息傳輸的速度。
- 數據壓縮
HTTP1.1不支持header數據的壓縮,HTTP2.0使用 `HPACK算法` 對header的數據進行壓縮,這樣數據體積小了,在網絡上傳輸就會更快。
- 服務器推送
意思是說,當我們對支持HTTP2.0的web server請求數據的時候,服務器會順便把一些客戶端需要的資源一起推送到客戶端,免得客戶端再次創建連接發送請求到服務器端獲取。這種方式非常合適加載靜態資源。
http1.x 服務端只能對一個請求發生一個 response,但是 http2.0 可以對一個 request 返回多個 response。
> HTTP2.0 [參考文章](https://imququ.com/post/http2-resource.html)
- 1. HTML
- 1.1 HTML 標簽
- 1.2 HTML 屬性
- 1.3 HTML5
- 2. CSS/CSS3
- 2.1 CSS3
- 2.2 Less
- 2.3 Sass
- 3. JavaScript
- 3.1 JQuery
- 3.2 javascript code
- 3.3 es6
- 4. 前端框架
- 4.1 Angular4+
- 4.2 React
- 4.3 Vue
- 5. 綜合知識
- 5.1 HTTP
- 5.2 websocket
- 5.3 綜合問題集合
- 5.4 前端優化
- 6. 附加知識
- 6.1 TCP/IP
- 6.2 數據結構
- 6.3 前端開發
- 7. 相關工具
- 7.1 Git
- 7.2 調試
- 7.3 Linux
- 8. 其他需要了解的內容
- 8.1 Python3
- 8.2 Java
- 8.3 數據庫