天天看點

RFC1939-POP3協定中文版

1. 簡介

  對于在網絡上的比較小的結點,支援消息傳輸系統(MTS)是不實際的。例如,一台工作站可能不具有充足的資源允許SMTP伺服器和相當的本地郵件傳送系統保持序駐留,并持續運作。同樣的,将一台個人計算機長時間連接配接在IP類型網絡上的費用也是可觀的(結點缺少的資源被稱為"聯絡性")。

  雖然如此,在這樣的小結點上允許管理郵件是十分有用的,并且這些結點經常支援一個使用者代理來管理郵件。為解決這一問題,能夠支援MTS的結點就為這些不能支援的結點提供了郵件存儲功能。郵局協定-版本3就是使這樣的工作站可以用一種比較實用的方法來通路存儲于伺服器上的儲存郵件。通常,這意味着工作站可以從伺服器上取得郵件,而伺服器為它暫時儲存郵件。

  在下文中,客戶主機指的是利用POP3服務的主機,而伺服器主機指的是提供POP3服務的主機。

2. 簡單說明

  在此文檔中不指明客戶主機如何将郵件送入到傳送系統中去。但這裡有一個說明:當使用者代理需要将資訊送到傳送系統時,它在接力主機上建立SMTP連接配接(這些接力主機可以是POP3主機,也可以不是)。

 

3. 基本操作

  初始時,伺服器通過偵聽TCP端口110開始POP3服務。當客戶主機需要使用服務時,它将與伺服器主機建立TCP連接配接。當連接配接建立後,POP3發送确認消息。客戶和POP3伺服器互相(分别)交換指令和響應,這一過程一直要持續到連接配接終止。

  POP3指令由一個指令和一些參數組成。所有指令以一個CRLF對結束。指令和參數由可列印的ASCII字元組成,它們之間由空格間隔。指令一般是三到四個字母,每個參數卻可達40個字元長。

  POP3響應由一個狀态碼和一個可能跟有附加資訊的指令組成。所有響應也是由CRLF對結束。現在有兩種狀态碼,"确定" ("+OK")和"失敗" ("-ERR")。

  對于特定指令的響應是由許多字元組成的。在這些情況中,下面一一表述:在發送第一行響應和一個CRLF之後,任何的附加資訊行發送,他們也由CRLF對結束。當所有資訊發送結束時,發送最後一行,包括一個結束字元(十進制碼46,也就是".")和一個CRLF對。如果資訊中的任何一行以結束字元開始,此行就是通過在那一行預先裝入結束而進行字元填充的。是以,多行響應由五個CRLF.CRLF 結束。當檢測多行響應時,客戶檢測以确認此行是否以結束字元開始。如果是的,而且其後的字元不是CRLF,此行的第一個字元(結束字元)将被抛棄;如果其後緊跟CRLF,從POP伺服器來的響應終止,包括.CRLF 的行也不被認為是多行響應的一部分了。

  在生命周期中,POP3會話有幾個不同的狀态。一旦TCP連接配接被打開,而且POP3伺服器發送了确認資訊,此過程就進入了"确認"狀态。在此狀态中,客戶必須向POP3伺服器确認自己是其的客戶。一旦确認成功,伺服器就擷取與客戶郵件相關的資源,此時這一過程進入了"操作"狀态。在此狀态中,客戶提出服務,當客戶發出QUIT指令時,此過程進入了"更新"狀态。在此狀态中,POP3伺服器釋放在"操作"狀态中取得的資源,并發送消息,終止連接配接。

  POP3伺服器可以擁有一個自動登出的記時器。此記時器必須至少可以記錄10分鐘。這樣從客戶發送的消息才可能重新整理此記時器。當記時器失效時,POP3會話并不進入"更新"狀态,而是關閉TCP連接配接,而且不删除任何消息,不向客戶發送任何響應。

 

