日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

SMTP結構及原理

 king9413 2011-10-10
◆ smtp的基本結構
smtp (simple mail transfer protocol)協(xié)議是為了保證電子郵件的可靠和高效傳送。tcp/ip 協(xié)議的應用層中包含有smtp協(xié)議,但事實上它與傳輸系統(tǒng)和機制無關,僅要求一個可靠的數(shù)據(jù)流通道。它可以工作在tcp上,也可以工作在ncp, nits 等協(xié)議上。在tcp上,它使用端口25進行傳輸。smtp的一個重要特點是可以在可交互的通信系統(tǒng)中轉發(fā)郵件。

1. smtp的模型
smtp提供了一種郵件傳輸?shù)臋C制,當收件方和發(fā)件方都在一個網(wǎng)絡上時,可以把郵件直傳給對方;當雙方不在同一個網(wǎng)絡上時,需要通過一個或幾個中間服務器轉發(fā)。smtp首先由發(fā)件方提出申請,要求與接收方smtp建立雙向的通信渠道,收件方可以是最終收件人也可以是中間轉發(fā)的服務器。收件方服務器確認可以建立連接后,雙發(fā)就可以開始通信。下面是smtp的模型示意圖。



發(fā)件方smtp向收件方發(fā)處mail命令,告知發(fā)件方的身份;如果收件方接受,就會回答ok。發(fā)件方再發(fā)出rcpt命令,告知收件人的身份,收件方smtp確認是否接收或轉發(fā),如果同意就回答ok;接下來就可以進行數(shù)據(jù)傳輸了。通信過程中,發(fā)件方smtp與收件方smtp 采用對話式的交互方式,發(fā)件方提出要求,收件方進行確認,確認后才進行下一步的動作。整個過程由發(fā)件方控制,有時需要確認幾回才可以。



為了保證回復命令的有效,smtp要求發(fā)件方必須提供接收方的服務器及郵箱。郵件的命令和答復有嚴格的語法定義,并且回復具有相應的數(shù)字代碼。所有的命令由ascii碼組成。命令代碼是大小寫無關的,如mail和 mail ﹑mail是等效的。

2. smtp的基本命令
smtp定義了14個命令,它們是:

helo
mail from:
rcpt to:
data
rset
send from:
soml from:
saml from:
vrfy
expn
help [ ]
noop
quit
turn
其中使得smtp工作的基本的命令有7個,分別為:helo﹑mail﹑rcpt﹑data﹑rest﹑noop和quit.下面分別介紹如下。

helo--發(fā)件方問候收件方,后面是發(fā)件人的服務器地址或標識。收件方回答ok時標識自己的身份。問候和確認過程表明兩臺機器可以進行通信,同時狀態(tài)參量被復位,緩沖區(qū)被清空。

mail--這個命令用來開始傳送郵件,它的后面跟隨發(fā)件方郵件地址(返回郵件地址)。它也用來當郵件無法送達時,發(fā)送失敗通知。為保證郵件的成功發(fā)送,發(fā)件方的地址應是被對方或中間轉發(fā)方同意接受的。這個命令會清空有關的緩沖區(qū),為新的郵件做準備。

rcpt --這個命令告訴收件方收件人的郵箱。當有多個收件人時,需要多次使用該命令,每次只能指明一個人。如果接收方服務器不同意轉發(fā)這個地址的郵件,它必須報550錯誤代碼通知發(fā)件方。如果服務器同意轉發(fā),它要更改郵件發(fā)送路徑,把最開始的目的地(該服務器)換成下一個服務器。

data--收件方把該命令之后的數(shù)據(jù)作為發(fā)送的數(shù)據(jù)。數(shù)據(jù)被加入數(shù)據(jù)緩沖區(qū)中,以單獨一行是"."的行結束數(shù)據(jù)。結束行對于接收方同時意味立即開始緩沖區(qū)內的數(shù)據(jù)傳送,傳送結束后清空緩沖區(qū)。如果傳送接受,接收方回復ok。

