金笛邮件论坛  

返回   金笛邮件论坛 > 开发者乐园 > 电子邮件系统技术交流

回复
 
LinkBack 主题工具 显示模式
旧 2012-12-14, 15:22   #1 (permalink)
版主
 
注册日期: 2012-02-07
帖子: 281
默认 邮件工作原理

第一章 电子邮件的工作原理 <br>
<br>
<br>
1.互联网TCP/IP的基本结构<br>
<br>
今天的互联网(Internet)的原形是1969年建立的APARNET。在互联网发展史上具有决定意义的一件事是在1983年1月1日,APARNET正式转换成TCP/IP协议的网络。正是TCP/IP的出现,才使得互联网得以在全世界的范围内迅速发展并具有今天的规模。 <br>
根据TCP/IP协议,互联网分为4层,加上最底层的硬件层一共是5层:<br>
<br>
<br>
<br>
物理层:<br>
对应于网络的基本硬件,这也是Internet物理构成,即我们可以看得见的硬件设备,如PC机、互连网服务器、网络设备等,必须对这些硬件设备的电气特性作一个规范,使这些设备都能够互相连接并兼容使用。网络接口层:它定义了将数据组成正确帧的规程和在网络中传输帧的规程,帧是指一串数据,它是数据在网络中传输的单位。<br>
<br>
互联网层:<br>
本层定义了互联网中传输的“信息包”格式,以及从一个用户通过一个或多个路由器到最终目标?quot;信息包"转发机制。<br>
<br>
传输层:<br>
为两个用户进程之间建立、管理和拆除可靠而又有效的端到端连接。<br>
<br>
应用层:<br>
它定义了应用程序使用互联网的规程。电子邮件的SMTP 协议就建立在这一层。Internet 的核心层是网络层和传输层,相应的核心协议是IP协议和TCP协议。IP 协议的主要功能包括无连结数据报传送﹑数据报寻径以及差错处理三部分。IP协议的特点是点到点的,IP对等实体间的通信不经过中间机器,对等实体所在的机器位于同一物理网络,对等机器之间有直接的物砹印P层的主要功能是屏蔽下面物理层的差别,向上一层提供一致的数据格式。所有要传输的数据,被按照一定的格式分组封装层IP数据报,数据报单元通过寻径等机制进行传输,在接收方数据报进行重组,得到最初要传送的数据。由于IP协议是不可靠的数据传输协议,由于网络的拥塞而发生的数据丢失等情况是不可避免的,因此Internet 还必须有一定的控制重传机制,这就是差错与控制报文协议(ICMP)。尽管计算机通过安装IP软件,从而保证了计算机之间可以发送和接收数据,但IP协议还不能解决数据分组在传输过程中可能出现的问题。因此,若要解决可能出现的问题,还需要TCP协议来提供可靠的并且无差错的通信服务。TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收数据以及终止连接。传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。即使在 Internet 暂时出现堵塞的情况下,TCP也能够保证通信的可靠.Internet 是一个庞大的国际性网络,网路上的拥挤和空闲时间总是交替不定的,加上传送的距离也远近不同,所以传输数据所用时间也会变化不定。TCP协议具有自动调整"超时值"的功能,能很好地适应 Internet 上各种各样的变化,确保传输数值的正确。<br>
<br>
  IP协议只保证计算机能发送和接收分组数据,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。虽然IP和TCP这两个协议的功能不尽相同,也可以分开单独使用,但它们是在同一时期作为一个协议来设计的,并且在功能上也是互补的。只有两者的结合,才能保证 Internet 在复杂的环境下正常运行。凡是要连接到 Internet 的计算机,都必须同时安装和使用这两个协议,因此在实际中常把这两个协议统称作TCP/IP协议。 TCP/IP 协议除了TCP协议和IP协议,还包含物理接口和IP层之间的ARP/RARP协议,应用层的FTP协议﹑SMTP协议和BOOTP协议等,所用的这些协议构成Intenet 的TCP/IP 协议族。<br>