4. "确認"狀态

  一時TCP連接配接由POP3客戶打開,POP3伺服器發送一個單行的确認。這個消息可以是由CRLF結束的任何字元。例如,它可以是:

    S: +OK POP3 server ready

  注意:這個消息是一個POP3應答。POP3伺服器應該給出一個"确定"響應作為确認。

  此時POP3會話就進入了"确認"狀态。此時,客戶必須向伺服器證明它的身份。在文檔中介紹兩種可能的處理機制,一種是USER和PASS指令,另一種是在後面要介紹的APOP指令。

  用USER和PASS指令進行确認過程,客戶必須首先發送USER指令,如果POP3伺服器以"确認"狀态碼響應,客戶就可以發送PASS指令以完成确認,或者發送QUIT指令終止POP3會話。如果POP3伺服器傳回"失敗"狀态碼,客戶可以再發送确認指令,或者發送QUIT指令。

  當客戶發送了PASS指令後,伺服器根據USER和PASS指令的附加資訊決定是否允許通路相應的存儲郵件。

  一旦伺服器通過這些資料決定允許客戶通路儲存郵件,伺服器會在郵件上加上排它鎖,以防止在進入"更新"狀态前對郵件的改變。如果成功獲得了排它鎖,伺服器傳回一個"确認"狀态碼。會話進入"操作狀态",同時沒有任何郵件被标記為删除。如果郵件因為某種原因不能打開(例如,排它鎖不能獲得,客戶不能通路相應的郵件或者郵件不能進行文法分析),伺服器将傳回"失敗"狀态碼。在傳回"失敗"狀态碼後,伺服器會關閉連接配接。如果伺服器沒有關閉連接配接,客戶可以重新發送确認指令,重新開始,或者發送QUIT指令。

  在伺服器打開郵件後,它為每個消息指定一個消息号,并以八進制表示每個消息的長度。第一個消息被指定為1,第二個消息被指定為2,以此類推,第N個消息被指定為N。在POP3指令和響應中,是以的消息号和長度以十進制表示。

  下面是對上述三條指令的總結:

 

RFC1939-POP3協定中文版

 

RFC1939-POP3協定中文版

 

5. "操作"狀态

 

  一旦客戶向伺服器成功地确認了自己的身份,伺服器将鎖住并打開相應的郵件,這時POP3會話進入"操作"狀态。現在客戶可以重複下面的POP3指令,對于每個指令伺服器都會傳回應答。最後,客戶發送QUIT指令,會話進入"更新"狀态。

  下面是在"操作"狀态中可用的指令:

 

RFC1939-POP3協定中文版

 

RFC1939-POP3協定中文版

 

RFC1939-POP3協定中文版

 

RFC1939-POP3協定中文版

 

RFC1939-POP3協定中文版

    

6."更新"狀态

  當客戶在"操作"狀态下發送QUIT指令後,會話進入"更新"狀态。(注意:如果客戶在"确認"狀态下發送QUIT後,會話并不進入"更新"狀态。)

  如果會話因為QUIT指令以外的原因中斷,會話并不進入"更新"狀态,也不從伺服器中删除任何信件。

 

RFC1939-POP3協定中文版

 

7.可選的POP3指令

  以上讨論的指令是對POP3服務的最小實作。以下說明的可選指令允許客戶更友善地處理信件,這是一個比較一般的POP3服務實作。

  . TOP msg n

  【參數】一個是未被标記為删除的信件數,另一個是非負數(必須提供)

  【限制】僅在"操作"狀态下使用。

  【說明】

  如果伺服器傳回"确認",響應是多行的。在初始的+OK後,伺服器發送信件頭,一個空行将信件頭和信件體分開,對于多行響應要注意位元組填充終止符。

  注意:如果客戶要求的行數比信件體中的行數大,伺服器會發送整個信件。

  【響應】+OK:其後有信件頭;

  -ERR:其後無類似消息。

  【例子】

  C: TOP 1 10

  S: +OK

  S: <伺服器發送消息頭,一個空行和信件的頭10行>

  S: .

  ...

  C: TOP 100 3

  S: -ERR no such message

  . UIDL [msg]

  【參數】信件數(可選)。如果給出信件數,不包括被标記為删除的信件。

  【限制】僅在"操作"狀态下使用。

  【說明】

  如果給出了參數,且POP3伺服器傳回包括上述資訊的"确認",此行稱為資訊的"獨立-ID表"。

  如果沒有參數,伺服器傳回"确認"響應,此響應便以多行給出。在初的+OK後,對于每個信件,伺服器均給出相應的響應。此行叫做信件的"獨立-ID表"。

  為簡化文法分析,所有伺服器要求使用獨立-ID表的特定格式。它包括空格和信件的獨立-ID。

  信件的獨立-ID由0x21到0x7E字元組成,這個符号在給定的存儲郵件中不會重複。

  注意:信件不包括被标記為删除的信件。

  【響應】+OK:其後是獨立-ID表;

  -ERR:其後無類似信件。

  【例子】

  C: UIDL

  S: +OK

  S: 1 whqtswO00WBw418f9t5JxYwZ

  S: 2 QhdPYR:00WBw1Ph7x7

  S: .

  ...

  C: UIDL 2

  S: +OK 2 QhdPYR:00WBw1Ph7x7

  ...

  C: UIDL 3

  S: -ERR no such message, only 2 messages in maildrop

  . APOP name digest

  【參數】指定郵箱的字串和MD5摘要串。

  【限制】僅在POP3确認後的"确認"狀态中使用。

  【說明】通常,每個POP3會話均以USER/PASS互換開始。這導緻了使用者名和密碼在網絡上的顯式傳送,這不會造成什麼危險。但是,許多客戶經常連接配接到服務檢查信件。通常間隔時間比較短,這就加大了洩密的可能性。