rest--這個命令用來通知收件方復位,所有已存入緩沖區(qū)的收件人數(shù)據(jù),發(fā)件人數(shù)據(jù)和待傳送的數(shù)據(jù)都必須清除,接收放必須回答ok.

noop--這個命令不影響任何參數(shù),只是要求接收放回答ok, 不會影響緩沖區(qū)的數(shù)據(jù)。

quit--smtp要求接收放必須回答ok,然后中斷傳輸;在收到這個命令并回答ok前,收件方不得中斷連接,即使傳輸出現(xiàn)錯誤。發(fā)件方在發(fā)出這個命令并收到ok答復前,也不得中斷連接。

下面是smtp答復中用到的代碼和含義:

500 syntax error, command unrecognized
[this may include errors such as command line too long]
501 syntax error in parameters or arguments
502 command not implemented
503 bad sequence of commands
504 command parameter not implemented
211 system status, or system help reply
214 help message
[information on how to use the receiver or the meaning of a
particular non-standard command; this reply is useful only to the human user]
220 service ready
221 service closing transmission channel
421 service not available, closing transmission channel
[this may be a reply to any command if the service knows it must shut down]
250 requested mail action okay, completed
251 user not local; will forward to
450 requested mail action not taken: mailbox unavailable
[e.g., mailbox busy]
550 requested action not taken: mailbox unavailable
[e.g., mailbox not found, no access]
451 requested action aborted: error in processing
551 user not local; please try
452 requested action not taken: insufficient system storage
552 requested mail action aborted: exceeded storage allocation
553 requested action not taken: mailbox name not allowed
[e.g., mailbox syntax incorrect]
354 start mail input; end with .
554 transaction failed
最后,讓我們看一個rfc821中給出的例子。這封信是smith在主機alpha.arpa 發(fā)給主機beta.arpa上的
jones,green和 brown.并且假定兩臺主機在同一個網(wǎng)絡上。

s: mail from:
r: 250 ok
s: rcpt to:
r: 250 ok
s: rcpt to:
r: 550 no such user here
s: rcpt to:
r: 250 ok
s: data
r: 354 start mail input; end with .
s: blah blah blah...
s: ...etc. etc. etc.
s: .
r: 250 ok
郵件最后被對方接受。


◆ 電子郵件的工作原理


電子郵件與普通郵件有類似的地方,發(fā)信者注明收件人的姓名與地址(即郵件地址),發(fā)送方服務器把郵件傳到收件方服務器,收件方服務器再把郵件發(fā)到收件人的郵箱中。如下圖所示:



更進一步的解釋涉及到以下幾個概念:

mua -- mail user agent, 郵件用戶代理,幫助用戶讀寫郵件;

mta -- mail transport agent, 郵件傳輸代理,負責把郵件由一個服務器傳到另一個服務

器或郵件投遞代理;

mda -- mail delivery agent, 郵件投遞代理,把郵件放到用戶的郵箱里。

整個郵件傳輸過程如下:

目前使用的smtp 協(xié)議是存儲轉發(fā)協(xié)議,意味著它允許郵件通過一系列的服務器發(fā)送到最終目的地。服務器在一個隊列中存儲到達的郵件,等待發(fā)送到下一個目的地。下一個目的地可以是本地用戶,或者是另一個郵件服務器,如下圖所示。



如果下游的服務器暫時不可用,mta 就暫時在隊列中保存信件,并在以后嘗試發(fā)送。



◆ 電子郵件的信頭結構及分析

1 .郵件的結構
在最高層,郵件的結構是非常簡單的,用戶從終端機上看到的郵件格式一般為:

1. from: user1@domain1.com

2. to: user2@domain2.com

3. subject: explaination of mail format

4. date: thu, 1 apr 1999. 10:00:00 gmt

5. hi, jack

7. this mail is to explain you the mail format

8. - - - -

9. thanks

10. bob

其中, 1~~4 行稱作信件信頭(message header) 6~~10行描述信件要表達的內容,稱為信體 (message body)。第5行是空行,根據(jù)rfc822的要求,信頭和信體之間必須加入一空行。[i]信頭通常包含字段from, to, subject 和date,有的郵件還包含cc,bcc等字段。

