计算机网络是如何通信的「三」
一、Cookie和Session機制:無狀態下的會話
產生背景:
HTTP 是一個無狀態協議,無狀態是指協議對于事務處理沒有記憶能力,服務器不知道客戶端是什么狀態。即我們給服務器發送 HTTP 請求之后,服務器根據請求,會給我們發送數據過來,但是,發送完,不會記錄任何信息。這意味著每個請求都是獨立的。
缺點:缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次請求會傳輸大量重復的內容信息。
優點:在服務器不需要先前信息時它的應答就較快。解放了服務器,每一次請求“點到為止”不會造成不必要連接占用。
客戶端與服務器進行動態交互的 Web 應用程序出現之后,HTTP 無狀態的特性嚴重阻礙了這些應用程序的實現,畢竟交互是需要承前啟后的,簡單的購物車程序也要知道用戶到底在之前選擇了什么商品。于是,兩種用于保持 HTTP 連接狀態的技術就應運而生了,一個是 Cookie,而另一個則是 Session。
Cookie:
Cookie可以保持登錄信息到用戶下次與服務器的會話,換句話說,下次訪問同一網站時,用戶會發現不必輸入用戶名和密碼就已經登錄了(當然,不排除用戶手工刪除Cookie)。而還有一些Cookie在用戶退出會話的時候就被刪除了,這樣可以有效保護個人隱私。
Cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再次請求該網站時,瀏覽器把請求的網址連同該Cookie一同發送給服務器。服務器檢查該Cookie,以此來辨別用戶狀態。服務器還可以根據需要修改Cookie的內容。
Cookies 最典型的應用是判定注冊用戶是否已經登錄網站,用戶可能會得到提示,是否在下一次進入此網站時保留用戶信息以便簡化登錄手續,這些都是 Cookies 的功用。另一個重要應用場合是“購物車”之類處理。用戶可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些信息都會寫入 Cookies,以便在最后付款時提取信息。
?Session:
Session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端瀏覽器中,Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務端把客戶端信息以某種形式記錄在服務器上,這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。
提示:Session的使用比Cookie方便,但是過多的Session存儲在服務器內存中,會對服務器造成壓力。
Session的生命周期:Session生成后,只要用戶繼續訪問,服務器就會更新Session的最后訪問時間,并維護該Session。用戶每訪問一次,無論是否讀寫Session,服務器都認為該用戶的Session活躍(active)了一次。為防止內存溢出,服務器會把長時間沒有活躍的Session從內存中刪除。這個時間就是Session的超時時間。如果超過了超時時間沒有訪問過服務器,Session就自動失效。
Session需要使用Cookie作為識別標志。服務器先給客戶端瀏覽器發送一個名為JSESSIONID的Cookie,他的值為該Session的id(也就是HTTPSession.getId()的返回值)。Session依據Cookie來識別是否為同一用戶。
cookie和session的比較:
Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份,Session機制是通過檢查服務器上的“客戶明細表”來確認客戶身份。Session相當于程序在服務器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。
1、數據存放位置不同:
? ? cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2、安全程度不同:
? ? cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙,考慮到安全應當使用session。
? ? session的sessionID是放在cookie里,要想攻破session的話,第一要攻破cookie。攻破cookie后,你要得到 sessionID,sessionID是要有人登錄,或者啟動session_start才會有,你不知道什么時候會有人登錄。第二,sessionID是加密的,第二次session_start的時候,前一次的sessionID就沒有用了,session過期時sessionid也會失效,想在短時間內攻破加了密的 sessionID很難。session是針對某一次通信而言,會話結束session也就隨著消失了,而真正的cookie存在于客戶端硬盤上的一個文本文件,誰安全很顯然了。
3、性能使用程度不同:
? ? session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能,考慮到減輕服務器性能方面,應當使用cookie。
4、數據存儲大小不同:
? ? 單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie,而session則存儲與服務端,瀏覽器對其沒有限制。
5、會話機制不同
? ? session會話機制:session會話機制是一種服務器端機制,它使用類似于哈希表的結構來保存信息。
? ? cookies會話機制:cookie是服務器存儲在本地計算機上的小塊文本,并隨每個請求發送到同一服務器。 Web服務器使用HTTP標頭將cookie發送到客戶端。在客戶端終端,瀏覽器解析cookie并將其保存為本地文件,該文件自動將來自同一服務器的任何請求綁定到這些cookie。
二、長連接和短連接:無連接下的多次請求
HTTP是無連接的,無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。(早期這么做的原因是每個客戶端(即瀏覽器)與服務器之間交換數據的間歇性較大(即傳輸具有突發性、瞬時性),并且網頁瀏覽的聯想性、發散性導致兩次傳送的數據關聯性很低,大部分通道實際上會很空閑、無端占用資源。因此 HTTP 的設計者有意利用這種特點將協議設計為請求時建連接、請求完釋放連接,以盡快將資源釋放出來服務其他客戶端。)
短連接是指HTTP每次請求都會建立TCP連接,響應結束則斷開連接。
隨著時間的推移,網頁變得越來越復雜,里面可能嵌入了很多圖片,這時候每次訪問圖片都需要建立一次 TCP 連接就顯得很低效。
長連接是指HTTP利用TCP的保活機制,復用TCP連接,即在一次TCP連接中實現多次HTTP請求和響應。?
HTTP的長連接和短連接本質上是TCP長連接和短連接。
HTTP流水線技術:在一個TCP連接內(長連接),多個HTTP請求可以并行,下一個HTTP請求在上一個HTTP請求的應答完成之前就發起。
三、如果傳輸的文件過大怎么辦
服務器上返回的資源文件比較大,比如有些 js 文件大小可能就有幾兆。文件過大就會影響傳 輸的效率,同時也會帶來帶寬的消耗。怎么辦呢?
1. 常見的手段是,對文件進行壓縮,減少文件大小。那壓縮和解壓縮的流程怎么實現呢? 首先服務端需要能支持文件的壓縮功能,其次瀏覽器能夠針對被壓縮的文件進行解壓縮。瀏覽器可以指定 Accept-Encoding 來高速服務器我當前支持的編碼類型 Accept-Encoding:gzip,deflate 那服務端會根據支持的編碼類型,選擇合適的類型進行壓縮。常見的編碼方式有:gzip/deflate
2. 分割傳輸 在傳輸大容量數據時,通過把數據分割成多塊,能夠讓瀏覽器逐步顯示頁面。這種把實體主體分塊的功能稱為分塊傳輸編碼(Chunked Transfer Coding)。
?
總結
以上是生活随笔為你收集整理的计算机网络是如何通信的「三」的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Session一致性的解决方案
- 下一篇: 后端监控架构体系