<br>
2.SMTP的基本结构<br>
<br>
SMTP (Simple Mail Transfer Protocol)协议是为了保证电子邮件的可靠和高效传送。TCP/IP 协议的应用层中包含有SMTP协议,但事实上它与传输系统和机制无关,仅要求一个可靠的数据流通道。它可以工作在TCP上,也可以工作在NCP, NITS 等协议上。在TCP上,它使用端口25进行传输。SMTP的一个重要特点是可以在可交互的通信系统中转发邮件。<br>
<br>
2.1 SMTP的模型<br>
SMTP提供了一种邮件传输的机制,当收件方和发件方都在一个网络上时,可以把邮件直传给对方;当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP首先由发件方提出申请,要求与接收方SMTP建立双向的通信渠道,收件方可以是最终收件人也可以是中间转发的服务器。收件方服务器确认可以建立连接后,双发就可以开始通信。下面是SMTP的模型示意图。<br>
<br>
<br>
<br>
发件方SMTP向收件方发处MAIL命令,告知发件方的身份;如果收件方接受,就会回答OK。发件方再发出RCPT命令,告知收件人的身份,收件方SMTP确认是否接收或转发,如果同意就回答OK;接下来就可以进行数据传输了。通信过程中,发件方SMTP与收件方SMTP 采用对话式的交互方式,发件方提出要求,收件方进行确认,确认后才进行下一步的动作。整个过程由发件方控制,有时需要确认几回才可以。<br>
<br>
<br>
<br>
为了保证回复命令的有效,SMTP要求发件方必须提供接收方的服务器及邮箱。邮件的命令和答复有严格的语法定义,并且回复具有相应的数字代码。所有的命令由ASCII码组成。命令代码是大小写无关的,如MAIL和 mail ﹑mAIL是等效的。<br>
<br>
2.2 SMTP的基本命令<br>
SMTP定义了14个命令,它们是:<br>
<br>
HELO <SP> <domain> <CRLF><br>
MAIL <SP> FROM:<reverse-path> <CRLF><br>
RCPT <SP> TO:<forward-path> <CRLF><br>
DATA <CRLF><br>
RSET <CRLF><br>
SEND <SP> FROM:<reverse-path> <CRLF><br>
SOML <SP> FROM:<reverse-path> <CRLF><br>
SAML <SP> FROM:<reverse-path> <CRLF><br>
VRFY <SP> <string> <CRLF><br>
EXPN <SP> <string> <CRLF><br>
HELP [<SP> <string>] <CRLF><br>
NOOP <CRLF><br>
QUIT <CRLF><br>
TURN <CRLF><br>
其中使得SMTP工作的基本的命令有7个,分别为:HELO﹑MAIL﹑RCPT﹑DATA﹑REST﹑NOOP和QUIT.下面分别介绍如下。<br>
<br>
HELO--发件方问候收件方,后面是发件人的服务器地址或标识。收件方回答OK时标识自己的身份。问候和确认过程表明两台机器可以进行通信,同时状态参量被复位,缓冲区被清空。<br>
<br>
MAIL--这个命令用来开始传送邮件,它的后面跟随发件方邮件地址(返回邮件地址)。它也用来当邮件无法送达时,发送失败通知。为保证邮件的成功发送,发件方的地址应是被对方或中间转发方同意接受的。这个命令会清空有关的缓冲区,为新的邮件做准备。<br>
<br>
RCPT --这个命令告诉收件方收件人的邮箱。当有多个收件人时,需要多次使用该命令,每次只能指明一个人。如果接收方服务器不同意转发这个地址的邮件,它必须报550错误代码通知发件方。如果服务器同意转发,它要更改邮件发送路径,把最开始的目的地(该服务器)换成下一个服务器。<br>
<br>
DATA--收件方把该命令之后的数据作为发送的数据。数据被加入数据缓冲区中,以单独一行是"<CRLF>.<CRLF>"的行结束数据。结束行对于接收方同时意味立即开始缓冲区内的数据传送,传送结束后清空缓冲区。如果传送接受,接收方回复OK。 <br>
<br>
REST--这个命令用来通知收件方复位,所有已存入缓冲区的收件人数据,发件人数据和待传送的数据都必须清除,接收放必须回答OK. <br>
<br>
NOOP--这个命令不影响任何参数,只是要求接收放回答OK, 不会影响缓冲区的数据。<br>
<br>
QUIT--SMTP要求接收放必须回答OK,然后中断传输;在收到这个命令并回答OK前,收件方不得中断连接,即使传输出现错误。发件方在发出这个命令并收到OK答复前,也不得中断连接。<br>
<br>
下面是SMTP答复中用到的代码和含义:<br>
<br>
500 Syntax error, command unrecognized<br>
[This may include errors such as command line too long]<br>
501 Syntax error in parameters or arguments<br>
502 Command not implemented<br>
503 Bad sequence of commands<br>
504 Command parameter not implemented<br>
211 System status, or system help reply<br>
214 Help message<br>
[Information on how to use the receiver or the meaning of a<br>
particular non-standard command; this reply is useful only to the human user]<br>
220 <domain> Service ready<br>
221 <domain> Service closing transmission channel<br>
421 <domain> Service not available, closing transmission channel<br>
[This may be a reply to any command if the service knows it must shut down]<br>
250 Requested mail action okay, completed<br>
251 User not local; will forward to <forward-path><br>
450 Requested mail action not taken: mailbox unavailable<br>
[E.g., mailbox busy]<br>
550 Requested action not taken: mailbox unavailable<br>
[E.g., mailbox not found, no access]<br>
451 Requested action aborted: error in processing<br>
551 User not local; please try <forward-path><br>
452 Requested action not taken: insufficient system storage<br>
552 Requested mail action aborted: exceeded storage allocation<br>
553 Requested action not taken: mailbox name not allowed<br>
[E.g., mailbox syntax incorrect]<br>
354 Start mail input; end with <CRLF>.<CRLF><br>
554 Transaction failed<br>
最后,让我们看一个RFC821中给出的例子。这封信是Smith在主机Alpha.ARPA 发给主机Beta.ARPA上的<br>
Jones,Green和 Brown.并且假定两台主机在同一个网络上。<br>
<br>
S: MAIL FROM:<Smith@Alpha.ARPA><br>
R: 250 OK<br>
S: RCPT TO:<Jones@Beta.ARPA><br>
R: 250 OK<br>
S: RCPT TO:<Green@Beta.ARPA><br>
R: 550 No such user here<br>
S: RCPT TO:<Brown@Beta.ARPA><br>
R: 250 OK<br>
S: DATA<br>
R: 354 Start mail input; end with <CRLF>.<CRLF><br>
S: Blah blah blah...<br>
S: ...etc. etc. etc.<br>
S: <CRLF>.<CRLF><br>
R: 250 OK<br>
邮件最后被对方接受。<br>
<br>
3.电子邮件的工作原理<br>
<br>
<br>
电子邮件与普通邮件有类似的地方,发信者注明收件人的姓名与地址(即邮件地址),发送方服务器把邮件传到收件方服务器,收件方服务器再把邮件发到收件人的邮箱中。如下图所示:<br>
<br>
<br>
<br>
更进一步的解释涉及到以下几个概念:<br>
<br>
MUA -- Mail User Agent, 邮件用户代理,帮助用户读写邮件;<br>
<br>
MTA -- Mail Transport Agent, 邮件传输代理,负责把邮件由一个服务器传到另一个服务<br>
<br>
器或邮件投递代理;<br>
<br>
MDA -- Mail Delivery Agent, 邮件投递代理,把邮件放到用户的邮箱里。<br>
<br>
整个邮件传输过程如下:<br>
<br>
目前使用的SMTP 协议是存储转发协议,意味着它允许邮件通过一系列的服务器发送到最终目的地。服务器在一个队列中存储到达的邮件,等待发送到下一个目的地。下一个目的地可以是本地用户,或者是另一个邮件服务器,如下图所示。<br>
<br>
<br>
<br>
如果下游的服务器暂时不可用,MTA 就暂时在队列中保存信件,并在以后尝试发送。<br>
<br>
<br>
4. 电子邮件的信头结构及分析<br>
<br>
4.1 邮件的结构<br>
在最高层,邮件的结构是非常简单的,用户从终端机上看到的邮件格式一般为:<br>
<br>
1. From: user1@domain1.com<br>
<br>
2. To: user2@domain2.com<br>
<br>
3. Subject: Explaination of mail format<br>
<br>
4. Date: Thu, 1 Apr 1999. 10:00:00 GMT<br>
<br>
5. Hi, Jack<br>
<br>
7. This mail is to explain you the mail format<br>
<br>
8. - - - -<br>
<br>
9. Thanks<br>
<br>
10. Bob<br>
<br>
其中, 1~~4 行称作信件信头(message header) 6~~10行描述信件要表达的内容,称为信体 (message body)。第5行是空行,根据RFC822的要求,信头和信体之间必须加入一空行。[i]信头通常包含字段From, To, Subject 和Date,有的邮件还包含cc,bcc等字段。<br>
<br>
4.2 邮件的信头<br>
<br>
事实上,邮件在传输过程中,服务器要把它打包成一个数据对象,包括上面的信件和一个信封。邮件的投递是依靠信封上的地址或信封信头(envelop address 或envelop header),而不是上面讲的信件上的地址。<br>
<br>
从表面上看,一封邮件是从发件人的机器直接传送到收件人的机器,但通常这并不正确,一封邮件发送和接受过程至少要经过四台计算机。参考下图所示。用户通常在自己的电脑前编写阅读邮件,我们把它叫做客户端 (client 1~~4 )。大部分组织里,都是用一台专门的机器处理邮件,称作邮件服务器 (SMTP1, SMTP2). 如果用户是从家里拨号上网,那末邮件服务器是ISP 提供的。 <br>
<br>
<br>
<br>
当某个用户在自己的电脑 Client1 前编写完一个邮件,然后把它发送到他的ISP 的邮件服务器SMTP1。此时她的机器已经完成了所有的工作,但邮件服务器SMTP1还必须想法把邮件发送到目的地。SMTP1 通过阅读信头或信封上的地址,找到收件认得邮件服务器SMTP2, 然后与该服务器建立连接,把邮件发到收件人的服务器上,等待收件人来取阅。<br>
<br>
下面我们将通过一个例子说明整个邮件传送过程及邮件的信头变化。假设发件人的名字叫 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 时,邮件的信头格式为:<br>
<br>
From: sender@domain1.com<br>
<br>
To: receipt@domain2.com<br>
<br>
Date: Tue, Mar 18 1998 15:36:24 GMT<br>
<br>
X-mailer:Sendmail 8.9.0<br>
<br>
Subject: Greetings<br>
<br>
当邮件服务器 mail.domain1.com 把邮件传到接收方的服务器 mail.domain2.com 时,接受方服务器会在信头上记录下有关的计算机信息,邮件的信头变成:<br>
<br>
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<br>
<br>
From: sender@domain1.com<br>
<br>
To: receipt@domain2.com<br>
<br>
Date: Tue, Mar 18 1998 15:36:24 GMT<br>
<br>
Message-Id: <client1254556544-45556454@mail.domain1.com><br>
<br>
X-mailer:Sendmail 8.9.0<br>
<br>
Subject: Greetings<br>
<br>
当收件人服务器mail.domain2.com 把邮件接收并存初下来,等待收件人来阅读时,邮件的信头将会再加入一条记录:<br>
<br>
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<br>
<br>
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 <br>
<br>
From: sender@domain1.com<br>
<br>
To: receipt@domain2.com<br>
<br>
Date: Tue, Mar 18 1998 15:36:24 GMT<br>
<br>
Message-Id: <client1254556544-45556454@mail.domain1.com><br>
<br>
X-mailer:Sendmail 8.9.0<br>
<br>
Subject: Greetings<br>
<br>
上面整个记录就将是收件人看到的完整的邮件信头。让我们逐行看一下信头中各行的含义:<br>
<br>
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<br>
<br>
这封信是从一台自称为 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。<br>
<br>
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<br>
<br>
这条记录表明信件是由机器client1.domain1.com ( IP 地址是 [111.11.1.1]) 在Tue, Mar 18 1998 15:37:24 GMT交给mail.domain1.com,并赋给编号id 004A21。<br>
<br>
From,TO ,Date和Subject 都易于理解,分别指明发件人,收件人,信件编辑日期及信件主题。<br>
<br>
Message-Id: <client1254556544-45556454@mail.domain1.com><br>
<br>
这是由发件方邮件服务器赋给这封邮件的编号。与其它编号不同,这个编号自始至终跟随邮件。<br>
<br>
 <br>