2. 郵件的信頭

事實上,郵件在傳輸過程中,服務器要把它打包成一個數(shù)據(jù)對象,包括上面的信件和一個信封。郵件的投遞是依靠信封上的地址或信封信頭(envelop address 或envelop header),而不是上面講的信件上的地址。

從表面上看,一封郵件是從發(fā)件人的機器直接傳送到收件人的機器,但通常這并不正確,一封郵件發(fā)送和接受過程至少要經(jīng)過四臺計算機。參考下圖所示。用戶通常在自己的電腦前編寫閱讀郵件,我們把它叫做客戶端 (client 1~~4 )。大部分組織里,都是用一臺專門的機器處理郵件,稱作郵件服務器 (smtp1, smtp2). 如果用戶是從家里撥號上網(wǎng),那末郵件服務器是isp 提供的。



當某個用戶在自己的電腦 client1 前編寫完一個郵件,然后把它發(fā)送到他的isp 的郵件服務器smtp1。此時她的機器已經(jīng)完成了所有的工作,但郵件服務器smtp1還必須想法把郵件發(fā)送到目的地。smtp1 通過閱讀信頭或信封上的地址,找到收件認得郵件服務器smtp2, 然后與該服務器建立連接,把郵件發(fā)到收件人的服務器上,等待收件人來取閱。

下面我們將通過一個例子說明整個郵件傳送過程及郵件的信頭變化。假設發(fā)件人的名字叫 sender, email地址是 sender@domain1.com使用的電腦名字叫 client1, ip 地址是 [111.11.1.1] (假設的地址)。 收件人的名字叫 receipt, email 地址是 receipt@domain2.com, 使用的電腦的名字叫 client2,ip 地址是 [222.22.2.2] (假設的地址)。當郵件編輯完傳送給其郵件服務器mail.domain1.com 時,郵件的信頭格式為:

from: sender@domain1.com

to: receipt@domain2.com

date: tue, mar 18 1998 15:36:24 gmt

x-mailer:sendmail 8.9.0

subject: greetings

當郵件服務器 mail.domain1.com 把郵件傳到接收方的服務器 mail.domain2.com 時,接受方服務器會在信頭上記錄下有關的計算機信息,郵件的信頭變成:

received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004a21; tue, mar 18 1998 15:3 7:24 gmt

from: sender@domain1.com

to: receipt@domain2.com

date: tue, mar 18 1998 15:36:24 gmt

message-id:

x-mailer:sendmail 8.9.0

subject: greetings

當收件人服務器mail.domain2.com 把郵件接收并存初下來,等待收件人來閱讀時,郵件的信頭將會再加入一條記錄:

received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with esmtp id laa20869; tue, mar 18 1998 15:39:44 gmt

received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004a21; tue, mar 18 1998 15:37:24 gmt

from: sender@domain1.com

to: receipt@domain2.com

date: tue, mar 18 1998 15:36:24 gmt

message-id:

x-mailer:sendmail 8.9.0

subject: greetings

上面整個記錄就將是收件人看到的完整的郵件信頭。讓我們逐行看一下信頭中各行的含義:

received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with esmtp id laa20869; tue, mar 18 1998 15:39:44 gmt

這封信是從一臺自稱為 mail.domain1.com 的機器上接收的;這臺機器的ip 地址是[111.11.1.0],真實名字就是標稱名字 mail.domain1.com; 接收方的機器名稱是 mail.domain2.com, 運行的郵件服務器是 sendmail, 版本(8.8.5/8.7.2) 。接收方機器給郵件的編號是esmtp id laa20869, 接收到的時間是 tue, mar 18 1998 15:39:44 gmt。

received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004a21; tue, mar 18 1998 15:37:24 gmt

這條記錄表明信件是由機器client1.domain1.com ( ip 地址是 [111.11.1.1]) 在tue, mar 18 1998 15:37:24 gmt交給mail.domain1.com,并賦給編號id 004a21。

