{%hackmd DfWYF9cYREebVNN1eEOz-w %} HTTP 通訊協定基礎 ====== ###### tags: `http` `protocol` `HTTP 通訊協定基礎` `202205` 前言 --- [will 保哥的分享影片](https://www.youtube.com/watch?v=Taq5TV1K4XU) ## http 0.9 - 還沒有瀏覽器的時代 - 最早的 tcp/ip 協定 - 主要是取得網路上的靜態資源 - 只支援 GET ## http 1.0 - 第一步是建立與 Server 的連線 - 用戶端以 ASCII 發出請求,分別送出兩段內文(Request) - 第一段: 送出要求方法 - 第二段: 送出 Header - 最後有一個換行符號,作為此次請求的結尾。 - Server 端依據 Request 回復 Client(Response),回應的內容包含 - 狀態列(Status code) - Header - 回應內文(各種文檔如: html, image, jss ..) - 完成了一次 Request & Response 後就關閉此次 TCP/IP 連線 - Http 1.0 缺點 - 一個響應流程跑完即斷線 - 花在建立與關閉連線的時間其實是最久的 - 如果多次的請求,會花費很多成本在這。 ## http 1.1 - 與 1.0 的最大差異 - 持續連線狀態(persistent connection) - 切塊傳輸編碼(chunked encoding transfer) - 使用指定的壓縮方式,將大型資源做好切割並壓縮。 - 位元範圍請求(byte range request) - 專門處理大型檔案或串流檔案的資源時使用 - 快取機制(catch control) - 請求管線作業(request pipelining) - 最主要針對效能做優化 - 容易被阻斷攻擊,所以有些特殊情況可以關閉 web server 的持續連線狀態 - 2014年有根據 http1.1 額外整理出六大文件,主要依據以前的協定做更細的歸類。語意與內容 的分類較為重要(status code) - 常見的有 200, 201, 202 ... - 206 是代表 client 這次的請求適用 partial 取回內容 - 304 是代表此次是使用 client 上的快取 - client 如果要使用快取,需送出額外資訊讓 server 知道 - 該資源目前在 clent 上的過期日期 - 如果是對 chunk or byteRange,要先知道資源的大小有多大。 client 端會比較好做後續的規劃。(client 可使用 http method 的 HEAD 方法知道支援大小) ## HTTP 2.0 - 與 HTTP 1.1 主要差異 - 支援同步多工(Http 1.1 是同步的下載多個檔案) - 傳輸的資料格式支援 binary,讓傳輸的效能變得更好。(不用再做 html encoding,所以傳送的內容資料更精簡了) ## websocket - 常用於聊天機器人,也是持續連現狀台 - under 於 TCP/IP 所建立的另一個機制(不同於 TCP/IP 機制)