HTTP會話原理解釋與應用

2021-08-02 15:45:58 字數 4396 閱讀 4047

**

一、什麼是會話

首先解釋一下什麼是會話。在計算機術語中,會話是指乙個終端使用者與互動系統進行通訊的過程,比如從輸入賬戶密碼進入作業系統到退出作業系統就是乙個會話過程。會話較多用於網路上,tcp的三次握手就建立了乙個會話,tcp關閉連線就是關閉會話。用平述的語言可以解釋為:你拔打你女友的**號碼,你女友接聽,然後一翻「親愛的」,直到任何一方掛掉**,這個過程就是乙個會話。你挑逗乙隻小狗,它跟你互動,也是會話;它不鳥你,那就不形成會話。

二、什麼是http會話

協議的狀態是指下一次傳輸可以「記住」這次傳輸資訊的能力,http是不會為了下一次連線而維護這次連線所傳輸的資訊的。從傳統web上看:無狀態是指,當瀏覽器傳送請求給伺服器的時候,伺服器響應,但是同乙個瀏覽器再傳送請求給伺服器的時候,他會響應,但是他不知道你就是剛才那個瀏覽器,簡單地說,就是伺服器不會去記得你,所以是無狀態協議。本質是:http1.0是短連線的(這裡先忽略http1.1的keep alive吧),請求響應後,斷開了tcp連線,下一次連線與上一次無關。為了識別不同的請求是否來自同一客戶,引用http會話機制,即:多次http連線間維護使用者與同一使用者發出的不同請求之間關聯的情況稱為維護乙個會話(session)。通過會話管理對會話進行建立、資訊儲存、關閉等。

三、http會話的實現機制

cookie與session是各種教材,網上文章所介紹到的與http會話相關的兩個內容。這種者較常見的解釋是:cookie存在在瀏覽器,session儲存在伺服器中。這種解釋是最顯淺的,很不嚴謹,但又不能說是錯誤。先從cookie談起吧,很久很久以前,為了完成http會話,那些網際網路的設計者們想到了乙個辦法,就是在瀏覽器中儲存使用者資訊,每次請求都向服務端傳送這些資訊,這樣服務端就知道請求傳送者是誰了,就知道應該返回什麼資訊給客戶了。但是問題很快就出現了,張三冒充李四的名字傳送請求給伺服器,伺服器把李四的相關資訊發給了張三。為了安全起見,網際網路老大哥們又想到了一招識別使用者身份的辦法,就是把客戶資訊儲存在服務端(session),一切使用者的身份由伺服器指定。直到目前,session已成功http會話的主流,應該說是絕對控制的地位。

session是怎樣做到會話身份識別的呢?首先,使用者端向服務端傳送乙個請求,服務端接收到請求(這裡忽悠無須會話控制的情況)後,初始化會話,生成相應的會話資訊,核心是會話id,把會話id傳送給客戶端,客戶端接收到這個會話id,把它儲存起來,下一次傳送請求的時候,附帶著這個會話id一起傳送給服務端,服務端只要根據這個會話id,就知道是誰了。這個會話id,就像我們的身份證號碼,一直伴隨終生。核心:服務端如何生成這個會話id,客戶端怎樣儲存這個會話id。

四、如何儲存會話id(session  id)

服務端儲存會話id有多種方式,常見的有本地儲存,如:普通文字,文字名就是會話id。對於檔案系統,同一目錄下,同一檔名只允許唯一乙個檔案,那麼使用會話id作為檔名是可以做到唯一確定會話的。除了本地檔案儲存,還可以使用memcache、redis、或者mysql之類的資料庫儲存,即使用第三方資料庫進行儲存。只有乙個原則:儲存的會話id必須是唯一的。

粗糙地,可理解為服務端返回給客戶端的會話id是儲存在cookie檔案中的。cookie檔案是由瀏覽器管理的,當然在自實現的客戶端中,可以通過程式設計手段實現cookie檔案管理,即客戶端會話的管理。舉例:ios開發者,可以把http返回的資訊頭儲存到沙盒中進行管理。php開發客戶端時,可以把資訊頭寫到檔案中,或第三方服務中,或網路儲存中等等。

五、會話管理(session)

會話管理包括:會話建立、會話識別、會話資訊操作、會話生命週期、會話關閉。

注意:這一節中的服務端會話都看作是開啟的,無特別情況不再交待。

1、  會話建立

客戶端發起不帶會話id(session id)的http請求,服務端認為還沒產生會話,即建立會話,生成會話id並且在伺服器中儲存相關會話資訊,並通知客戶端已開啟會話。一般情況下,是在返回給客戶端的http  header中的cookie項中附帶上會話id,形式為:會話標記:會話id。客戶端根據返回的資訊頭,設定本地cookie值並儲存。

2、  會話識別

會話id是會話的唯一識別符號,乙個會話id只會對應乙個會話,就像身份證號碼只對應乙個人一樣。http中,服務端是被動接受請求的,會話識別也是被動的(觸發式)。服務端不需要知道傳送請求的到底是誰,只需要知道對方傳送過來的會話id,把客戶端傳過來的會話id與服務端儲存的會話id進行匹配。找不到這個會話id,就認為這個會話是不存在的。

舉例:伺服器有個會話id是「21412545jladfjljljqwr」,對映的值是「名字:張三,性別:男」。客戶端只要請求中的會話id是「21412545jladfjljljqwr」,就識別到這個會話了,能認為這人是張三,而且是男性。如果客戶端請求的會話id是「qwesadfasdfadsfasdf」,即使客戶端附帶了資訊「名字:張三,性別:男」,服務端都認為不存在此人,不形成會話。就算是李四盜用了張三的會話id,服務端也會識別這個會話。

