HTTP協(xié)議無狀態(tài)中的 "狀態(tài)" 到底指的是什么?
閱讀本文大概需要 10?分鐘。
引子
正文
http協(xié)議無狀態(tài)中的【狀態(tài)】到底指的是什么?!
每一個(gè)訪問都是無連接,服務(wù)器挨個(gè)處理訪問隊(duì)列里的訪問,處理完一個(gè)就關(guān)閉連接,這事兒就完了,然后處理下一個(gè)新的 無連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接
協(xié)議對(duì)于事務(wù)處理沒有記憶能力【事物處理】【記憶能力】 對(duì)同一個(gè)url請(qǐng)求沒有上下文關(guān)系【上下文關(guān)系】 每次的請(qǐng)求都是獨(dú)立的,它的執(zhí)行情況和結(jié)果與前面的請(qǐng)求和之后的請(qǐng)求是無直接關(guān)系的,它不會(huì)受前面的請(qǐng)求應(yīng)答情況直接影響,也不會(huì)直接影響后面的請(qǐng)求應(yīng)答情況【無直接聯(lián)系】【受直接影響】 服務(wù)器中沒有保存客戶端的狀態(tài),客戶端必須每次帶上自己的狀態(tài)去請(qǐng)求服務(wù)器【狀態(tài)】
請(qǐng)求內(nèi)容沒有關(guān)系只可能是服務(wù)器上不存有用戶數(shù)據(jù)才可能啊,但是顯然是存有的啊 請(qǐng)求本身沒有關(guān)系,這又有什么意義呢,每一次的請(qǐng)求有什么價(jià)值?
服務(wù)器肯定為每個(gè)注冊(cè)用戶建立了數(shù)據(jù)表,記錄用戶的數(shù)據(jù) http是無連接的
用戶通過http把用戶的用戶名和密碼發(fā)送給服務(wù)器,服務(wù)器把他們跟自己存有的用戶資料對(duì)比,如果一致,則返回信息登錄成功
這個(gè)動(dòng)作相當(dāng)于輸入一個(gè)商品頁的網(wǎng)址 假如商品頁比較機(jī)密不對(duì)外公開,需要是用戶才能訪問 而雖然http能傳送用戶名和密碼,而且剛才也輸入了,還驗(yàn)證成功了,但是因?yàn)榉?wù)器既不會(huì)記得你登錄的狀態(tài),你的客戶端也不會(huì)存儲(chǔ)你剛才輸入的用戶名和密碼 所以因?yàn)檫@一次訪問因?yàn)闊o法確定你的身份,只能訪問失敗 這時(shí)候如果要解決這個(gè)問題,而且沒有cookie沒有session,那就只能你在訪問網(wǎng)址的同時(shí)繼續(xù)帶上你的用戶名和密碼(繼續(xù)輸入咯)其實(shí)就像我現(xiàn)在的APP一樣
這個(gè)動(dòng)作也相當(dāng)于輸入一個(gè)網(wǎng)址,網(wǎng)址的內(nèi)容是發(fā)送一個(gè)請(qǐng)求,往你的購物車中加入這個(gè)商品 系統(tǒng)首先用你傳來的用戶名和密碼驗(yàn)證你的身份,然后訪問你的數(shù)據(jù)庫,在其中的購物車屬性下加一條數(shù)據(jù),就是這個(gè)商品的數(shù)據(jù) 操作結(jié)束后,返回操作成功,并結(jié)束訪問
你每訪問一次需要權(quán)限的內(nèi)容都需要在客戶端輸入用戶名和密碼,這一項(xiàng)的繁瑣就不必贅述了 你的每一次操作都要與系統(tǒng)底層的數(shù)據(jù)庫進(jìn)行交互 多次少量的訪問存在非常大的性能浪費(fèi)。非常容易就能想到肯定是一次大量的操作更加有效率,于是就想到了緩存區(qū) 你的非重要瑣碎數(shù)據(jù)也被寫進(jìn)數(shù)據(jù)庫中,跟你的主要數(shù)據(jù)放在一起 一次次添加和刪除購物車其實(shí)只是跟你這次瀏覽,或者叫這次會(huì)話有關(guān),是臨時(shí)的數(shù)據(jù),跟用戶的主要信息無關(guān),它們沒什么價(jià)值,純粹的冗余數(shù)據(jù)(不排除現(xiàn)在有的公司覺得這種數(shù)據(jù)也有非常大的價(jià)值可以讓它們巧妙的利用),用什么存放這些臨時(shí)的數(shù)據(jù),我們也很容易想到緩存區(qū)
服務(wù)器上肯定存有用戶的數(shù)據(jù),你提交的增刪改查它也能夠處理,所以這句話中【服務(wù)器中沒有保存客戶端的狀態(tài)】的狀態(tài)并不是指用戶的數(shù)據(jù),我們的猜測(cè)不對(duì) 我們的質(zhì)疑對(duì)了,無狀態(tài)能實(shí)現(xiàn)購物車,可以通過服務(wù)器上存有的用戶數(shù)據(jù)來實(shí)現(xiàn) 但是,使用上面這種方式實(shí)現(xiàn)購物車,存在三個(gè)比較大的問題。由此,我們不禁會(huì)想,這三個(gè)問題的解決是不是跟我們不確切了解的【狀態(tài)】一詞有關(guān)?于是,接下來我們來通過解決這三個(gè)問題來把【狀態(tài)】的意義探尋下去
有了這個(gè)緩存區(qū)作為一個(gè)數(shù)據(jù)緩沖,就不用一次次地訪問數(shù)據(jù)庫,浪費(fèi)大量計(jì)算機(jī)資源,而是在最后統(tǒng)一歸入數(shù)據(jù)庫 有了這個(gè)緩存區(qū),你就不用把臨時(shí)的數(shù)據(jù)放到數(shù)據(jù)庫中了,只需要在你們交流告一段落之后,再把數(shù)據(jù)整理,把有用的數(shù)據(jù)歸入數(shù)據(jù)庫
給每個(gè)session一個(gè)ID,一方面用來方便自己查詢,另一方面把這個(gè)ID給用戶,用戶下一次訪問的時(shí)候就可以不用用戶名和密碼,而是直接使用這個(gè)ID來表明自己的身份 首先,這個(gè)ID安全嗎?這個(gè)ID比直接傳用戶名和密碼安全嗎? 不嚴(yán)格加密的sessionID和用戶名和密碼一樣,都不太安全 但是相比較來說,sessionID要安全一些 而使用https是完全安全的 你很容易會(huì)想到,本來用戶名和密碼的組合還特地設(shè)置地比較復(fù)雜,你這換一組數(shù)字就代替了,是不是太不安全了? 我們知道http協(xié)議本身是完全不加密的,如果使用用戶名和密碼,第一次訪問是放在http頭中,后邊自動(dòng)保存了密碼就會(huì)放在cookie中,這些都完全沒有加密,它的安全性基本為0,就是裸奔了,只要被竊取,那就丟失了 所以,就這個(gè)意義來講,sessionID的安全性跟使用用戶名和密碼沒什么區(qū)別 但是其實(shí),雖然http本身不能加密,但是有些軟件什么的,能在應(yīng)用層面手動(dòng)給你加密,比如QQ就會(huì)使用戶名密碼加臨時(shí)驗(yàn)證碼聯(lián)合哈希,sessionID加一個(gè)時(shí)間戳簡(jiǎn)單加密也是非常常用的方法 而且因?yàn)閟essionID本身有有效期,即使丟了,也可能很快失效,造成的損失可能沒那么大,而用戶名跟密碼丟了,那就大了 所以總結(jié)就是: 然后,使用sessionID有哪些好處 方便直接根據(jù)ID查詢用戶對(duì)應(yīng)的session 加密的時(shí)候計(jì)算量小 安全性不會(huì)降低,甚至還更高一些
忽然我想到一個(gè)問題:一個(gè)有狀態(tài)的http是什么樣的?
如果有狀態(tài)的意思是它的每次請(qǐng)求是有聯(lián)系的,那么有狀態(tài)的TCP的樣子是:假如一份數(shù)據(jù)分了三份TCP包發(fā)送,那這個(gè)包上面會(huì)標(biāo)明這是第幾個(gè)包,會(huì)標(biāo)明這個(gè)包跟那幾個(gè)包是有聯(lián)系的,有什么聯(lián)系
只有【每次http請(qǐng)求之間互相有聯(lián)系】這個(gè)條件,無法解決【每一次操作都要與系統(tǒng)底層的數(shù)據(jù)庫進(jìn)行交互】 因?yàn)楹苊黠@,要解決【每一次操作都要與系統(tǒng)底層的數(shù)據(jù)庫進(jìn)行交互】就必須在服務(wù)器端開辟一塊緩存區(qū) 不過如果你思考一下如何實(shí)現(xiàn)【每次http請(qǐng)求之間互相有聯(lián)系】,你就會(huì)發(fā)現(xiàn),它也需要在服務(wù)器端開辟一塊緩存區(qū) 所以【在服務(wù)器端開辟一塊緩存區(qū)】才是真正的條件,也就是說,它確實(shí)等價(jià)于【有狀態(tài)】 而且我也找到了這個(gè)【在服務(wù)器端開辟一塊緩存區(qū)】的條件跟前面那些官方對(duì)狀態(tài)的說法對(duì)應(yīng)的點(diǎn),那就是:
通過在服務(wù)器端開辟一塊緩存區(qū),存儲(chǔ)、記憶、共享一些臨時(shí)數(shù)據(jù),你就可以: 協(xié)議對(duì)于事務(wù)處理有記憶能力【事物處理】【記憶能力】 對(duì)同一個(gè)url請(qǐng)求有上下文關(guān)系【上下文關(guān)系】 每次的請(qǐng)求都是不獨(dú)立的,它的執(zhí)行情況和結(jié)果與前面的請(qǐng)求和之后的請(qǐng)求是直接關(guān)系的【不獨(dú)立】【直接關(guān)系】 服務(wù)器中保存客戶端的狀態(tài)【狀態(tài)】
所以,這個(gè)狀態(tài),加上前面說的客戶端也有cookie,就是指,客戶端和服務(wù)器在臨時(shí)會(huì)話中產(chǎn)生的數(shù)據(jù)!而前面也說道了,使用緩存區(qū)保存臨時(shí)會(huì)話中的數(shù)據(jù)是多么重要
所以狀態(tài)不僅包括不同URL訪問之間的關(guān)系,還有對(duì)其他URL訪問的數(shù)據(jù)記錄,還有一些其他的東西,所以更確切地說,狀態(tài)應(yīng)該是【實(shí)現(xiàn)了這些東西所憑借的后面的緩存空間】中的客戶的臨時(shí)數(shù)據(jù) cookie和session應(yīng)該是完全實(shí)現(xiàn)了有狀態(tài)這個(gè)功能
一種常見的對(duì)狀態(tài)的誤解:
有人在解釋HTTP的無狀態(tài)時(shí),把它跟有連接對(duì)立,說是兩種方式,也就是如果想不無狀態(tài),就必須有連接,但其實(shí)不然 有連接和無連接以及之后的Keep-Alive都是指TCP連接 有狀態(tài)和無狀態(tài)可以指TCP也可以指HTTP TCP一直有狀態(tài),HTTP一直無狀態(tài),但是應(yīng)用為了有狀態(tài),就給HTTP加了cookie和session機(jī)制,讓使用http的應(yīng)用也能有狀態(tài),但http還是無狀態(tài) 開始TCP是有連接,后來TCP無連接,再后來也就是現(xiàn)在TCP是Keep-Alive,有點(diǎn)像有連接。
微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?
評(píng)論
圖片
表情

