HTTP與TCP的關係,無連接、無狀態詳解

Google了HTTP、TCP、無狀態三個關鍵詞,將首屏講得比較好的幾個博客內容做了一下整合,最主要引用:如何理解HTTP協議的 “無連接,無狀態” 特點?


HTTP與TCP的關係

TCP協議對應於傳輸層,而HTTP協議對應於應用層,從本質上來說,二者沒有可比性。HTTP協議是建立在TCP協議基礎之上的,當瀏覽器需要從服務器獲取網頁數據的時候,會發出一次HTTP請求。HTTP會通過TCP建立起一個到服務器的連接通道,當本次請求需要的數據完畢後,HTTP會立即將TCP連接斷開,這個過程是很短的。所以HTTP連接是一種短連接,是一種無狀態的連接。無狀態不代表HTTP不能保持TCP連接,更不能代表HTTP使用的是UDP協議(無連接)。


無連接

無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。


早期這麼做的原因是 HTTP 協議產生於互聯網,因此服務器需要處理同時面向全世界數十萬、上百萬客戶端的網頁訪問,但每個客戶端(即瀏覽器)與服務器之間交換數據的間歇性較大(即傳輸具有突發性、瞬時性),並且網頁瀏覽的聯想性、發散性導致兩次傳送的數據關聯性很低,大部分通道實際上會很空閒、無端佔用資源。因此 HTTP 的設計者有意利用這種特點將協議設計爲請求時建連接、請求完釋放連接,以儘快將資源釋放出來服務其他客戶端


隨着時間的推移,網頁變得越來越複雜,裏面可能嵌入了很多圖片,這時候每次訪問圖片都需要建立一次 TCP 連接就顯得很低效。後來,Keep-Alive 被提出用來解決這效率低的問題。


Keep-Alive 功能使客戶端到服務器端的連接持續有效,當出現對服務器的後繼請求時,Keep-Alive 功能避免了重新建立連接從HTTP/1.1起,默認都開啓了Keep-Alive,保持連接特性,簡單地說,當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。雖然這裏使用TCP連接保持了一段時間,但是這個時間是有限範圍的,到了時間點依然是會關閉的,所以我們還把其看做是每次連接完成後就會關閉。於提供靜態內容的網站來說,這個功能通常很有用。但是,對於負擔較重的網站來說,比如當Web服務器和應用服務器在同一臺機器上運行時,Keep-Alive 功能對資源利用的影響尤其突出。 


無狀態

無狀態是指協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。即我們給服務器發送 HTTP 請求之後,服務器根據請求,會給我們發送數據過來,但是,發送完,不會記錄任何信息。

HTTP 是一個無狀態協議,這意味着每個請求都是獨立的,Keep-Alive 沒能改變這個結果。

缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

HTTP 協議這種特性有優點也有缺點,優點在於解放了服務器,每一次請求“點到爲止”不會造成不必要連接佔用,缺點在於每次請求會傳輸大量重複的內容信息。

客戶端與服務器進行動態交互的 Web 應用程序出現之後,HTTP 無狀態的特性嚴重阻礙了這些應用程序的實現,畢竟交互是需要承前啓後的,簡單的購物車程序也要知道用戶到底在之前選擇了什麼商品。於是,兩種用於保持 HTTP 連接狀態的技術就應運而生了,一個是 Cookie,而另一個則是 Session。


Cookie可以保持登錄信息到用戶下次與服務器的會話,換句話說,下次訪問同一網站時,用戶會發現不必輸入用戶名和密碼就已經登錄了(當然,不排除用戶手工刪除Cookie)。而還有一些Cookie在用戶退出會話的時候就被刪除了,這樣可以有效保護個人隱私。

Cookies 最典型的應用是判定註冊用戶是否已經登錄網站,用戶可能會得到提示,是否在下一次進入此網站時保留用戶信息以便簡化登錄手續,這些都是 Cookies 的功用。另一個重要應用場合是“購物車”之類處理。用戶可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些信息都會寫入 Cookies,以便在最後付款時提取信息。


與 Cookie 相對的一個解決方案是 Session,它是通過服務器來保持狀態的。

當客戶端訪問服務器時,服務器根據需求設置 Session,將會話信息保存在服務器上,同時將標示 Session 的 SessionId 傳遞給客戶端瀏覽器,瀏覽器將這個 SessionId 保存在內存中,我們稱之爲無過期時間的 Cookie。瀏覽器關閉後,這個 Cookie 就會被清掉,它不會存在於用戶的 Cookie 臨時文件。

以後瀏覽器每次請求都會額外加上這個參數值,服務器會根據這個 SessionId,就能取得客戶端的數據信息。

如果客戶端瀏覽器意外關閉,服務器保存的 Session 數據不是立即釋放,此時數據還會存在,只要我們知道那個 SessionId,就可以繼續通過請求獲得此 Session 的信息,因爲此時後臺的 Session 還存在,當然我們可以設置一個 Session 超時時間,一旦超過規定時間沒有客戶端請求時,服務器就會清除對應 SessionId 的 Session 信息。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章