淺顯易懂的前端知識點(二) HTTP協議基礎

2022-04-22 16:51:10 字數 4150 閱讀 7774

http 協議的初印象:

是基於 tcp/ip 協議的應用層協議,不涉及資料報的傳輸,主要規定了客戶端和伺服器之間的通訊格式,預設使用 80 埠。

是個弱智協議,客戶端發起請求以後,伺服器只能返回 html 格式的字串,不能回應別的格式。

只有乙個 get 命令:

get /index.html
上面命令表示,tcp 連線(connection)建立後,客戶端向伺服器請求(request)網頁 index.html。

伺服器傳送完畢,就關閉 tcp 連線。

與 0.9 版本相比,有以下幾點變化:

除了 get,post、head 這兩個命令都可以用,瀏覽器和伺服器的互動手段增加了。

http 請求和回應的格式也變了。每次通訊都必須包括頭資訊,用來描述一些元資料。

新增的功能還有:

2.1 請求形式:

accept:*/*

2.2 回應格式

其中,頭資訊的第一行是 「協議的版本 + 狀態碼(status code) + 狀態描述」

2.3 content-type 字段

content-type 欄位的作用是告訴客戶端從服務端返回的資料是什麼格式。

常見的 contenttype:

資料型別的構成包括一級型別和二級型別,中間用斜槓隔開。這些型別都被稱為 mime type。

mime type 不僅用於 http 請求,也可以用於別的地方,比如 html 網頁。

2.4 資料壓縮

客戶端在請求的時候,用 accept - encoding 字段說明自己可以接受哪些壓縮方法。

accept-encoding: gzip, deflate
而伺服器使用 content-encoding 字段說明資料的壓縮方法。

content-encoding: gzip

content-encoding: compress

content-encoding: deflate

2.5 http/1.0 協議的缺點

每個 tcp 連線只能傳送乙個請求,資料傳送完畢連線就關閉了,如果要請求別的資源,必須再新建乙個連線。

但是 tcp 連線的成本很高,因為客戶端和伺服器的三次握手,並且啟動傳送的速率較慢。

有一些瀏覽器為了解決 tcp 會關閉的問題,採用了非標準的 connection 字段。

瀏覽器請求和伺服器回應都帶有這個字段:

connection: keep-alive
這樣的話,乙個可以復用的連線建立了,直到客戶端或者伺服器主動關閉連線。但是不同的瀏覽器實現不同,這不是乙個好的解決辦法。

3.1 持久連線

相比 1.0 版,1.1 版最大的變化是保持連線,即預設 tcp 連線不關閉,可以被多個請求復用,不用再宣告 connection: keep-alive。

那怎麼關閉呢?如果客戶端或者伺服器發現對方一段時間內沒有活動,就可以主動關閉連線。不過最好還是客戶端在傳送最後乙個請求的時候,傳送乙個 connection:close,明確要求伺服器關閉 tcp 連線。

另外,對於同乙個網域名稱,大多數瀏覽器允許同時建立 6 個持久連線。

3.2 管道機制

管道機制: 在同乙個 tcp 連線裡,客戶端可以同時傳送多個請求。

以前的做法是客戶端先傳送 a 請求,然後再傳送 b 請求。管道機制是允許瀏覽器同時傳送 a 請求和 b 請求,但是伺服器還是按照順序進行的,先回應 a 請求再回應 b 請求。

3.3 區分資料報

乙個 tcp 連線現在可以傳送多個回應,勢必就要有一種機制,區分資料報是屬於哪乙個回應的。

content-length 欄位的作用,宣告本次回應的資料長度。

content-length: 3495
上面的字段告訴客戶端,本次回應的長度是 3495 個位元組,後面的位元組就屬於下乙個回應了。

所以,使用 content-length 欄位的前提條件是,伺服器傳送回應之前,必須知道回應的資料長度。

而在 1.0 版本中,這個字段可以存在,也可以不存在,因為服務端關閉了 tcp 連線說明資料報已經全了。

3.4 其他功能

1.1 版新增了很多動詞方法:put、patch、head、options、delete。

客戶端的請求頭資訊增加了 host 字段,用來指定伺服器的網域名稱。

這個字段可以將請求發往同一臺伺服器的不同**。

如:

host: www.example.com
3.5 缺點

為了避免這個問題,只有兩種方法:一是減少請求數,二是同時多開持久連線。

所以產生了很多網頁優化技巧,比如合併指令碼和樣式表,將嵌入 css **,網域名稱分片等,但是 http 協議設計得更好的話,這些工作完全沒有必要做的。

2009 年,谷歌公開了自己搞的 spdy 協議,主要為了解決 http/1.1 效率不高的問題。

這個協議最終被當作了 http/2 的基礎。

http/2 協議不叫 http/2.0,這是因為標準委員會不在打算發布子版本,下乙個新的版本將會是 http/3。

5.1 二進位制協議

http 協議的頭肯定是文字(ascii 碼),資料體可以是文字,也可以是二進位制。

但 http/2 協議頭和資料體都是二進位制,是乙個徹徹底底的二進位制協議。

這裡的頭和資料體都換了乙個身份叫做 「幀」:頭資訊幀和資料幀。

二進位制協議的好處就是可以定義額外的幀,http/2 有近十種幀,為將來的高階應用打好了基礎,因為二進位制解析比文字解析更方便。

5.2 多工

http/2 協議復用 tcp 連線,也就是說客戶端和服務端可以同時傳送或者回應多個請求。

比如說,在乙個 tcp 裡,客戶端給服務端傳送了 a 和 b 兩個請求,按道理說應該先處理 a 請求,但是服務端發現 a 請求有點費勁兒,就先把 a 請求中處理好的發出去,接著回應 b 請求,完事兒以後再傳送 a 請求中剩下的部分。

像這樣雙向,實時的通訊,就叫做多工(multiplexing)。

5.3 資料流

http/2 的資料報不是按照順序傳送的,同乙個連線裡的資料報可能屬於多個請求。所以需要乙個編號,這個編號指明資料報屬於哪乙個請求或者回應。

這裡有乙個概念叫做資料流,我們把乙個請求或者回應的所有資料報合在一起稱為乙個資料流。每個資料流都有乙個獨一無二的編號,資料報傳送的時候都必須標定資料流編號。

客戶端請求的資料流編號一律為基數,而服務端回應的資料流編號為偶數。

在 http/1.1 中終止請求的方式只能是關閉 tcp 連線,而現在可以傳送乙個訊號:(rst_stream 幀),取消這個資料流。

也就是說 http/2 可以取消某一次請求,同時能保證 tcp 連線開啟,可以被其他請求所使用。

此外,客戶端可以指定資料流的優先順序,優先順序高的伺服器越早響應。

5.4 頭資訊壓縮

因為協議不帶有狀態,每次請求都必須附上所有資訊。有一些資訊是重複的,這樣會影響資料傳輸速度,浪費頻寬。

http/2 採用頭資訊壓縮機制可以減少不利影響。首先是將資訊壓縮後再傳送(gzip 或者 compress),其次是客戶端 和伺服器同時維護一張頭資訊表,這個表很神奇的地方在於可以利用索引進行管理,只要我們傳送索引就可以表示我們傳輸的資訊,這樣就能夠提高速度。

5.5 主動推送

http/2 允許伺服器在沒有經過允許的情況下,可以主動向客戶端推送資源 。這個過程叫做伺服器推送(server push)。

舉乙個例子,別傳送郵件給我們的時候,郵箱會冒個彈框出來告訴我們有人往郵箱裡投遞了一封郵件。注意,此時我們並沒有重新整理網頁。

伺服器推送還可能用到訊息提醒,靜態資源自動推送到服務端等場景。

淺顯易懂的委託

一 我對委託的理解 委託是方法的容器,它不生產方法,它只是方法的搬運工。委託這個詞用到程式設計裡面對於很多新人來說可能都不太好理解,以前剛接觸委託的時候也看過不少文章,對於這個詞的解釋大多都雲裡霧裡。但把 委託 換成 託付 對於它的理解可能會清晰不少。例如,劉備將兒子委託給了趙雲和劉備將兒子託付給了...

淺顯易懂的桶排序

想準備將所有的排序演算法都總結出來,方便你查閱,也方便我複習和記憶,下面來說桶排序 首先必須申明,桶排序和計數排序完全不同,不可混為一談 這裡例項用單鏈表來操作 還是老方法,看文字就是煩,直接上圖,結合,永遠都是王道 1.假設 桶待排序列 看了之後有沒有特莫感覺就是雜湊桶,哈哈,滿足一定條件差不多就...

python中yield的用法 淺顯易懂

def consumer name print s 準備吃包子啦 name while true baozi yield return返回的值.print 包子 s 來了,被 s 吃了 baozi,name c consumer 小華 print 華麗分割線1 print c.next print ...