第二章 OPEN RELAY 的原理及测试 <br>
<br>
<br>
1.OPEN RELAY 的原理<br>
<br>
由于技术的原因,在80年代前,网络还不是很健全,机器之间很少能直接对话发送邮件,人们必须得找出一条有效的连接通路来,然后信件沿着通路一步一步传送到目的地。SMTP协议中就明确指出当邮件在不同的网络间传送时,需要借助中间服务器的RELAY。<br>
<br>
邮件在收件方和发件方之间会经过毫不相干的第三方服务器,这就是邮件转发 (RELAY)。 如下图所示:<br>
<br>
<br>
<br>
图中的 MAIL SERVER 是可以对要求转发的邮件进行限制的,如只转发来自某个域的邮件或来自于某些IP 得邮件。如果转发没有任何限制,就被称为 OPEN RELAY 或 THIRD PARTY RELAY。<br>
从历史上看,relay 曾经发挥过重要作用。而且当时这些工作主要靠手工来做,就像我们今天通过邮局发一封信一样。假如我想从沈阳发一封信件到深圳,我再信封上写好收信地址深圳,邮局就需要找到定义的运送路线: 沈阳,北京,郑州,长沙,广州,深圳。甚至还要长一些。其中很重要一点是每一个中继站都能很好的理解这封信将被送到哪里,下一个接收站是谁。在电子邮件里,这就相当于每个中继服务器清楚下一个服务起是谁,这就是邮件的转发。 <br>
<br>
目前,正常邮件转发已经不再必要,相反,无限制转发常常被发送垃圾邮件的人利用,隐藏真实的邮件来源,让别人以为是从另外的ISP 发出的信件;同时,也把大量的处理工作转移到别人机器上。<br>
由于前面提到的历史的原因,最初的绝大多数邮件服务器都允许OPEN RELAY的。今天,大部分邮件服务器升级版本已经在缺省设置中关闭了OPEN RELAY, 如Sendmail 从8.9.3版本开始,Exchange Server从5.5版本开始关闭了open relay。有的服务器虽然没有相应的升级版本,也都提供了关闭open relay 的方法,如在NOTES SERVER的配置文件notes.ini 中加入一行:SMTPMTA_REJECT_RELAYS=1。但由于很多服务器管理员的疏忽而没能及时的修补这些安全漏洞,被利用来转发垃圾邮件。<br>
<br>
2 如何确认邮件服务器是否RELAY<br>
<br>
假设要测试的IP是202.112.0.0. 可以使用下列命令进行测试,文中的绿色斜题字为测试邮件服务器的反馈信息:<br>
<br>
#telnet 202.112.0.0 25 <br>
Trying 202.112.0.0...<br>
Connected to 202.112.0.0.<br>
Escape character is '^]'. <br>
220 dns.ccert.edu.cn ESMTP Sendmail 8.11.1/8.11.1; Sat, 30 Jun 2001 21:07:10 +0800 <br>
helo mydomain <br>
250 dns.ccert.edu.cn Hello point.ccert.edu.cn [202.112.50.3], pleased to meet you <br>
mail from:nobody@yahoo.com <br>
250 2.1.0 nobody@#yahoo.com... Sender ok <br>
rcpt to:nobody@hotmail.com <br>
550 5.7.1 nobody@hotmail.com... Relaying denied <br>
<br>
最后的Relaying denied 表明该服务器已经安全设置,不会再relay无关邮件了。如果显示的结果是下面的样子,这表明服务器可以转发任何人的邮件。<br>
<br>
rcpt to:nobody@hotmail.com<br>
250 nobody@hotmail.com... Recipient ok<br>
data<br>
354 Enter mail, end with "." on a line by itself<br>
this is a test of the relay<br>
.<br>
250 VAA00289 Message accepted for delivery<br>
<br>
chyb 当前离线   回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为北京时间。现在的时间是 02:45


Powered by vBulletin® 版本 3.8.3
版权所有 ©2000 - 2024,Jelsoft Enterprises Ltd.