如何理解HTTP協(xié)議的“無(wú)連接,無(wú)狀態(tài)”特點(diǎn)?
是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,HTTP 協(xié)議一共有五大特點(diǎn):1、支持客戶/服務(wù)器模式;2、簡(jiǎn)單快速;3、靈活;4、無(wú)連接;5、無(wú)狀態(tài)。
無(wú)連接
無(wú)連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。
早期這么做的原因是 HTTP 協(xié)議產(chǎn)生于互聯(lián)網(wǎng),因此服務(wù)器需要處理同時(shí)面向全世界數(shù)十萬(wàn)、上百萬(wàn)客戶端的網(wǎng)頁(yè)訪問,但每個(gè)客戶端(即瀏覽器)與服務(wù)器之間交換數(shù)據(jù)的間歇性較大(即傳輸具有突發(fā)性、瞬時(shí)性),并且網(wǎng)頁(yè)瀏覽的聯(lián)想性、發(fā)散性導(dǎo)致兩次傳送的數(shù)據(jù)關(guān)聯(lián)性很低,大部分通道實(shí)際上會(huì)很空閑、無(wú)端占用資源。因此 HTTP 的設(shè)計(jì)者有意利用這種特點(diǎn)將協(xié)議設(shè)計(jì)為請(qǐng)求時(shí)建連接、請(qǐng)求完釋放連接,以盡快將資源釋放出來(lái)服務(wù)其他客戶端。
隨著時(shí)間的推移,網(wǎng)頁(yè)變得越來(lái)越復(fù)雜,里面可能嵌入了很多圖片,這時(shí)候每次訪問圖片都需要建立一次 TCP 連接就顯得很低效。后來(lái),Keep-Alive 被提出用來(lái)解決這效率低的問題。
Keep-Alive 功能使客戶端到服務(wù)器端的連接持續(xù)有效,當(dāng)出現(xiàn)對(duì)服務(wù)器的后繼請(qǐng)求時(shí),Keep-Alive 功能避免了建立或者重新建立連接。市場(chǎng)上的大部分 Web 服務(wù)器,包括 iPlanet、IIS 和 Apache,都支持 HTTP Keep-Alive。對(duì)于提供靜態(tài)內(nèi)容的網(wǎng)站來(lái)說(shuō),這個(gè)功能通常很有用。但是,對(duì)于負(fù)擔(dān)較重的網(wǎng)站來(lái)說(shuō),這里存在另外一個(gè)問題:雖然為客戶保留打開的連接有一定的好處,但它同樣影響了性能,因?yàn)樵谔幚頃和F陂g,本來(lái)可以釋放的資源仍舊被占用。當(dāng)Web服務(wù)器和應(yīng)用服務(wù)器在同一臺(tái)機(jī)器上運(yùn)行時(shí),Keep-Alive 功能對(duì)資源利用的影響尤其突出。
這樣一來(lái),客戶端和服務(wù)器之間的 HTTP 連接就會(huì)被保持,不會(huì)斷開(超過 Keep-Alive 規(guī)定的時(shí)間,意外斷電等情況除外),當(dāng)客戶端發(fā)送另外一個(gè)請(qǐng)求時(shí),就使用這條已經(jīng)建立的連接。
無(wú)狀態(tài)
無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力,服務(wù)器不知道客戶端是什么狀態(tài)。即我們給服務(wù)器發(fā)送 HTTP 請(qǐng)求之后,服務(wù)器根據(jù)請(qǐng)求,會(huì)給我們發(fā)送數(shù)據(jù)過來(lái),但是,發(fā)送完,不會(huì)記錄任何信息。
HTTP 是一個(gè)無(wú)狀態(tài)協(xié)議,這意味著每個(gè)請(qǐng)求都是獨(dú)立的,Keep-Alive 沒能改變這個(gè)結(jié)果。
缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
HTTP 協(xié)議這種特性有優(yōu)點(diǎn)也有缺點(diǎn),優(yōu)點(diǎn)在于解放了服務(wù)器,每一次請(qǐng)求“點(diǎn)到為止”不會(huì)造成不必要連接占用,缺點(diǎn)在于每次請(qǐng)求會(huì)傳輸大量重復(fù)的內(nèi)容信息。
客戶端與服務(wù)器進(jìn)行動(dòng)態(tài)交互的 Web 應(yīng)用程序出現(xiàn)之后,HTTP 無(wú)狀態(tài)的特性嚴(yán)重阻礙了這些應(yīng)用程序的實(shí)現(xiàn),畢竟交互是需要承前啟后的,簡(jiǎn)單的購(gòu)物車程序也要知道用戶到底在之前選擇了什么商品。于是,兩種用于保持 HTTP 連接狀態(tài)的技術(shù)就應(yīng)運(yùn)而生了,一個(gè)是 Cookie,而另一個(gè)則是 Session。
Cookie可以保持登錄信息到用戶下次與服務(wù)器的會(huì)話,換句話說(shuō),下次訪問同一網(wǎng)站時(shí),用戶會(huì)發(fā)現(xiàn)不必輸入用戶名和密碼就已經(jīng)登錄了(當(dāng)然,不排除用戶手工刪除Cookie)。而還有一些Cookie在用戶退出會(huì)話的時(shí)候就被刪除了,這樣可以有效保護(hù)個(gè)人隱私。
Cookies 最典型的應(yīng)用是判定注冊(cè)用戶是否已經(jīng)登錄網(wǎng)站,用戶可能會(huì)得到提示,是否在下一次進(jìn)入此網(wǎng)站時(shí)保留用戶信息以便簡(jiǎn)化登錄手續(xù),這些都是 Cookies 的功用。另一個(gè)重要應(yīng)用場(chǎng)合是“購(gòu)物車”之類處理。用戶可能會(huì)在一段時(shí)間內(nèi)在同一家網(wǎng)站的不同頁(yè)面中選擇不同的商品,這些信息都會(huì)寫入 Cookies,以便在***付款時(shí)提取信息。
與 Cookie 相對(duì)的一個(gè)解決方案是 Session,它是通過服務(wù)器來(lái)保持狀態(tài)的。
當(dāng)客戶端訪問服務(wù)器時(shí),服務(wù)器根據(jù)需求設(shè)置 Session,將會(huì)話信息保存在服務(wù)器上,同時(shí)將標(biāo)示 Session 的 SessionId 傳遞給客戶端瀏覽器,瀏覽器將這個(gè) SessionId 保存在內(nèi)存中,我們稱之為無(wú)過期時(shí)間的 Cookie。瀏覽器關(guān)閉后,這個(gè) Cookie 就會(huì)被清掉,它不會(huì)存在于用戶的 Cookie 臨時(shí)文件。
以后瀏覽器每次請(qǐng)求都會(huì)額外加上這個(gè)參數(shù)值,服務(wù)器會(huì)根據(jù)這個(gè) SessionId,就能取得客戶端的數(shù)據(jù)信息。
如果客戶端瀏覽器意外關(guān)閉,服務(wù)器保存的 Session 數(shù)據(jù)不是立即釋放,此時(shí)數(shù)據(jù)還會(huì)存在,只要我們知道那個(gè) SessionId,就可以繼續(xù)通過請(qǐng)求獲得此 Session 的信息,因?yàn)榇藭r(shí)后臺(tái)的 Session 還存在,當(dāng)然我們可以設(shè)置一個(gè) Session 超時(shí)時(shí)間,一旦超過規(guī)定時(shí)間沒有客戶端請(qǐng)求時(shí),服務(wù)器就會(huì)清除對(duì)應(yīng) SessionId 的 Session 信息。