電子郵件是因特網上最為流行的應用之一
如同郵遞員分發投遞傳統郵件一樣
電子郵件也是異步的
也就是說人們是在方便的時候發送和閱讀郵件的
無須預先與別人協同
與傳統郵件不同的是
電子郵件既迅速
又易於分發
而且成本低廉
另外
現代的電子郵件消息可以包含超鏈接
HTML格式文本
圖像
聲音甚至視頻數據
我們將在本文中查看處於因特網電子郵件核心地位的應用層協議
但在深入討論這些協議之前
讓我們先概覽一下因特網郵件系統及其重要部件
下圖展示了因特網郵件系統的高層概貌
我們看到
該系統由三類主要部件構成:用戶代理
郵件服務器利簡單郵件傳送協議(simple Mail Transfer Protocol
簡稱SMTP)
我們將在這樣的上下文中說明每類部件:發信人A
ice給收傳人Bob發送一個電於郵件消息
用戶代理允許用戶閱讀
回復
轉寄
保存和編寫郵件消息(電子郵件的用戶代理有時稱為郵件閱讀器
不過我們在本文中避免使用這個說法)
Alice寫完電子郵件消息後
她的用戶代理把這個消息發送給郵件服務器
再由該郵件服務器把這個消息排入外出消息隊列中
當Bob想閱讀電子郵件消息時
他的用戶代理將從他在其郵件服務器上的郵箱中取得郵件
世紀
年代後期
圖形用戶界面(GUI)的電子郵件用戶代理變得流行起來
它們允許用戶閱讀和編寫多媒體消息
當前流行的用戶代理包括Ootlook
foxmail等
公共域中還有許多基於文本的電於郵件用戶代理
包括mail
pine和elm
圖 因特網電子郵件系統概貌 郵件服務器構成了電子郵件系統的核心
每個收信人都有一個位於某個郵件服務器上的郵箱(mailbox)
Bob的郵箱用於管理和維護已經發送給他的郵件消息
一個郵件消息的典型旅程是從發信人的用戶代理開始
游經發信人的郵件服務器
中轉到收信人的郵件服務器
然後投遞到收信人的郵箱中
當Bob想查看自己的郵箱中的郵件消息時
存放該郵箱的郵件服務器將以他提供的用戶名和口令認證他
Alice的郵件服務器還得處理Bob的郵件服務器出故障酌情況
如果Alice的郵件服務器無法把郵件消息立即遞送到Bob的郵件服務器
A
ice的服務器就把它們存放在消息隊列(message queue)中
以後再嘗試遞送
這種嘗試通常每
分鐘左右執行一次:要是過了若干天仍未嘗試成功
該服務器就把這個消息從消息隊列中去除掉
同時以另一個郵件消息通知發信人(即Alice)
簡單郵件傳送協議(SMTP)是因特網電子郵件系統首要的應用層協議
它使用由TCP提供的可靠的數據傳輸服務把郵件消息從發信人的郵件服務器傳送到收信人的郵件服務器
跟大多數應用層協議一樣
SMTP也存在兩個端:在發信人的郵件服務器上執行的客戶端和在收信人的郵件服務器上執行的服務器端
SMlP的客戶端和服務器端同時運行在每個郵件服務器上
當一個郵件服務器在向其他郵件服務器發送郵件消息時
它是作為SMTP客戶在運行
當一個郵件服務器從其他郵件服務器接收郵件消息時
它是作為SMTP服務器在運行
SMTP SMTP在RFC
中定義
它的作用是把郵件消息從發信人的郵件服務器傳送到收信人的郵件服務器
SMIP的歷史比HTTP早得多
其RFC是在
年編寫的
而SMTP的現實使用又在此前多年就有了
盡管SMTP有許多奇妙的品質(它在因特網上的無所不在就是見證)
但卻是一種擁有某些
古老
特征的傳統戰術
例如
它限制所有郵件消息的信體(而不僅僅是信頭)必須是簡單的
位ASCII字符格式
這個限制在
世紀
年代早期是有意義的
當時因特網傳輸能力不足
沒有人在電子郵件巾附帶大數據量酌圖像
音頻或視頻文件
然而到了多媒體時代的今天
這個限制就多少顯得局促了——它迫使二進制多媒體數據在文由SMTP傳送之前首先編碼成
位ASCII文本;SMTP傳送完畢之後
再把相應的
位ASCII文本郵件消息解碼成二進制數據
HTTP不需要對多媒體數據進行這樣的編碼解碼操作
下面我們通過查看一個常見的情形來說明SMTP的基本操作
假設Alice給Bob發送一個簡單的ASCII文本郵件消息:
●Alice調用自己的電子郵件用戶代理
給出Bob的電子郵件地址(譬如說bob@someschool
edu)
寫好郵件內容
然後讓用戶代理發送本郵件消息
●Alice的用戶代理把該郵件消息發送到她的郵件服務器中
由郵件服務器把該消息排人某個消息隊列中
●運行在A
ice的郵什服務器上的SMTP客戶端看到消息隊列中的這個郵件消息後
打開一個到運行在Bob的郵件服務器主機上的SMTP服務器端的TCP連接
●經過最初的一些SMTP握手之後
SMTP客戶把A
ice的郵件消息發送到TCP連接上
●在Bob的郵件服務器主機上
SMTP服務器收到這個郵件消息後
把這個消息投遞到Bob的郵箱中
●Bob在方便的時候調用自己的電子郵件用戶代理閱讀該郵件消息
圖
展示了上述情形
圖 alice的郵件服務器把郵件消息傳送到Bob的郵件服務器 需注意的是
SMTP通常不使用中間的郵件服務器主機中轉郵件
即便源端和目的端郵件服務器主機位於地球上相反的位置也一樣
假設Aiice的郵件服務器主機在香港
Bob的郵件服務器主機在阿拉巴馬州
那麼所建立的TCP連接將是這兩台服務器主機之間的連接
具體地說
如果Bob的郵件服務器不工作了
那麼A
ice發給Bob的郵件消息將存留在Alice的郵件服務器中等待新的嘗試
而不會存放到某個中間的郵件服務器中
下面查看SWPT把郵件消息從發送端郵件服務器傳送到接收端郵件服務器的具體過程
我們將看到
SMTP協議與人們用於面對面交互的禮儀之間有許多相似之處
首先
運行在發送端郵件服務器主機上的SMTP客戶
發起建立一個到運行在接收端郵件服務器主機上的SMTP服務器端口號
之間的TCP連接
如果接收郵件服務器當前不在工作
SMTP客戶就等待一段時間後再嘗試建立該連接
這個連接建立之後
SMTP客戶和服務器先執行一些應用層握手操作
就像人們在轉手東西之前往往先自我介紹那樣
SMTP客戶和服務器也在傳送信息之前先自我介紹一下
在這個SMTP握手階段
SMTP客戶向服務器分別指出發信人和收信人的電子郵件地址
彼此自我介紹完畢之後
客戶發出郵件消息
SMTP可以指望由TCP提供的可靠數據傳輸服務把該消息無錯地傳送到服務器
如果客戶還有其他郵件消息需發送到同一個服務器
它就在同一個TCP連接上重復上述過程;否則
它就指示TCP關閉該連接
讓我們看一個客戶(C)和服務器(S)交互的例子
客戶所在主機名為crepes
fr
服務器所在主機名為hamburger
edu
前面標以
C:
的ASCII文本行是客戶發送到它的TCP套接字中的完整文本行
前面標以
S:
的ASCII文本行是服務器發送到它的TCP套接字中的完整文本行
以下傳輸腳本在TCP連接建立之後馬上發生:
S:
hamburger
edu
C:HELO crepes
fr
S:
Hello crepes
fr
pleased to meet you
C:MAIL FROM:
S:
alice@crepes
fr
Serder OK
C:RCPT TO:
S:
bob@hamburger
edu
Recipient OK
C:DATA
S:
Enter mail
end with
on a line by its self
C:Do you like ketchup?
C:How about pickles?
C:
S;
Message accepted for delivery
C:QUIT
S:
hamburger
edu cloing connection
在這個例子中
客戶發送了一個從郵件服務器主機crepes
fr到hamburger
edu的郵件消息
信體內容為:
Do you like ketchup?How about pickles?
客戶總共發出了
個命令
分別為:HELO
MAIL FROM
RCPT TO
DATA和QUIT
這些命令的含義是不言自明的
服務器給每個命令發回應答
其中每個應答都由應答碼和一些英語解釋(可選)構成
這裡需指出的是
SMTP使用持久連接
也就是說
如果發送郵件服務器有多個郵件消息需發送到同一個接收郵件服務器
那麼所有這些消息可以在同一個TCP連接中發送
對於其中的每一個消息
客戶以一個新的
HELO crepes
fr
命令開始整個消息發送過程
但是QUIT命令要等到所有消息都發送完之後才發出
我們可以嘗試使用nc工具直接與SMTP服務器進行對話
首先指定使用SMTP端口號
連接到某台郵件服務器主機
這樣就在本地主機和該郵件服務器主機之間建立了一個SMTP使用的TCP連接
登錄完畢之後
應該立即收到來服務器的應答
接著就可以在合適的時刻依次發出現SMTP命令了
如果你連接到你朋友的
MTP服務器
就可以用這種方式向你的朋友發送郵件了(也就是說
不必使用郵件用戶代理)
當然你也可以使用更常見的telnet工具
不過我發現用telnet建立起連接後常會遇到一些輸入方面的問題
與HTTP的比較 我們簡單地比較一下SMTP和HTTP
這兩個協議都是用於從一台主機向另一台主機傳送文件;HTTP用於從web服務器向Web用戶代理(即浏覽器)傳送文件(或對象)
SMTP用於從一個郵件服務器向另一個郵件服務器傳送文件(也就是電子郵件消息)
在傳送文件時
SMTP和持久HTTP都使用持久連接
可見
這兩個協議具有一些共同的特征
不過它們之間的差別也是顯著的
首先
HTTP基本上是一個內拉式協議(pull protocol)——有人把信息上傳到web服務器中
用戶則在方便的時候使用HTTP把這些信息從服務器上拉過來
更確切地說
TCP連接是由想要接收文件的主機發起的
SMIP則基本上是一個外推式協議(pushProtoco
)——發送端郵件服務器把文件推送給接收端郵件服務器
更確切地說
TCP連接是由想要發送文件的主機發起的
SMTP和HTTP的第二個重要差別是
SMTP要求包括信體部分在內的每個郵件消息都是
位ASCII文本格式
另外
SMT
From:http://tw.wingwit.com/Article/os/fwq/201311/29826.html