from,to ,date和subject 都易于理解,分別指明發(fā)件人,收件人,信件編輯日期及信件主題。

message-id:

這是由發(fā)件方郵件服務器賦給這封郵件的編號。與其它編號不同,這個編號自始至終跟隨郵件。


◆ open relay 的原理及測試

1.open relay 的原理

由于技術的原因,在80年代前,網(wǎng)絡還不是很健全,機器之間很少能直接對話發(fā)送郵件,人們必須得找出一條有效的連接通路來,然后信件沿著通路一步一步傳送到目的地。smtp協(xié)議中就明確指出當郵件在不同的網(wǎng)絡間傳送時,需要借助中間服務器的relay。

郵件在收件方和發(fā)件方之間會經(jīng)過毫不相干的第三方服務器,這就是郵件轉發(fā) (relay)。 如下圖所示:



圖中的 mail server 是可以對要求轉發(fā)的郵件進行限制的,如只轉發(fā)來自某個域的郵件或來自于某些ip 得郵件。如果轉發(fā)沒有任何限制,就被稱為 open relay 或 third party relay。
從歷史上看,relay 曾經(jīng)發(fā)揮過重要作用。而且當時這些工作主要靠手工來做,就像我們今天通過郵局發(fā)一封信一樣。假如我想從沈陽發(fā)一封信件到深圳,我再信封上寫好收信地址深圳,郵局就需要找到定義的運送路線: 沈陽,北京,鄭州,長沙,廣州,深圳。甚至還要長一些。其中很重要一點是每一個中繼站都能很好的理解這封信將被送到哪里,下一個接收站是誰。在電子郵件里,這就相當于每個中繼服務器清楚下一個服務起是誰,這就是郵件的轉發(fā)。

目前,正常郵件轉發(fā)已經(jīng)不再必要,相反,無限制轉發(fā)常常被發(fā)送垃圾郵件的人利用,隱藏真實的郵件來源,讓別人以為是從另外的isp 發(fā)出的信件;同時,也把大量的處理工作轉移到別人機器上。
由于前面提到的歷史的原因,最初的絕大多數(shù)郵件服務器都允許open relay的。今天,大部分郵件服務器升級版本已經(jīng)在缺省設置中關閉了open relay, 如sendmail 從8.9.3版本開始,exchange server從5.5版本開始關閉了open relay。有的服務器雖然沒有相應的升級版本,也都提供了關閉open relay 的方法,如在notes server的配置文件notes.ini 中加入一行:smtpmta_reject_relays=1。但由于很多服務器管理員的疏忽而沒能及時的修補這些安全漏洞,被利用來轉發(fā)垃圾郵件。

2. 如何確認郵件服務器是否relay

假設要測試的ip是202.112.0.0. 可以使用下列命令進行測試,文中的綠色斜題字為測試郵件服務器的反饋信息:

#telnet 202.112.0.0 25
trying 202.112.0.0...
connected to 202.112.0.0.
escape character is ^].
220 dns.ccert.edu.cn esmtp sendmail 8.11.1/8.11.1; sat, 30 jun 2001 21:07:10 +0800
helo mydomain
250 dns.ccert.edu.cn hello point.ccert.edu.cn [202.112.50.3], pleased to meet you
mail from:nobody@yahoo.com
250 2.1.0 nobody@#yahoo.com... sender ok
rcpt to:nobody@hotmail.com
550 5.7.1 nobody@hotmail.com... relaying denied

最后的relaying denied 表明該服務器已經(jīng)安全設置,不會再relay無關郵件了。如果顯示的結果是下面的樣子,這表明服務器可以轉發(fā)任何人的郵件。

rcpt to:nobody@hotmail.com
250 nobody@hotmail.com... recipient ok
data
354 enter mail, end with "." on a line by itself
this is a test of the relay
.
250 vaa00289 message accepted for delivery

除了用上面的命令行的方法測試外,下面的鏈接提供了一個測試工具,只需輸入ip即可。 http://www./relay.html

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多