http://m.blog.csdn.net/bripengandre/article/details/2192111
POP3協議分析
第1章. POP3概述
POP3全稱為Post Office Protocol version3,即郵局協議第3版。它被用戶代理用來郵件服務器取得郵件。POP3采用的也是C/S通信模型,對應的RFC文檔為RFC1939。該協議非常簡單,所以我們只重點介紹其通信過程,而相關的一些概念和術語請參考RFC文檔或另外一篇文章《SMTP協議分析》
第2章. POP3詳解
2.1. 通信過程
用戶從郵件服務器上接收郵件的典型通信過程如下。
1) 用戶運行用戶代理(如Foxmail, Outlook Express)。
2) 用戶代理(以下簡稱客戶端)與郵件服務器(以下簡稱服務器端)的110端口建立TCP連接。
3) 客戶端向服務器端發出各種命令,來請求各種服務(如查詢郵箱信息,下載某封郵件等)。
4) 服務端解析用戶的命令,做出相應動作並返回給客戶端一個響應。
5) 3)和4)交替進行,直到接收完所有郵件轉到步驟6),或兩者的連接被意外中斷而直接退出。
6) 用戶代理解析從服務器端獲得的郵件,以適當地形式(如可讀)的形式呈現給用戶。
其中2)、3)和4)用POP3協議通信。可以看出命令和響應是POP3通信的重點,我們將予以重點講述。
2.2. 命令和響應
2.2.1. 格式
POP3的命令不多,它的一般形式是:COMMAND [Parameter] <CRLF>。其中COMMAND是ASCII形式的命令名,Parameter是相應的命令參數,<CRLF>是回車換行符(0DH, 0AH)。
服務器響應是由一個單獨的命令行組成,或多個命令行組成,響應第一行“+OK”或“-ERR”開頭,然后再加上一些ASCII文本。“+OK”和“-ERR”分別指出相應的操作狀態是成功的還是失敗的。
2.2.2. 三個狀態
POP3協議中有三種狀態,認正狀態,處理狀態,和更新狀態。 命令的執行可以改變協議的狀態,而對於具體的某命令,它只能在具體的某狀態下使用,這些請參看表1和RFC193。
客戶機與服務器剛與服務器建立連接時,它的狀態為認證狀態;一旦客戶機提供了自己身份並被成功地確認,即由認可狀態轉入處理狀態; 在完成相應的操作后客戶機發出QUIT命令(具體說明見后續內容),則進入更新狀態,更新之后又重返認可狀態;當然在認可狀態下執行QUIT命令,可釋放連接。狀態間的轉移如圖 1所示。
---建立連接---|認可|--認證成功--|處理|--執行QUIT--|更新|
|_______ -QUIT結束_________________|
圖 1 POP3的狀態轉移圖
認可狀態 |
處理狀態 |
更新狀態 |
建立連接 |
執行QUIT |
QUIT完畢 |
執行QUIT,釋放連接 |
認證成功 |
2.2.3. 一個例子
命令和響應的格式是語法,各命令和響應的意思則是語義,各命令和各響應在時間上的關系則是同步。我們還是通過以個簡單的POP3通信過程來說明協議的這三個要素。
C:telnet pop3.126.com 110 /* 以telnet方式連接126郵件服務器 */
S:+OK Welcome to coremail Mail Pop3 Server (126coms[3adb99eb4207ae5256632eecb8f8b4855]) /* +OK,代表命令成功,其后的信息則隨服務器的不同而不同*/
C:USER bripengandre /* 采用明文認證 */
S:+OK core mail
C:PASS Pop3world /* 發送郵箱密碼 */
S:+OK 654 message(s) [30930370 byte(s)] /* 認證成功,轉入處理狀態 */
C:LIST 1 /* 顯示第一封郵件的信息 */
S:+OK 1 5184 ./* 第一封郵件的大小為5184 字節 */
C:UIDL 1 /* 返回第一封郵件的唯一標識符 */
S:+OK 1 1tbisBsHaEX9byI9EQAAsd /* 數字1 后的長字符串就是第一封郵件的唯一標志符*/
C:RETR 1 /* 下載第一封郵件 */
S:+OK 5184 octets /* 第一封郵件的大小為5184字節 */
S:Receive… /* 第一封郵件的具體內容 */
S:…
C:QUIT /* 轉入更新狀態,接着再轉入認證狀態 */
S:+OK
C: QUIT /* 退出連接 */
S:+OK core mail /* 成功地退出了連接 */
對於上述的過程,補充如下幾點內容。
1) “C:”開頭的行(不包括"C:")是客戶端的輸入,而以“S:”開頭的行(不包括"S:")則是服務器的輸出。
2) 上述的命令並不一定會一次性成功,服務器會返回錯誤響應(以“-ERR”開頭),客戶端應該按照協議規定的時序,來輸入后續的命令(或重復執行失敗的命令,或重置會話,或退出會話等等)。
3) 上述過程是示意性的,實際過程可能與其有較大不同。例如,實際過程中可能使用加密認證(MD5摘要認證)。
4) RETR下載下來的郵件可能會難以看懂,這是因為其可能使用了quoted-printable編碼或base64編碼,我們可用Foxmail等用戶代理軟件來解碼它。
2.2.4. 常用命令和響應
SMTP命令不區分大小寫,但參數區分大小寫,有關這方面的詳細說明請參考RFC1939。常用的命令如表 1所示。
命令 |
參數 |
使用在何種狀態中 |
描述 |
USER |
Username |
認證 |
此命令與下面的pass命令若成功,將導致狀態轉換 |
PASS |
Password |
認證 |
此命令若成功,狀態轉化為更新 |
APOP |
Name,Digest |
認證 |
Digest是MD5消息摘要 |
STAT |
None |
處理 |
請求服務器發回關於郵箱的統計資料,如郵件總數和總字節數 |
UIDL |
[Msg#](郵件號,下同) |
處理 |
返回郵件的唯一標識符,POP3會話的每個標識符都將是唯一的 |
LIST |
[Msg#] |
處理 |
返回郵件的唯一標識符,POP3會話的每個標識符都將是唯一的 |
RETR |
[Msg#] |
處理 |
返回由參數標識的郵件的全部文本 |
DELE |
[Msg#] |
處理 |
服務器將由參數標識的郵件標記為刪除,由QUIT命令執行 |
TOP |
[Msg#] |
處理 |
服務器將返回由參數標識的郵件的郵件頭+前n行內容,n必須是正整數 |
NOOP |
None |
處理 |
服務器返回一個肯定的響應,用於測試連接是否成功 |
QUIT |
None |
處理、認證 |
1) 如果服務器處於“處理”狀態,么將進入“更新”狀態以刪除任何標記為刪除的郵件,並重返“認證”狀態。 2) 如果服務器處於“認證”狀態,則結束會話,退出連接 |
表 1 POP3的常用命令
至於響應則如2.2.1所述,由“+OK”或“-ERR”開頭,后跟一些可讀的說明和一些其它參數(對RETR,這個參數就是郵件的內容)。更詳細的說明請參考RFC1939。
第3章. POP3 VS IMAP
POP3相對於因特網報文存取協議IMAP(Internet Message Access Protocol)的最大的不足是:它只是一個脫機協議,客戶與服務器的交互性不是特別好。例如不能直接在郵箱中創建文件夾,不太好選擇性地下載郵件的某部分(雖然TOP命令部分地實現了這個功能,但交互性不是很好)等。然而,它也有自己的優勢,那就是協議簡單,容易實現,成本低,這是POP3用得很廣泛而IMAP幾近淘汰的最重要的原因。
第4章. 實現方案
ID |
Protocol |
Captured contents |
||||||
user name |
password |
sender |
receiver |
subject |
contents |
attachments |
||
5 |
POP3 |
√ |
√ |
√ |
√ |
√ |
√ |
|
表 2 POP3分析要求
表 2給出了協議分析要求。容易看出,獲取各個字段是比較容易的。我們可以抓取客戶端與服務器端的交互信息,然后根據各命令字或響應字來提取出我們想要的字段。例如,要獲取user name,對於明文驗證,我們只需檢測到客戶端的發送信息中出現USER這個時候,然后提取出USER命令后的參數即可。需要說明的是,雖然客戶端與服務端交互的信息可能經過了編碼或加密,但我們仍能夠通過解碼或解密來獲得所需要的信息。
第5章. 參考資料
[1] RFC文檔:RFC1939對應POP3協議,RFC821對應SMTP協議,RFC822對應郵件標准,RFC1425對應ESMTP,RFC1522對應郵件首部的擴充,RFC1521對應郵件正文的擴充
[2] http://www.faqs.org/rfcs/,上面有全面的英文RFC文檔
[3] http://www.cnpaf.net/,上面有不少有用的協議分析文檔,也有中文RFC文檔,但質量不是特別高
[4] Stevens, W.R., TCP/IP Illustrated, Vol1. Addision-Wesley, 機械工業出版社,2002