最近在研究協議狀態機,之前並沒有接觸過,寫這篇文章記錄一下協議狀態機的要點。如果有什么錯誤的地方,還請各位大佬指正。
定義
有限狀態機(finite-state machine,縮寫FSM),又叫有限狀態機自動機,簡稱狀態機。是能夠表示有限個狀態以及這些狀態之間的轉移和動作等行為的數學模型。在計算機科學中,有限狀態機被廣泛用於建模應用行為、硬件電路系統設計、軟件工程、編譯器、網絡協議和計算與語言的研究。本文主要研究的是協議狀態機,協議狀態機可以描述一個網絡協議的行為,幫助理解協議的行為邏輯。
協議狀態機的要素
一個協議狀態機可以用一個六元組來表示,M = (Q、s_0、δ、λ、X、Y)
Q:有限狀態集合,其中包含協議中的不同協議狀態
s_0 :初始狀態
δ:狀態轉移函數,δ(s_i,x) = s_ j,x∈X,表示從s_i出發,輸入x則轉移的狀態s_ j
λ:輸出函數,y = λ(s_i,x),x∈X,表示從狀態s_i出發,輸入x則得到響應y ,y∈Y
X:輸入字典
Y:輸出字典,包含狀態機會出現的所有響應
下面我們以SMTP協議為例子,具體的了解一下SMTP協議的狀態機
SMTP協議
首先我們簡單了解一下SMTP協議
SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)是用來傳輸電子郵件的一個協議,基於TCP協議,主要用於系統之間的郵件信息傳遞,並提供有關的來信通知。
SMTP有兩種工作情況:
- 用戶使用客戶機向發送方郵件服務器發送郵件
- 發送方郵件服務器向接受方郵件服務器發送郵件
SMTP是文本類協議:
SMTP是請求/響應協議,命令和響應都是基於ASCII文本,並且以CR和LF符結尾,響應包括一個表示返回狀態的三位數字代碼。
SMTP協議基於TCP:
SMTP是基於TCP協議的,並且在25號端口監聽鏈接請求。
SMTP命令
SMTP是基於C/S模式的,所以通信過程實質上就是客戶與服務器之間的請求和應答,這就涉及到一些請求和應答命令、狀態碼。下面是SMTP的一些基本命令集:
命令 | 描述 |
---|---|
HELO | 向服務器標識用戶身份信息,用戶可以進行欺騙攻擊,但是一般服務器都可以檢測到。 |
MAIL FROM: | 后面跟的是發送者郵箱地址,用來初始化郵件傳輸,即用來對所有的狀態和緩沖區進行初始化。 |
RCPT TO: | 后面跟的是接收者郵箱地址,用來標識接受者地址,常用在MAIL FROM之后,可以有多個RCPT TO |
DATA | 在單個或者多個RCPT TO 命令之后,表示所有接受者已經標識,並進行數據傳輸,數據傳輸以 ‘.’ 結束。 |
VRFY | 用於驗證指定的用戶/郵箱是否存在,由於安全問題通常會禁用此命令。 |
EXPN | 用於驗證給定的郵箱列表是否存在,擴充郵箱列表,該命令也常被禁用 |
HELP | 查詢服務器支持什么命令 |
NOOP | 無操作,服務器影響應OK |
QUIT | 結束會話 |
REST | 重置會話,當前傳輸被取消 |
因為SMTP是文本類協議,所以一般這些命令在報文中都以可打印的ASCII碼方式存在,我們可以根據這一點來提取出報文中的命令,將這些命令作為語義關鍵字,也就是SMTP協議狀態機六元組中的輸入X。
SMTP響應碼
響應碼 | 描述 |
---|---|
211 | 系統狀態或顯示系統幫助 |
214 | 幫助信息 |
220 | 服務就緒 |
221 | 服務關閉 |
250 | 要求的郵件操作完成 |
251 | 用戶非本地,將轉發向<forward-path> |
354 | 開始郵件輸入,以"."結束 |
421 | 服務未就緒,關閉傳輸信道 |
450 | 要求的郵件操作未完成,郵箱不可用 |
451 | 放棄要求的操作;處理過程中出錯 |
452 | 系統存儲不足,要求的操作未執行 |
500 | 命令格式錯誤,不可識別。當命令行太長時也會發生這樣的錯誤。 |
501 | 參數格式錯誤 |
502 | 命令不可實現 |
503 | 錯誤的命令序列 |
504 | 命令參數不可實現 |
551 | 用戶非本地,請嘗試<forward-path> |
552 | 過量的存儲分配,要求的操作未執行 |
553 | 郵箱名不可用,要求的操作未執行 |
554 | 操作失敗 |
SMTP協議的通信過程
SMTP協議正常的通信過程可以分為三個部分:
建立連接:
1. 客戶端通過25端口與服務端建立TCP連接,服務端返回應答碼220,並提供服務端的域名;
2. 客戶端收到應答碼,發送HELO命令,啟動SMTP會話,通過HELo命令,客戶端向服務端提供標識信息;
3. 服務端響應應答碼250,通知客戶端建立會話成功。
郵件傳送:
1. 客戶端發送“MAIL FROM”通知服務端發信人的郵箱與域名;
2. 服務端向客戶端響應“250”;
3. 客戶端發送“RCPT; TO”命令向服務端告知收信人的郵箱與域名;
4. 服務端向客戶端響應“250”;
5. 客戶端發送“DTAT”命令進行報文傳送初始化;
6. 服務端響應“354”,表示可以進行郵件輸入了;
7. 客戶端發送報文內容,每行以CR與LF終止,報文以只有一個“.”的行終止;
8. 服務端向客戶端響應“250”。
連接釋放:
1. SMTP客戶端發送“QUIT”命令;
2. 服務端響應“221”;
3. 關閉TCP連接。
SMTP協議狀態機
協議狀態機的構建步驟可以用下面的流程圖表示:
前面提到的SMTP命令都會出現在通信過程中的報文中,所我們把SMTP協議命令作為報文的協議關鍵字,然后包含對應的關鍵字的報文標記為不同類型的報文;吧SMTP狀態碼作為協議狀態機的狀態標記,不同的狀態碼代表不同的狀態,根據SMTP命令和狀碼構建狀態機,最后我得出了下面這個簡單的SMTP協議狀態機。
References