從HTTP說起,肆意漫談

2021-07-02 15:14:32 字數 1963 閱讀 3112

http (hypertext transfe protocol)超文字傳輸協議,是一種基於 tcp/ip 的網路協議。

http 是一種無狀態的協議,即 客戶端向伺服器發請求的時候伺服器不會儲存關於客戶的任何資訊,這樣即使這個客戶很快的再次請求同乙個資源的時候伺服器是不會認識他的,而是再次重新傳送這個資源。所以為了支援客戶端和伺服器的互動,引入了cookie 和 session 技術。

cookie 儲存在客戶端,session 儲存在伺服器端。

http 協議現在有兩個版本,http/1.0 和 http/1.1

它們的區別包括:

1 快取處理

2 頻寬優化及網路連線的使用

3 錯誤通知的管理

4 訊息在網路中的傳送

5 網際網路位址的維護

6 安全性及完整性

這裡可以說比較主要的一點區別就是 http/1.1 預設開啟了 keep-alive .

當使用 http/1.0 訪問乙個有很多資源 css js 的網頁時,客戶端的每乙個請求都需要重複建立連線和關閉連線,既造成了消耗有造成了延遲。

但是使用 http/1.1(開啟 keep-alive) 就可以在設定的時間內重複使用之前建立好的連線。即一次連線可以包含多次請求和響應。

我們可以通過瀏覽器檢視乙個請求消耗的時間。

也可以檢視請求頭資訊

可以看到設定了 connection: keep-alive ,同時可以看到 timeout設定為20秒

其實這裡的 keep-alive 設定的就是 http 長連線(持久連線),通過長連線我們可以使得訪問乙個網頁的速度提公升,減少伺服器的cpu消耗。

其實在使用瀏覽器訪問 web 頁面的時候請求資源是併發的操作。

rfc 文件對此連線數限制是兩個,但是不同的瀏覽器對此的限制並相同。

既然瀏覽器對於同乙個網域名稱的併發請求數量有限制那麼我們就可以通過將資源放到不同的網域名稱來提高訪問速度。

所以我們通常會需要另外的伺服器存放我們的 js css 等資源。

長連線也存在缺點, 那就是每次建立乙個長連線伺服器都要維護這個連線,從而消耗記憶體,所以 keep-alive 的timeout 時間也很重要

設定的過短,會重複的大量建立連線,給cpu造成壓力。設定過長,系統會堆積許多無用的http連線,消耗大量記憶體。

tcp 的keep alive 和 http 的keep alive 是不一樣的。 http 的keep alive 作用如上所述(讓連線活久一點,在一定時間內可重複使用)。

而tcp 的keep alive 是用來檢查當前的tcp連線是否還活著,例如當乙個tcp連線長時間沒有通訊的時候,一方會傳送

keep-alive包(心跳包),如果對方有回包則表明連線仍然有效則繼續維持。否則關閉連線。

其實我們可以把這裡的長短連線,模擬資料庫的長短連線。

例如 使用php 的pdo 連線資料庫

$pdo = new pdo($dsn, $dbuser, $dbpass);
建立 長連線

$db = new pdo($dsn, $user, $pass, array(

pdo::attr_persistent => true

));

短連線處理流程

連線 -> 資料傳輸 -> 關閉連線

長連線處理流程

連線 -> 資料傳輸 -> 保持連線 -> 資料傳輸 -> 保持連線 -> … -> 關閉連線

參考資料:

情感不能肆意揮霍

上個週末,她和丈夫一同去郊遊,豈料為了點小事兩人發生口角,結果敗興而歸。回到家,她又向丈夫發怨氣。過了會兒,她便把自己反鎖進了臥室,連續近10個小時,不吃也不喝。每次都是這樣,只要和丈夫鬧了彆扭,她就會用 絕食 的自殘方式來懲罰丈夫,最長的紀錄達23個小時。看著丈夫那副焦急 懺悔的樣子,她就打心底裡...

情感不能肆意揮霍

上個週末,她和丈夫一同去郊遊,豈料為了點小事兩人發生口角,結果敗興而歸。回到家,她又向丈夫發怨氣。過了會兒,她便把自己反鎖進了臥室,連續近10個小時,不吃也不喝。每次都是這樣,只要和丈夫鬧了彆扭,她就會用 絕食 的自殘方式來懲罰丈夫,最長的紀錄達23個小時。看著丈夫那副焦急 懺悔的樣子,她就打心底裡...

全程建模 UML被肆意亂用,怎麼可能解決問題

乙個剛剛發生的例子 某公司技術人員 老師,我這種層次依賴關係正確嗎?青潤21 27 11 這樣的邏輯圖沒有對錯之分,幾乎任何一種方式都有其適用的環境,所以,不能判斷。某公司技術人員 21 27 41 有場景是不是就能說明是否正確?青潤21 27 47 另外,uc不是按照這個來劃分的,你這個做的,有點...