可簡單理解為:session只根據session id建立起會話,是不負責安全校驗的,只負責讓服務端與客戶端可以「通話」。

3、  會話資訊操作

服務端:會話id對映資訊,id不變,對映的內容可變

客戶端:會話id對映資訊,id不變,對映的內容可變(即存在在cookiek中的內容可變)。

服務端與客戶端的會話資訊只有會話id是必須相同的,其它會話資訊(即會話id對映的資訊)沒有直接關係。

4、  會話生命週期

會話從開始到結束就是會話的生命週期。設定乙個時間,這個時間內無通訊就清除會話資訊,我們就把這個時間叫做會話超時週期。

習慣地,我們把會話超時週期叫做會話的生命週期,其實這是兩個概念。

5、  會話關閉

會話關閉,有2種方式。一種是使用者主動清除會話資訊,另一種是會話超時。會話超時不是守護任務(或自動任務)週期性檢查處理的,而是訪問會話資訊時,根據會話資訊中的「上一次更新時間」到現在的時間差,與會話週期比較,超出週期的,清除會話資訊,即會話關閉。

經典例子:會話過程中,突然斷網。

六、會話校驗與http協議冪等性

http冪等性簡述:

從定義上看,http方法的冪等性是指一次和多次請求某乙個資源應該具有同樣的***。冪等性屬於語義範疇,正如編譯器只能幫助檢查語法錯誤一樣,http規範也沒有辦法通過訊息格式等語法手段來定義它,這可能是它不太受到重視的原因之一。但實際上,冪等性是分布式系統設計中十分重要的概念,而http的分布式本質也決定了它在http中具有重要地位。

舉個例子(摘抄網上):假設有乙個從賬戶取錢的遠端api(可以是http的,也可以不是),我們暫時用類函式的方式記為:bool withdraw(account_id, amount)。請求服務端,減小account_id的amount金額,成功返回true;失敗金額不變,返回false。

如果服務端成功了,並返回true,但網路中斷,客戶端收不到資訊,客戶端認為取錢失敗,再次請求,服務端再一次扣費。這裡就涉及乙個重複請求同一操作的問題了。

要解決這個問題,我們可以把withdraw設計為冪等的。create_ticket的語義是獲取乙個伺服器端生成的唯一的處理號ticket_id,它將用於標識後續的操作。idempotent_withdraw和withdraw的區別在於關聯了乙個ticket_id,乙個ticket_id表示的操作至多只會被處理一次,每次呼叫都將返回第一次呼叫時的處理結果。這樣,idempotent_withdraw就符合冪等性了,客戶端就可以放心地多次呼叫。

從上面例子可以看到create_cicket的作用是生成id識別碼,後續操作均基於此id。會話id本質上也是冪等性的,生成id後,後續操作均帶上id引數,即建立操作資訊與id的對應關係。上面的例子並不是安全的,只是確保了操作對於同乙個人(一次會話過程)是唯一的。同樣,會話id只作為身份唯一的識別,不是安全的保證。

簡單會話校驗:

一種較簡單的會話校驗是使用令牌,即請求中除了會話id,至少還攜帶了令牌。服務端對令牌校驗。令牌由服務端根據某種演算法生成,令牌校驗也在服務端中處理,客戶端只需儲存令牌,在請求中攜帶令牌,令牌生成演算法的複雜程度影響令牌校驗的安全性。

舉例:tokenfunc(param,value=』』)  第乙個引數為令牌生成引數,第二個引數為token值。當第二引數為空時,成生token,返回string;第二個引數不為空時,檢查token準確性 ,返回bool.  一般不需要解密,只要雜湊加密即可。php**如下:

function token($param,$value=』』)

$token = md5($param.』sault』);

if(!empty($value))else

}else

}生成令牌:$token = token($session_id);

檢驗令牌:$check = token($session_id,$token);

七、會話原理的應用

瀏覽器預設是開啟cookie的,瀏覽器發起http請求時,在請求頭中帶有cookie資訊,只要服務端返回cookie中包含sessionid,在服務端根據sessionid即實現http會話,此過程對於前端開發者是透明的(即前端開發可以不關心瀏覽器是怎樣與服務端確定會話的)。

http會話原理解釋與應用

FFT原理解釋

fft是離散傅利葉變換的快速演算法,可以將乙個訊號變換 到頻域。有些訊號在時域上是很難看出什麼特徵的,但是如 果變換到頻域之後,就很容易看出特徵了。這就是很多訊號 分析採用fft變換的原因。另外,fft可以將乙個訊號的頻譜 提取出來,這在頻譜分析方面也是經常用的。雖然很多人都知道fft是什麼,可以用...

git原理解釋

工作區域 git本地有三個工作區域 工作目錄 working directory 暫存區 stage index 本地倉庫 repository或git directory 如果在加上遠端的git倉庫 remote directory 就可以分成四個工作區域。檔案在這四個區域之間的轉換關係如下。wo...

everything原理解釋與簡單實現。

外面疫情正嚴重,老師也還沒開始上課,我都在家宅了乙個多月了。實在是閒的無聊。學習?怎麼可能,學習是不可能學習的,這輩子都不可能學習的。前幾天,在和大佬聊天的時候,偶然聽說了乙個名叫everything的軟體,可以很方便的查詢電腦內的檔案位置,據說可以秒出結果。只不過只針對ntfs檔案系統的盤。在網上...