1、無狀態與有狀態的伺服器
伺服器維護的、跟進行中的用戶端互動活動有關的資訊稱為狀態資訊。不儲存狀態資訊的伺服器稱為無狀態服務器,反之稱為具狀態服務器。
對高效率的要求,促使設計者再伺服器內儲存狀態資訊。在伺服器中儲存少量資訊可以減少客戶和伺服器之間交換報文的大小,並使得伺服器快速相應請求。從本質上講,狀態資訊能讓伺服器記住用戶端以前的請求,並在新的請求到來時計算出漸進的相應。相比之下,採用無狀態服務器在於協議的可靠性:如果報文丟失、重複、傳送失序或者用戶端的電腦崩潰並重啟,狀態資訊就會出錯。如果伺服器在計算響應時使用了錯誤的狀態資訊,則有可能作出錯誤的響應。
在理想狀態下(即網路可靠傳輸所有的報文而且電腦永不崩潰),在伺服器中儲存每個進行中互動的狀態資訊可以減少報文的大小,並使處理更簡單。
一般來說,只有使用了複雜的協議解決了不可靠傳輸和系統重啟的問題,才能維護正確的狀態資訊。概括的說:
在實際的互連網中,機器有可能崩潰和重啟,報文可能丟失、延遲、重複或者傳送失序,採用有狀態的伺服器會導致應用協議的複雜,而這種協議是很難設計、理解和正確實現。
2、無狀態是一個協議問題
一個伺服器究竟是無狀態的還是有狀態的,這取決於應用協議而不是實現。如果應用協議規定某個報文的含義在某種程度上取決於先前的報文,那麼就不可能提供無狀態的互動。
從本質上講,無狀態的問題的焦點在於應用協議是否承擔可靠傳輸的責任。為了避免問題發生,確保互動的可靠性,應用協議的設計者必須確保每個報文絕無二義性。也就是說,報文既不能依賴是否被按序交付,也不能依賴先前已經被交付的報文。從本質上講,協議設計者必須確保:無論請求什麼時候到達以及到達幾次,伺服器都給出相同的相應。數學家用術語等冪(idempotent)來指一個總是產生相同結果的數學運算。用這個術語來稱呼這樣一些協議:無論報文到達幾次,它們都能確保伺服器給出相同的響應。
如果一個互連網中的下層網路可能使報文重複、延遲,或者傳送失序,或者運行客戶應用的電腦可能意外崩潰,那麼伺服器必須是無狀態的。如果應用協議被設計成各個操作是等冪的,則伺服器只能是無狀態的