另一種提供"确認"過程的方法是使用APOP指令。

  實作APOP指令的伺服器包括一個标記确認的時間戳。例如:在UNIX上使用APOP指令的文法為:[email protected],其中程序-ID是程序的十進制的數,時鐘是系統時鐘的十進制表示,主機名與POP3伺服器名一緻。

  客戶記錄下此時間戳,然後以送APOP指令。name文法和USER指令一緻。Digest是采用MD5算法産生的包括時間戳和共享密鑰的字串。此密鑰是客戶和伺服器共知的,應該注意保護此密鑰,如果洩密,任何人都能夠以使用者身份進入伺服器。

  如果伺服器接到APOP指令,它驗證digest,如果正确,伺服器傳回"确認",進入"操作"狀态;否則,給出"失敗"并停留在"确認"狀态。

  注意:共享密鑰的長度增加,解讀它的難度也相應增加,這個密鑰應該是長字元串。

  【響應】+OK:郵件鎖住并準備好;

  -ERR:拒絕請求。

  【例子】

  S: +OK POP3 server ready <[email protected]>

  C: APOP mrose c4c9334bac560ecc979e58001b3e22fb

  S: +OK maildrop has 1 message (369 octets)

  在此例子中,共享密鑰 <[email protected]>tanstaaf由MD5算法生成,它産生了digest值, c4c9334bac560ecc979e58001b3e22fb

8. POP3指令總結

基礎的POP3指令:

USER name 在"确認"狀态有效

PASS string

QUIT

 

STAT 在"操作"狀态有效

LIST [msg]

RETR msg

DELE msg

NOOP

RSET

 

QUIT 在"更新"狀态有效

 

可選的POP3指令:

APOP name digest 在"确認"狀态有效

TOP msg n 在"操作"狀态有效

UIDL [msg]

 

POP3 響應:

+OK

-ERR

 

注意:除了STAT,LIST和UIDL的響應外,其它指令的響應均為"+OK"和 "-ERR"。響應後的所有文本将被客戶略去。

9. POP3會話執行個體

S: <等待連接配接到TCP端口110>

C: <打開連接配接>

S: +OK POP3 server ready <[email protected]>

C: APOP mrose c4c9334bac560ecc979e58001b3e22fb

S: +OK mrose's maildrop has 2 messages (320 octets)

C: STAT

S: +OK 2 320

C: LIST

S: +OK 2 messages (320 octets)

S: 1 120

S: 2 200

S: .

C: RETR 1

S: +OK 120 octets

S: <伺服器發送信件1>

S: .

C: DELE 1

S: +OK message 1 deleted

C: RETR 2

S: +OK 200 octets

S: <伺服器發送信件2>

S: .

C: DELE 2

S: +OK message 2 deleted

C: QUIT

S: +OK dewey POP3 server signing off (maildrop empty)

C: <關閉連接配接>

S: <等待下一次連接配接>

 

10. 消息格式

  在會話過程中的消息格式都假定與Internet文本消息格式标準一緻。應該注意的是,由于各個伺服器對于換行符的處理不同,是以計數不一定相同。通常,在"确認"狀态中,伺服器能夠以八進制計算信件的大小。例如,如果在打開儲存郵件時伺服器内部認定換行符代表一個字元,一般伺服器在計算它時作為兩個字元計。注意,以終止符開始的消息行不被計數兩次,因為客戶将在接收到多行響應後删除所有位元組填充。

11. 安全性考慮

  可以推測,使用APOP指令可以提供會話期間的保護。相應的,同時實作PASS和APOP指令的伺服器隻允許使用者以一種方式通路;也就是說要麼使用USER/PASS組合,要麼使用APOP指令,不能同時使用兩個。

  而且,注意随着共享密鑰長度的增加,解讀的難度也就上升了。伺服器要提供使用者名時不給出任何響應,不給出任何暗示此使用者名是否正确。而密碼卻在網絡上顯式傳送;使用RETR和TOP指令在網絡上顯式傳送信件。