当前位置:文档之家› 实现SMTP协议设计思想

实现SMTP协议设计思想

SMTP邮件协议的实现思想

图11.1 因特网电子邮件系统概貌

1.用户代理

用户代理提供用户阅读、保存、回复、转发、编写、发送和删除邮件消息等功能。Alice写完电子邮件消息后,其用户代理把这个消息发送给Alice邮箱所在的邮件服务器,再由该邮件服务器把这个消息放入外出消息队列中并负责发送到Bob邮箱所在的邮件服务器。当Bob想阅读电子邮件消息时,其用户代理将从其邮件服务器上的邮箱中取得邮件。20世纪90年代后期,图形用户界面(GUI)的电子邮件用户代理变得流行起来,允许用户阅读和编写多媒体消息。当前流行的用户代理包括Outlook、Foxmail等。

2.邮件服务器

邮件服务器构成了电子邮件系统的核心。每个收信人都有一个位于某个邮件服务器上的邮箱(mailbox)。Bob的邮箱用于管理和维护已经发送给他的邮件消息。一个邮件消息的典型流程是从发信人的用户代理开始,经发信人邮箱所在的邮件服务器,中转到收信人邮箱所在的邮件服务器,然后投递到收信人的邮箱中。当Bob想查看自己的邮箱中的邮件消息时,其邮箱所在的邮件服务器将以他提供的用户名和口令认证他。Alice邮箱所在邮件服务器还必须处理Bob邮箱所在邮件服务器出故障的情况。如果Alice方的邮件服务器无法把邮件消息立即递送到Bob方的邮件服务器,则A1ice方的服务器就把它们存放在消息队列(message queue)中,以后再尝试递送。这种尝试通常每30分钟左右执行一次:要是过了若干天仍未尝试成功,该服务器就把这个消息从消息队列中删除,同时以另一个邮件消息通知发信人(即Alice)。

3.简单邮件传输协议SMTP

SMTP是因特网电子邮件系统重要的应用层协议。它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人邮箱所在邮件服务器传送到收信人邮箱所在邮件服务器。SMTP是客户-服务器应用模式,由发信人的邮件服务器执行的客户端和收信人的邮件服务器执行的服务器端组成。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服务器向其它邮件服务器发送邮件消息时,它是作为SMTP客户端。当一个邮件服务器从其它邮件服务器接收邮件消息时,它是作为SMTP服务器端。

SMTP规范定义在RFC 821中,它的作用是把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。SMTP限制所有邮件消息的信体必须是简单的7位ASCII字符格式。这个限制使得二进制多媒体数据在由SMTP传送之前必须编码成7位ASCII文本;SMTP传送完毕之后,再把相应的7位ASCII文本邮件消息解码成二进制数据。

下面通过假设Alice给Bob发送一个简单的ASCII文本邮件消息的情形来说明SMTP的基本操作:

(1) Alice调用自己的电子邮件用户代理,给出Bob的电子邮件地址(例如bob@https://www.doczj.com/doc/2110393181.html,),写好邮件内容,然后让用户代理发送本邮件消息。

(2) Alice的用户代理把该邮件消息发送到其邮件服务器中,由邮件服务器把该消息放入某个消息队列中。

(3) 运行在A1ice的邮件服务器上的SMTP客户端看到消息队列中的这个邮件消息后,打开一个到运行在Bob的邮件服务器主机上的SMTP服务器端的TCP连接。

(4) 经过最初的一些SMTP握手之后,SMTP客户把A1ice的邮件消息发送到TCP连接上。

(5) 在Bob的邮件服务器主机上,SMTP服务器收到这个邮件消息后,把这个消息投递到Bob 的邮箱中。

(6) Bob在方便的时候调用自己的电子邮件用户代理阅读该邮件消息。图11.2展示了上述情形。

SMTP

因特网

Alice的邮件服务器Bob的邮件服务器

图11.2 A1ice的邮件服务器把邮件消息传送到Bob的邮件服务器

SMTP通常不使用中间的邮件服务器主机中转邮件。如果Bob的邮件服务器不工作了,那么A1ice发给Bob的邮件消息将存留在Alice的邮件服务器中等待新的尝试,而不会存放到某个中间的邮件服务器中。

SMTP协议与现实社会人们面对面交互的礼仪之间有许多相似之处。首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不工作,SMTP客户就等待一段时间后再尝试建立该连接。这个连接建立之后,SMTP客户和服务器先执行一些应用层握手操作。就像人们在转手东西之前往往先自我介绍那样,SMTP客户和服务器也在传送信息之前先自我介绍一下。在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自我介绍完毕之后,客户发出邮件消息。SMTP使用传输层提供的可靠数据传输服务(TCP服务)把该消息无差错地传送到服务器。如果客户还有其它邮件消息需发送到同一个服务器,它就在同一个TCP连接上重复上述过程;否则,它就指示TCP关闭该连接。

假设客户所在主机名为https://www.doczj.com/doc/2110393181.html,,服务器所在主机名为https://www.doczj.com/doc/2110393181.html,。前面标以“C:”的ASCII文本行是客户发送到它的TCP套接字中的完整文本行,前面标以“S:”的ASCII文本行是服务器发送到它的TCP套接字中的完整文本行。一个客户和服务器交互的例子如下(以下传输脚本在TCP连接建立之后发生):

S: 220 https://www.doczj.com/doc/2110393181.html,

C: HELO https://www.doczj.com/doc/2110393181.html,

S: 250 Hello https://www.doczj.com/doc/2110393181.html,, pleased to meet you

C: MAIL FROM:

S: 250 Sender OK

C: RCPT TO: bob@https://www.doczj.com/doc/2110393181.html,

S: 250 Recipient OK

C: DA TA

S: 354 Enter mail, end with "." on a line by its self

C: Do you like ketchup?

C: How about pickles?

C: .

S: 250 Message accepted for delivery

C: QUIT

S: 221 https://www.doczj.com/doc/2110393181.html, closing connection

在这个例子中,客户发送了一个从邮件服务器主机https://www.doczj.com/doc/2110393181.html,到https://www.doczj.com/doc/2110393181.html,的邮件消息,信体内容为:“Do you like ketchup? How about pickles?”。客户总共发出了5个命令。其中HELO命令标识发

信人自己的身份;MAIL FROM命令表示请求发送邮件,初始化邮件传输;RCPT TO命令标识某电子邮件的计划接收人;DA TA命令表示所有的邮件接收人已标识,并初始化数据传输,以.结束;QUIT命令表示退出邮件发送过程,结束会话。

服务器给每个命令发回应答,其中每个应答都由应答码和一些英语解释(可选)构成。SMTP使用持久连接,如果发送邮件服务器有多个邮件消息需发送到同一个接收邮件服务器,那么所有这些消息可以在同一个TCP连接中发送。对于其中的每一个消息,客户以一个新的“HELO https://www.doczj.com/doc/2110393181.html,”命令开始整个消息发送过程,但是QUIT命令要等到所有消息都发送完之后才发出。一旦SMTP 把Alice发给Bob的邮件消息从Alice的邮件服务器传送到Bob的邮件服务器,该邮件消息就存放在Bob的邮箱中。

4.邮件消息格式

当Alice给Bob发一封普通的邮政信件时,她把这封信装入一个信封里,在信封上写明Bob 的地址和自己的回信地址,然后投入邮箱;邮政业务在递送这封信的过程中,也会把表明时间和地点的邮戳盖在信封上。类似地,当电子邮件消息从一个人传送到另一个人时,在信体之前会有一个含有这些外围信息的信头。这些信息由一系列在RFC 822中定义的邮件消息头部及其值构成。邮件消息中构成信头的各个头部和信体之间以一个空行(即CRLF)分割。RFC 822详细说明了各个邮件消息头部的格式和含义。邮件消息的每个头部都是直观可读的文本,由一个后跟冒号的关键字和相应的值构成。这些头部有些是必须的,有些则是可选的。每个信头必须有一个From:头部和一个To:头部。还可以有一个Subject:头部和其他头部。这些头部和前面讨论的SMTP命令不是一回事:SMTP命令是SMTP握手协议的一部分,邮件消息头部则属于邮件消息的一部分。

下面是一个典型的电子邮件信头:

From: alice@https://www.doczj.com/doc/2110393181.html,

To: bob@https://www.doczj.com/doc/2110393181.html,

Subject: this is a letter

信头之后空一行就是信体。

SMTP RFC822要求每个邮件消息的信体以单个点号构成的一行做结束标记,换用ASCII字符形式,就是每个邮件消息的信体必须以“CRLF.CRLF”结尾,其中CR和LF分别代表回车符和换行符。这种方式下,当从同一个SMTP客户接收一系列邮件消息时,SMTP服务器可以通过在字节流中搜索“CRLF.CRLF”来分割每个消息。

RFC 822中说明的邮件消息头部尽管足以满足发送普通ASCII文本邮件的要求,但是在多媒体消息(例如,包含图像、音频或视频数据的消息)的描述和非ASCII文本格式(例如,非英语国家使用的文字)的承载上,却显然不够,例如,若信体是JPEG图像的二进制数据,那么这些二进制数据字节流中可能出现“CRLF.CRLF”模式。这将导致SMTP服务器误认为当前邮件消息已结束。为避免这样的问题,二进制数据应以某种方式编码成ASCII文本,保证其中不存在特定的ASCII 字符(包括点号)。要发送非ASCII文本的邮件消息,必须由发送者的用户代理在其中增添额外的头部。RFC 2045和RFC 2046定义了这些额外的头部,它们是针对RFC 822的多用途因特网邮件扩展(Multipurpose Internet Mail Extensions, 简称MIME)。

支持多媒体的两个关键MIME头部是Content-Type:和Content-Tansfer-Encoding:。Content-Type:头部允许接收用户代理对邮件消息采取合适的行动。例如,通过指出信体内容为一个JPEG图像,接收用户代理可以把信件定向到某个JPEG解压缩例程。为确保SMTP正常工作,非ASCII文本消息必须预先编码成ASCII文本格式。Content-Tansfer-Encoding:头部用于告知接收用户代理信体已被编码成ASCII格式,并指出具体编码方式。这样,当某个用户代理收到一个包含这两个头部的邮件消息时,它首先使用Content-Tansfer-Encoding:头部的值把信体转换成原始的非ASCII文本形式,再使用Content-Type:头部的值确定自己应该对信体采取什么行动。

假设Alice想给Bob发送一个JPEG图像,她为此调用自己的用户代理,给出Bob的电子邮件地址和邮件消息的主题,并把这个JPEG图像插入这个邮件消息的信体中(这个图像有可能是作为该邮件消息的“附件”插入的,具体取决于Alice所用的用户代理)。Alice填写完邮件消息后让用户代理把它发送出去。Alice的用户代理生成一个大体如下的MIME消息:

From: alice@https://www.doczj.com/doc/2110393181.html,

To: bob@https://www.doczj.com/doc/2110393181.html,

Subject: picture of mine

MIME-V ersion: 1.0

Content-Transfer-Encoding: base64

Content-Type: image/jpeg

{...base64编码数据...

...base64编码数据...}

从这个例子看到,Alice的用户代理采用base64编码格式对这个JPEG图像进行编码,而base64是在MIME中标准化的用于转换成某种可接受的7位ASCII格式的编码技术之一(定义在RFC 2045中)。

Base64采用了一种很简单的编码转换:对于待编码数据,以3个字节为单位,依次取6位数据并在前面补上两个0形成新的8位编码,由于3×8=4×6,这样3个字节的输入会变成4个字节的输出,长度上增加了1/3。上面的处理还不能保证得到的字符都是可见字符,为了达到此目的,Base64制定了一个编码表,进行统一的转换,见表11.1。码表的大小为26=64,这也是Base64名称的由来。由于编码是以3个字节为单位,当剩下的字符数量不足3个字节时,则应使用0进行填充,相应地,输出字符则使用…=?占位,因此编码后输出的文本末尾可能会出现1至2个…=?。

表11.1 Base64编码表

值编码值编码值编码值编码值编码值编码值编码值编码

0 A 8 I 16 Q 24 Y 32 g 40 o 48 w 56 4

1 B 9 J 17 R 25 Z 33 h 41 p 49 x 57 5

2 C 10 K 18 S 26 a 34 i 42 q 50 y 58 6

3 D 11 L 19 T 27 b 35 j 43 r 51 z 59 7

4 E 12 M 20 U 28 c 36 k 44 s 52 0 60 8

5 F 13 N 21 V 29 d 37 l 45 t 53 1 61 9

6 G 14 O 22 W 30 e 38 m 46 u 54 2 62 +

7 H 15 P 23 X 31 f 39 n 47 v 55 3 63 /

Bob阅读邮件时,其用户代理所操作的是同一个MIME消息。该用户代理看到值为base64的Content-Transfer-Encoding:头部后,知道该邮件消息中还有一个值为image/jpeg的Content-Type:头部,它告知Bob的用户代理应该对信体进行JPEG解压缩。该邮件消息中的MIME-V ersion:头部指示本消息所用的MIME版本。

Content-Type:头部遵循MIME规范(定义在RFC 2046中),其格式为:Content-Type: type/subtype; parameters。其中parameters(以及其前面的分号)是可选的。通过在Content-Type:头部给出媒体类型(type)名和子类型(subtype)名来说明MIME消息信体中数据的性质。类型名和子类型名之后的其余部分是一组参数。类型名用于声明数据的一般类型,子类型名用于指明这类数据中的某种具体格式。参数是对于类型的修饰说明,取值取决于类型和子类型本身,不影响内容性质的指定。MIME 是按照可扩展目标仔细地设计的,并预期媒体类型/子类型以及它们的相关参数会随时间显著增长。为确保以有秩序的文档完备公开的方式开发这些类型/子类型,MIME建立了一套注册程式,把因特网分配数值权威(Internet Asigned Numbers Authority, 简称IANA)作为MIME各个可扩展域的中心注册处。RFC 2048具体说明了这些可扩展域的注册程式。每个MIME类型关联一组子类型,其

数量在逐年增长。一些主要类型如下:

(1) text: text类型用于向接收者的用户代理指出消息体为文本。该类型的一个普遍使用的类型/子类型对为text/plain。子类型plain指定不含任何格式定义信息的普通文本。plain文本不加任何解释地按照原样显示,不需要特殊的软件,但要求支持给定的字符集。在实际的邮件消息中经常能看到值对为text/plain; charset = gb2312或text/plain; charset = “ISO-8859-1”的Content-Type:头部,其中的参数指出用于产生相应消息的字符集。另一个普遍使用的类型/子类型对是text/html。子类型html指示接收用户代理解释嵌入在消息体中的html标记,从而像Web页面那样显示信件内容,其中有可能包含各种字体的文本、超链接、Java小应用程序等等。

(2) image: image类型用于向接收用户代理指出消息体为图像。该类型较为流行的两个类型/子类型对为image/gif和image/jpeg,接收用户代理碰到这样的类型时,就知道该把消息体作为GIF 图像或JPEG图像解码并显示。

(3) audio: audio类型需要音频输出设备(例如扬声器或电话)来表达内容。这类型中常见的已标准化子类型包括basic(基本8位u-law编码)和32kadpcm(RFC 1911中定义的一种32Kbps格式)。

(4) video: video类型的子类型包括mpeg和quicktime。

(5) application: application类型适用于不适合归为其它类别的数据,通常用在必须由某个应用程序预先处理才能为用户所见或所用的数据上。例如,当用户在某个电子邮件消息中附带一个微软word文档时,其用户代理一般把它的类型子类型对指定为application/msword;这将导致接收用户代理启动微软word应用程序,并把该MIME消息的信体传递给它处理。这类型的一个重要子类型是octet-stream,它用于指示信体含有任意的二进制数据。收到内容类型为application/octet-stream 的邮件消息后,接收用户代理会提示用户是否把信体保存到硬盘中,以便稍后处理。

(6) MultiPart: MultiPart是MIME类型中一个相当重要的类型。当一个多媒体消息含有不止一个对象时(例如多个图像或ASCII文本与图像共存),其Content-Type:头部的值通常为multipart/mixed。这头部向接收用户代理指出本消息中含有多个对象。在多个对象共处同一个邮件消息中的情况下,通过在每个对象之间放置边界字符串,并在每个对象之前定义Content-Type:和Content-Transfer-Encoding:头部,接收用户代理可以确定:(1)每个对象的起止位置;(2)每个非ASCII 文本对象的传送编码方式;(3)每个对象的内容类型。为便于理解multipart/mixed,举例如下:假设Alice想给Bob发送一个邮件消息,其内容为一些ASCII文本,后跟一个JPEG图像,再跟一些ASCII文本。Alice使用自己的用户代理编辑文本并附上图像后,该用户代理生成一个如下的邮件消息:

From: alice@https://www.doczj.com/doc/2110393181.html,

To: bob@https://www.doczj.com/doc/2110393181.html,

MIME-V ersion: 1.0

Content-type: multipart/mixed; Boundary=StartOfNextPart

--StartOfNextPart

Dear bob,

Please look at the picture

--StartOfNextPart

Content-Transfer-Encoding: base64

Content-type: image/jpeg

{...base64编码的数据...

...base64编码的数据...}

--StartOfNextPart

there is some acsii letter here

从中可以看出,Content-type:头部的Boundary参数用于指定分隔各个部分的边界字符串。在邮件消息体中,该分隔字符串以两个短划线开头,以CRLF结尾。

一个电子邮件消息由多个部件构成。信体是邮件消息的核心,它是发送者发送给接收者的真正数据。对于多部分邮件消息来说,其信体本身由多个部分组成,而每个部分又有一个或多个说明其数据性质的头部。信体之前是一个空行和由多个邮件消息头部组成的信头。这些头部既包括RFC 822头部,例如From:、To:和subject:,也包括MIME头部,例如Content-type:和Content-Transfer-Encoding:。除此之外,还有由SMTP接收服务器插到每个邮件消息项端的Received:头部,它给出了发出本消息的SMTP服务器的主机名(“from”)、收取本消息的SMTP服务器的主机名(“by”)以及接收服务器收取本消息的时间。因此,作为接收者的用户看到的邮件消息大致如下: Received: from https://www.doczj.com/doc/2110393181.html, by https://www.doczj.com/doc/2110393181.html,; 18 Oct 2007 09:53:37 GMT

From: alice@https://www.doczj.com/doc/2110393181.html,

To: bob@https://www.doczj.com/doc/2110393181.html,

MIME-V ersion: 1.0

Content-type: multipart/mixed; Boundary=StartOfNextPart

--StartOfNextPart

Dear bob,

Please look at the picture

--StartOfNextPart

Content-Transfer-Encoding: base64

Content-type: image/jpeg

{...base64编码的数据...

...base64编码的数据...}

--StartOfNextPart

there is some acsii letter here

有时候,单个邮件消息会有多个Received:头部,有的还会有一个较复杂的Return-path:头部。这是因为邮件消息在从发送者的主机到接收者的主机的传送过程中,可能会被转发到不止一个SMTP服务器。例如,如果Bob指示他在主机https://www.doczj.com/doc/2110393181.html,上的邮件服务器把他的所有邮件转发到主机https://www.doczj.com/doc/2110393181.html,,那么他通过其用户代理看到的邮件消息可能以大体如下的两行开头: Received: from https://www.doczj.com/doc/2110393181.html, by https://www.doczj.com/doc/2110393181.html,; 18 Oct 2007 09:55:37 GMT

Received: from https://www.doczj.com/doc/2110393181.html, by https://www.doczj.com/doc/2110393181.html,; 18 Oct 2007 09:53:37 GMT

这些头部给接收用户代理提供了相应邮件消息访问过的SMTP服务器及访问时间的踪迹。SMTP规范所在的RFC 822详细定义丁Received:头部的语法。

5.邮件访问协议

在前面的讨论中,都是假设Bob通过直接登录到自己的邮件服务器主机启动用户代理来阅读邮件消息。直到20世纪90年代早期,这仍然是标准的做法。然而,当今的用户一般使用在本地PC机(或Mac机)上执行的用户代理来阅读邮件,而不管是办公室PC机、家庭PC机还是便携机。用户在本地PC机上执行用户代理可享受诸多好处,包括方便查看多媒体邮件消息和附件。

邮件消息的接收者在本地PC机上执行用户代理时,很自然的一个想法是在本地PC机上也运行邮件服务器,然而这种方法存在一个问题。邮件服务器是管理邮箱并运行SMTP的客户端和服务器端的,这意味着如果收信人把自己的邮件服务器驻留在本地PC上,那么他不得不始终开着这台PC机并连接在因特网上,以便接收可能在任意时刻到达的新邮件。对于大多数因特网用户来说,这显然是不现实或不经济的做法。相反,用户一般只在本地PC机上运行一个用户代理,由它远程访问存放在某台共享的邮件服务器主机上的邮箱,而该邮件服务器主机总是连接在因特网上并为多个用户所共享。该主机及其上的邮件服务器—般由该用户的ISP(例如大学或公司)维护。

用户代理运行在各个用户的本地PC机上,而邮件服务器运行在ISP或机构内部网络中的某台

服务器主机上,用户代理和邮件服务器之间需要有一个互相通信的协议。先查看一下出自从Alice 的本地PC 机的某个邮件消息如何设法到达Bob 邮箱所在的SMTP 邮件服务器。这个任务可简单地由Alice 的用户代理使用SMTP 直接与Bob 邮箱所在的邮件服务器进行通信来完成。具体地说,从Alice 的用户代理发起建立一个到Bob 邮箱所在的邮件服务器的TCP 连接,并通过该连接发出SMTP 握手命令,再用DA TA 命令上传邮件消息,最后关闭连接。这种方法尽管切实可行,却很少被采用,因为它没有给Alice 的用户代理提供任何资源来应对目标邮件服务器临时崩溃的情况。相反,通常采用的方法是先由Alice 的用户代理发起与自己邮箱所在的邮件服务器的一个SMTP 会话,把邮件消息上传到该邮件服务器;再由Alice 方的邮件服务器发起与Bob 方的邮件服务器的一次SMTP 会话,把邮件消息中转给Bob 方的邮件服务器。如果Bob 方的邮件服务器暂时不可用,Alice 方的邮件服务器就暂存该邮件消息,以后继续尝试。

现在的问题是,像Bob 这样在本地PC 机上运行用户代理的收信人该如何获取已到达自己的邮件服务器的邮件消息(该邮件服务器运行在Bob 的ISP 中的某台主机上)。通过引入用于从自己的邮件服务器到本地PC 机上的用户代理传送邮件消息的邮件访问协议,可以解决这个问题。目前流行的邮件访问协议有两个:邮局协议版本3(Post Office Protocol V ersion 3, 简称POP3)和因特网邮件访问协议(Internet Mail Access Protocol, 简称IMAP)。这两个协议使用内拉操作获取邮件消息,而SMTP 是一个外推协议。图11.3汇总了因特网电子邮件系统中所用的协议:SMTP 用于从发送者的邮件服务器到接收者的邮件服务器传送邮件消息,也用于从发送者的用户代理到发送者的邮件服务器传送邮件消息;POP3或IMAP 用于从接收者的邮件服务器到接收者的用户代理传送邮件消息。

发送者的邮件服务器

接收者的邮件服务器

用户代理

用户代理

SMTP

SMTP

POP3或IMAP

图11.3 电子邮件协议及它们的通信实体

(1) POP3

RFC 1939中定义的POP3是一个简单的邮件访问协议,其功能也相当有限。POP3开始于用户代理打开一个到POP3服务器端口号110的TCP 连接。POP3服务器与邮件服务器运行在相同的服务器主机上,前者从用户的邮箱中读取并可能删除邮件消息,后者往用户的邮箱中写入邮件消息。TCP 连接建立好之后,POP3依次经历授权认证、处理和更新3个阶段。在授权阶段,用户代理分别发出一个用户名和一个口令以认证下载邮件消息的用户。在处理阶段,用户代理获取邮件消息,并可以标记待删除的邮件消息或去掉这些标记,获取邮件统计信息。更新阶段发生在用户代理发出quit 命令以结束当前POP3会话之后,期间POP3服务器删除己加过删除标记的邮件消息。在POP3会话期间,用户代理发出命令,POP3服务器则对每个命令响应以一个应答。可能的应答有两个:指出刚才的命令执行成功的+OK(有时后跟一个解释性消息)和指出刚才的命令执行有误的-ERR 。

a) 授权阶段:授权阶段共有两个基本命令:user <用户名>和pass<口令>。可以使用telnet 工具指定使用POP 端口号110直接登录到某台POP3服务器主机,并发出这些命令来展示它们的用法。假设mailserver 是邮件服务器主机名,这个过程大致如下:

telnet mailserver 110 +OK POP3 server ready user alice +OK

pass password

+OK user successfully logged on

若写错了某个命令,POP3服务器将返回一个-ERR应答。

b) 处理阶段:POP3的用户代理可配置成“下载并删除”或“下载并保留”两种模式之一。POP3用户代理发出的一系列命令取决于其运行在哪种模式。在下载并删除模式中,用户代理会发出list、retr和dele命令。假设用户的邮箱中已存有两个邮件消息,其POP3处理阶段大致如下(其中前面标以“C:”的是用户代理发出的命令,而标以“S:”的是POP3服务器返回的应答):C: list

S: 1 498

S: 2 912

S: .

C: retr 1

S: (abcd ......

S: ............

S: ......)

S: .

C: dele 1

C: retr 2

S: (... ...

S: ...

S: ......)

S: .

C: dele 2

C: quit

S: +OK POP3 server signing off

用户代理首先要求POP3服务器列出存放在自己的邮箱中的每个邮件消息的大小,接着依次取回并删除每个邮件消息。授权阶段结束之后,用户代理只能发出4个命令:list、retr、dele、quit。这些命令的具体语法定义在RFC 1939中。

c) 更新阶段:处理完quit命令后,POP3服务器进入更新阶段,把邮件消息1和2从相应的邮箱中删除。收信人可能希望从不止一台主机访问自已的邮箱,如既能从办公室PC机访问,也能从家庭PC机访问,还能从便携机访问。下载并删除模式不能满足这种需求,例如,这种模式将导致同一用户的邮件消息散布到他的多台主机上,若他先在家里的PC机上阅读了某个邮件消息,则以后就不能在便携机上阅读同一个邮件消息了。下载并保留模式则恰好相反,用户代理把己从POP3服务器下载的邮件消息继续保留在邮件服务器中。在这种模式下,用户可以在不同的时间从不同的主机访问同样的邮件消息。在用户代理和邮件服务器之间的POP3会话期间,POP3服务器维护一定的状态信息,即它跟踪哪些邮件消息己被标记成待删除状态。但POP3服务器不会跨会话保存状态信息,例如,每次会话开始之时没有任何邮件消息被标记成待删除状态。

(2) IMAP

收信人使用POP3把邮件消息下载到本地机之后,就可以把它们移入现行的或新创建的邮件夹中,然后可以进行删除、跨邮件夹转移、按发信人名字或消息主题搜索邮件消息等操作。但是这种邮件夹和邮件消息都存放在本地机上,不能满足游动用户的需求。游动用户更愿意在远程邮件服务器主机上维护邮件夹,这样从任何主机都可以访问它。

RFC 2060中定义的IMAP协议解决了上述问题。IMAP允许用户像对待本地邮箱那样操纵远程邮箱,使得收信人能够在自己的邮件服务器主机中创建并维护多个存放邮件消息的邮件夹。用户可以把邮件消息存入邮件夹,也可以从一个邮件夹到另一个邮件夹转移邮件,还可以在这些远程邮件夹中搜索匹配特定准则的邮件消息。IMAP服务器必须为每个用户维护一个邮件夹层次结构,因此IMAP的实现比POP3的实现复杂得多。某个用户相继访问自己的IMAP服务器时,这个

IMAP服务器为该用户维护的状态信息跨这些相继的访问保持一致。POP3服务器则相反,一旦用户退出当前的POP3会话,就不再为其维护状态信息。

IMAP有一些允许用户代理获取邮件消息部件的命令。例如,用户代理可以只获取邮件消息的信头,或者只获取多部分MIME消息的某个部分。这个特征在用户代理和邮件服务器主机之间为低带宽连接(例如无线连接或低速调制解调器拨号连接)时非常有用。通过低带宽连接访问邮件时,用户很可能不希望下载自己的邮箱中的所有邮件消息,特别是可能含有音频或视频剪辑的长消息。

在IMAP会话过程中,首先,用户代理发起建立一个到IMAP服务器端口号143的TCP连接;然后,服务器返回初始问候消息;接着,客户与服务器就可以交互了。客户和服务器的交互由客户发出的命令、服务器返回的数据或命令完成结果响应构成。IMAP服务器在会话期间总是处于以下4个状态之一:未认证(nonauthenticated)、已认证(authenticated)、已选择(selected)和注销(1ogout)。未认证状态是连接刚建立时的初始状态,这种状态下,用户必须提供一个用户名和口令对才能继续下面的操作,即发出更多的命令。在已认证状态下,用户必须选择一个邮件夹才能发出作用于邮件消息的命令。在已选择状态下,用户可以发出作用于邮件消息的任何命令(获取、转移、删除、获取多部分消息的某个部分等等)。最后的注销状态是会话即将终止时的状态。

(3) HTTP邮件

使用提供这种服务的服务器时,用户代理是普通的web浏览器,用户与邮件服务器主机上的邮箱之间的交互由HTTP协议完成。当收信人(例如Bob)想要查看其邮箱中的邮件消息时,这些消息通过HTTP协议(而不是POP3或IMAP协议)从邮件服务器主机传送到他的浏览器。当发信人(例如Alice)想要发送电子邮件消息时,这些消息也是通过HTTP协议(而不是SMTP协议)从她的浏览器传送到她邮箱所在的邮件服务器主机的。但邮件消息在邮件服务器主机之间的中转仍然通过SMTP协议。与IMAP一样,用户可以在远程服务器主机中使用一个邮件夹层次结构组织邮件消息。基于Web的电子邮件给移动用户带来了极大方便,但其主要不足之处在于速度比较慢,因为其服务器主机往往远离客户主机,而且用户的浏览器是通过CGI脚本与邮件服务器间接交互的。当前,越来越多的用户使用基于浏览器的电子邮件服务,例如Hotmail和Yahoo!Mall,在未来,它将有可能形成与POP3或IMAP访问办法共存的局面。

(4) 持续媒体电子邮件

持续媒体(continuous-media, 简称CM)电子邮件是包含音频或视频数据的电子邮件系统,它对于朋友之间和家庭成员之间的异步交流很有吸引力。例如,学龄前儿童更愿意使用CM电子邮件给祖父母发送邮件消息。CM电子邮件在公司也可能受欢迎,因为办公室工作人员录制CM邮件消息的速度要比输入文本消息的速度快许多(使用英语每分钟可以说180个单词,但是普通办公室工作人员每分钟只能输入20-40个单词)。CM电子邮件在某些方面类似电话语音留言,不过功能要强大得多。它不仅给用户提供一个访问邮箱的图形界面,而且允许用户评注并回复CM邮件消息,或者把CM邮件消息转发给多个收信人。

CM电子邮件与传统文本电子邮件在许多方面存在差异。CM电子邮件消息比文本电子邮件消息大得多,对于端到端延迟有更严格的要求,对于收信人千差万别的因特网访问速率和本地存储容量也更为敏感。当前的电子邮件设施也存在一些妨碍CM电于邮件推广的不足之处。首先,许多现有的邮件服务器没有存放大邮件消息的容量;它们一般拒绝接收或中转CM邮件消息,因此不可能给依附它们的收信人发送这样的消息。其次,收信人的用户代理只在取得完整的邮件消息后才表达其内容,对于CM电子邮件,这会导致网络带宽和本地主机存储容量的过度浪费。事实上,仓储的CM邮件消息往往不是完整地表达的,因此接收未作表达的数据显然浪费了网络带宽和本地存储容量(例如,当某人收到来自相当唠叨的同事的长篇语音邮件消息后,可能只听上前15秒就决定不再听,要删除还剩20分钟内容的整个消息)。再次,当前使用的邮件访问协议(POP3、IMAP、HTTP)不适合为收信人流播放CM邮件消息。这些邮件访问协议没有提供这样的功能:允许用户暂停/恢复播放邮件消息内容,或者在邮件消息内重新定位播放点;另外,在TCP上实现流播放往往导致糟糕的接收效果。这些不足之处有望在未来的几年内得到解决。不过近来超大邮箱

开始流行起来,如GMAIL等,邮箱容量的限制问题正在得到解决。

6.关键源代码示例

(1)邮件发送端源代码

package mailoper;

import java.awt.GridBagLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.PrintStream;

import java.io.PrintWriter;

import https://www.doczj.com/doc/2110393181.html,.InetAddress;

import https://www.doczj.com/doc/2110393181.html,.Socket;

import java.util.Scanner;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

public class MailSender{

private JFrame frame;

private Scanner in;

private PrintWriter out;

private JTextField from;

private JTextField to;

private JTextField smtpServer;

private JTextArea message;

private JTextArea comm;

private Logger logger;

private PrintWriter ps;

public static final int DEFAULT_WHIDTH = 300;

public static final int DEFAULT_HEIGHT = 300;

public MailSender(){

try {

ps = new PrintWriter(new FileOutputStream("WebRoot\\ClientLog.txt",true),true); } catch (FileNotFoundException e1) {

e1.printStackTrace();

}

logger = new Logger(ps);

logger.log("MailSender","Info","开始记录日志...");

}

public MailSender(boolean isFraem){

this();

initFrame();

}

public void initFrame(){

frame = new JFrame();

frame.setSize(300,300);

frame.setTitle("邮件服务器");

frame.setLayout(new GridBagLayout());

frame.setLocation(200,200);

frame.setV isible(true);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(new JLabel("From"),new GBC(0,0).setFill(GBC.HORIZONTAL));

from = new JTextField(20);

from.setText("shexu@https://www.doczj.com/doc/2110393181.html,");

frame.add(from,new GBC(1,0).setFill(GBC.HORIZONTAL));

frame.add(new JLabel("To"),new GBC(0,1).setFill(GBC.HORIZONTAL));

to = new JTextField(20);

to.setText("liusumantian@https://www.doczj.com/doc/2110393181.html,");

frame.add(to,new GBC(1,1).setFill(GBC.HORIZONTAL).setWeight(100,0));

frame.add(new JLabel("SMTP server:"),new GBC(0,2).setFill(GBC.HORIZONTAL)); smtpServer = new JTextField(20);

smtpServer.setText("localhost");

frame.add(smtpServer,new GBC(1,2).setFill(GBC.HORIZONTAL).setWeight(100,0));

message = new JTextArea();

message.setText("你好世界!!!");

frame.add(new JScrollPane(message),new

GBC(0,3,2,1).setFill(GBC.BOTH).setWeight(100,100));

comm = new JTextArea();

frame.add(new JScrollPane(comm),new

GBC(0,4,2,1).setFill(GBC.BOTH).setWeight(100,100));

JPanel buttonPanel = new JPanel();

frame.add(buttonPanel,new GBC(0,5,2,1));

JButton sendButton = new JButton("发送");

buttonPanel.add(sendButton);

sendButton.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

new Thread(new Runnable(){

public void run(){

comm.setText("");

sendMail();

}

}).start();

}

});

frame.validate();

}

public void sendMail(){

Socket server = null;

try{

server = new Socket(smtpServer.getText().trim(),25);

InputStream ins = server.getInputStream();

OutputStream outs = server.getOutputStream();

in = new Scanner(ins);

out = new PrintWriter(outs);

String hostName = InetAddress.getLocalHost().getHostName();

// 发送邮件过程

receive();

send("HELO " + hostName);

receive();

send("MAIL FROM:<" + from.getText().trim() + ">");

receive();

send("RCPT TO:<" + to.getText().trim() + ">");

receive();

send("DA TA");

receive();

send(message.getText());

send(".");

receive();

send("QUIT");

receive();

S: 220 https://www.doczj.com/doc/2110393181.html,

C: HELO https://www.doczj.com/doc/2110393181.html,

S: 250 Hello https://www.doczj.com/doc/2110393181.html,, pleased to meet you

C: MAIL FROM:

S: 250 Sender OK

C: RCPT TO: bob@https://www.doczj.com/doc/2110393181.html,

S: 250 Recipient OK

C: DA TA

S: 354 Enter mail, end with "." on a line by its self

C: Do you like ketchup?

C: How about pickles?

C: .

S: 250 Message accepted for delivery

C: QUIT

S: 221 https://www.doczj.com/doc/2110393181.html, closing connection

} catch(IOException e){

e.printStackTrace();

comm.append("Error:" + e.getMessage());

} finally{

try {

if(server != null){

server.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

public void sendMail(String to,String from,String message){

Socket server = null;

try{

server = new Socket("localhost",25);

InputStream ins = server.getInputStream();

OutputStream outs = server.getOutputStream();

in = new Scanner(ins);

out = new PrintWriter(outs);

String hostName = InetAddress.getLocalHost().getHostName();

// 发送邮件过程

receive();

send("HELO " + hostName);

receive();

send("MAIL FROM:<" + from + ">");

receive();

send("RCPT TO:<" + to + ">");

receive();

send("DA TA");

receive();

send(message);

send(".");

receive();

send("QUIT");

receive();

} catch(IOException e){

e.printStackTrace();

// comm.append("Error:" + e.getMessage());

} finally{

try {

if(server != null){

server.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 向服务端发送信息

* @param str

*/

private void send(String str) {

logger.log("MailSender","Info","发送信息:" + str);

// comm.append(str);

// comm.append("\n");

out.print(str.replaceAll("\n","\r\n") + "\r\n");

// out.print("\r\n");

out.flush();

}

/**

* 从服务端收到信息并显示

*/

private void receive() {

if(in.hasNextLine()){

String line = in.nextLine();

logger.log("MailSender","Info","服务器信息:" + line); // comm.append(line);

// comm.append("\n");

}

}

public static void main(String[] args) {

new MailSender(true);

}

}

(2)邮件接收端源代码

package mailoper;

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;

import java.io.InputStreamReader; import java.io.PrintWriter;

import https://www.doczj.com/doc/2110393181.html,.ServerSocket;

import https://www.doczj.com/doc/2110393181.html,.Socket;

import java.text.SimpleDateFormat; import java.util.Date;

import java.util.Properties;

/**

* 收信端服务器

* @author shx

*

*/

public class MailReceiver {

private ServerSocket server;

private Socket socket;

private PrintWriter pw;

private BufferedReader reader; private int count;

private Logger logger;

private PrintWriter ps;

private PrintWriter out;

private SimpleDateFormat df; private Date date;

public void receiveMail(){

df = new SimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒"); date = new Date();

String str = df.format(date);

int cot = 0;

Properties pr = null;

try {

FileInputStream count = new FileInputStream("letter\\count.data");

pr = new Properties();

pr.load(count);

String temp = pr.getProperty("count");

System.out.println("Befor cot++:" + temp);

cot = Integer.parseInt(temp) + 1;

String fileName = "letter\\letter" + cot + ".data" ;

ps = new PrintWriter(new FileOutputStream("ServerLog.txt",true),true);

out = new PrintWriter(new FileOutputStream(fileName,true),true);

} catch (FileNotFoundException e1) {

e1.printStackTrace();

} catch(IOException e){

e.printStackTrace();

}

logger = new Logger(ps);

logger.log("MailReceiver","Info","开始记录日志...");

try {

server = new ServerSocket(25);

// 写日志文件

logger.log("MailReceiver","Info","服务器启动等待连接......");

System.out.println("服务器启动等待连接......");

// 启动服务

socket = server.accept();

// 写日志文件

out.println("时间:" +str.substring(0,14) + " 收到信件");

logger.log("MailReceiver","Info","收到主机" + socket.getInetAddress() + socket.getInetAddress().getHostName() +"的连接请求!");

System.out.println("收到主机" + socket.getInetAddress() +

socket.getInetAddress().getHostName() +"的连接请求!");

pr.setProperty("count",new Integer(cot).toString());

pr.store(new FileOutputStream("letter\\count.data"),"count");

pw = new PrintWriter(socket.getOutputStream());

reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

send("220 https://www.doczj.com/doc/2110393181.html, SMTP CSUSOFTMAIL (Postfix Rules!)" + "\t\n");

receive();

send("250 OK https://www.doczj.com/doc/2110393181.html," + "\t\n");

receive();

send("250 OK Sender" + "\t\n");

receive();

send("250 OK Receiver" + "\t\n");

receive();

send("354 Start mail input; end with ." + "\t\n");

receiveData();// 接收Date

// receive();

send("250 OK" + "\t\n");

receive();

send("221 https://www.doczj.com/doc/2110393181.html, Service closing transmission channel !GoodBye...");

S: 220 https://www.doczj.com/doc/2110393181.html,

C: HELO https://www.doczj.com/doc/2110393181.html,

S: 250 Hello https://www.doczj.com/doc/2110393181.html,, pleased to meet you

C: MAIL FROM:

S: 250 Sender OK

C: RCPT TO: bob@https://www.doczj.com/doc/2110393181.html,

S: 250 Recipient OK

C: DA TA

S: 354 Enter mail, end with "." on a line by its self

C: Do you like ketchup?

C: How about pickles?

C: .

S: 250 Message accepted for delivery

C: QUIT

S: 221 https://www.doczj.com/doc/2110393181.html, closing connection

} catch (IOException e) {

e.printStackTrace();

} finally{

if(server != null){

try {

server.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if(socket != null){

try {

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

public void receive(){

count++;

String str = null;

try {

if(!(str = reader.readLine()).trim().equals("")){

System.out.println(count + "收到客户端信息:" + str);

logger.log("MailReceiver","Info","收到客户端信息:" + str);

}

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 读取正文并保存到文件

*/

public void receiveData(){

char[] temp = new char[512];

String str = null;

int count = 0;

try {

while(!(str = reader.readLine()).trim().equals(".")){

count++;

System.out.println("收到客户端Date信息:" + str);

logger.log("MailReceiver","Info","收到客户端信息:" + str.trim());

// 消除开头换行

if(count >= 4 && count <=11){

}else {

out.println(str);

}

}

System.out.println("收到客户端Date信息:" + str);

logger.log("MailReceiver","Info","收到客户端信息:" + str.trim());

} catch (IOException e) {

e.printStackTrace();

}

}

public void send(String str){

logger.log("MailReceiver","Info","服务器发送信息:" + str.trim());

pw.print(str);

pw.flush();

}

public static void main(String[] args) {

MailReceiver mr = new MailReceiver();

while(true){

mr.receiveMail();

}

}

}

(3)邮件阅读源代码

package mailoper;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.Properties;

public class ReadLetter {

public int getCount() {

int count = 0;

try {

FileInputStream in = new FileInputStream("letter\\count.data");

Properties pr = new Properties();

pr.load(in);

count = Integer.parseInt(pr.getProperty("count"));

} catch (IOException e) {

e.printStackTrace();

}

return count;

}

public String readLetter(String file) {

String str = "";

try {

int temp = getCount();

for (int i = 1; i <= temp; i++) {

String fileName = "MailSender\\letter\\letter" + i + ".data";

FileInputStream in = new FileInputStream(fileName);

BufferedReader reader = new BufferedReader(new InputStreamReader(in));

System.out.println("************************");

String tem = null;

str = str + "信件" + i + ":
";

int count = 0;

while ((tem = reader.readLine()) != null) {

count++;

str = str + tem + "
";

System.out.println(tem.trim());

}

str = str + "
";

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return str;

}

public static void main(String[] args) {

new ReadLetter().readLetter();

}

}

11.2 实验内容

1.实验目的

学习电子邮件系统的工作原理,深入理解SMTP协议,熟悉多媒体邮件格式和Base64编码,掌握简化的SMTP邮件服务器的设计与实现方法。

常用协议对应的端口号

标题:常用协议对应的端口号 由Anonymous 于星期日, 04/01/2007 - 01:28 发表 DHCP:服务器端的端口号是67 DHCP:客户机端的端口号是68 POP3:POP3仅仅是接收协议,POP3客户端使用SMTP向服务器发送邮件。POP3所用的端口号是110。 SMTP:端口号是25。SMTP真正关心的不是邮件如何被传送,而只关心邮件是否能顺利到达目的地。SMTP具有健壮的邮件处理特性,这种特性允许邮件依据一定标准自动路由,SMTP具有当邮件地址不存在时立即通知用户的能力,并且具有在一定时间内将不可传输的邮件返回发送方的特点。 Telnet:端口号是23。Telnet是一种最老的Internet应用,起源于ARPNET。它的名字是“电信网络协议(Telecommunication Network Protocol)”的缩写。 FTP:FTP使用的端口有20和21。20端口用于数据传输,21端口用于控制信令的传输,控制信息和数据能够同时传输,这是FTP的特殊这处。FTP采用的是TCP连接。 TFTP:端口号69,使用的是UDP的连接。 端口号的作用及常见端口号用途说明 IP协议是由TCP、UDP、ARP、ICMP等一系列子协议组成的。其中,主要用来做传输数据使用的是TCP和UDP协议。在TCP和UDP协议中,都有端口号的概念存在。端口号的作用,主要是区分服务类别和在同一时间进行多个会话。 举例来说,有主机A需要对外提供FTP和WWW两种服务,如果没有端口号存在的话,这两种服务是无法区分的。实际上,当网络上某主机B需要访问A的FTP服务时,就要指定目的端口号为21;当需要访问A的WWW服务时,则需要将目的端口号设为80,这时A根据B访问的端口号,就可以区分B的两种不同请求。这就是端口号区分服务类别的作用。 再举个例子:主机A需要同时下载网络上某FTP服务器B上的两个文件,那么A需要与B同时建立两个会话,而这两个传输会话就是靠源端口号来区分的。在这种情况下如果没有源端口号的概念,那么A就无法区分B传回的数据究竟是属于哪个会话,属于哪个文件。而实际上的通信过程是,A使用本机的1025号端口请求B的21号端口上的文件1,同时又使用1026号端口请求文件2。对于返回的数据,发现是传回给1025号端口的,就认为是属于文件1;传回给1026号端口的,则认为是属于文件2。这就是端口号区分多个会话的作用。 如果说IP地址让网络上的两个节点之间可以建立点对点的连接,那么端口号则为端到端的连接提供了可能。理解端口号的概念,对于理解TCP/IP协议的通信过程有着至关重要的作用。 端口号的范围是从1~65535。其中1~1024是被RFC 3232规定好了的,被称作“众所周知的端口”(Well Known Ports);从1025~65535的端口被称为动态端口(Dynamic Ports),

SMTP协议发邮件流程

HELO v domain >v CRLF > 用 C++ 发邮件 近段时间,实验室电脑的 IP 频繁地改变,搞得想用远程偷下懒都不行。这时想到的 解决方法有:静态IP,动态域名,自己解决。静态 IP 虽然可以自己指定,但一关机后,与 对方冲突就完了,作罢。免费的动态域名又要手机认证,也作罢。最后只能自己解决。解决 方案是写一个程序不断地检测本机 IP ,如果改变了,就发邮件通知。检测本机 IP 很简单, 就略过。这里介绍下怎样发邮件吧。 发邮件前,需要理解 SMTP(Simple Mail Transfer Protocol) 。 SMTP 是电子邮件从 客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请 求/ 响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个 表示返回状态的三位数字代码。在 TCP 协议 25 端口监听连接请求。其命令如下: SMTP 命令 命令说明 识 别发送方到接收 SMTP 的一个 HELO 命令 AUTH LOGIN 登陆服务器的命令。在这条命令之后,要发送用 Base64 编 码后的用户名与密码进行登陆 MAIL FROM: v reverse-path >v CRLF>v reverse-path >为发送者地址。 此命令告 诉接收方一个新邮件发送的开始, 并对所有的状态和缓冲区进行初始化。 此命令开始一个邮 件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。

RCPT TO:v forward-path >v CRLF>v forward-path >标识各个邮件接收者的地

常见网络端口和网络协议

常见网络端口和网络协议 常见端口号: HTTP——80 FTP——21 TELNETt——23 SMTP ——25 DNS——53 TFTP——69 SNMP——161 RIP——520 查看端口状况: Netstat –n 应用层、表示层、会话层(telnet、ftp、snmp、smtp、rpc) 传输层、网络层(IP、TCP、OSPF、RIP、ARP、RARP、BOOTP、ICMP) 端口号的范围: 0~255 公共应用 255~1023 商业公司 1024~65535 没有限制 或: 1-1023 众所周知端口 >=1024 随机端口 下面介绍的这些端口都是服务器默认的端口,所以认识这些服务器端口对我们学习,和故障排错时很有帮助的。 下面列出了这些服务所对应的端口。 ftp-data20/tcp#FTP, data ftp21/tcp#FTP. control telnet23/tcp smtp25/tcp mail#Simple Mail Transfer Protocol pop3110/tcp#Post Office Protocol - Version 3 domain53/udp#Domain Name Server tftp69/udp#Trivial File Transfer http80/tcp www www-http#World Wide Web https443/tcp ms-sql-s1433/tcp#Microsoft-SQL-Server ms-sql-m1434/udp#Microsoft-SQL-Monitor 终端服务3389/tcp [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal

利用wireshark分析SMTP、POP3协议实验报告

. .. ... 利用wireshark分析SMTP、POP3协议实验报告

利用wireshark分析SMTP、POP3协议实验报告一、实验目的 利用wireshark抓包,分析SMTP协议和POP3协议容。 二、实验环境 连接Internet的计算机,系统为windows8.1; Foxmail,软件版本为7.2; Wireshark,软件版本为1.10.7。 三、实验过程 1.登陆及接收过程(POP3协议) 1)操作过程 打开wireshark开始俘获。然后打开Foxmail,输入用户名,密码,POP 服务器,SMTP服务器,如下图:

然后点击创建,登陆成功如下图: 然后点击收取,结果如下图: 打开wireshark,停止俘获,并保存(结果“capture_for_emailLogin.pcapng”另附)。 2)结果分析

因为POP3协议默认的传输协议是TCP协议,因此连接服务器要先进行三次握手,如下图: 连接成功,主机向服务器发送明文用户名和密码,如下图: 认证成功,开始接收处理,主机先向服务器发送SATA命令,得到数量: 主机向服务器发送LIST命令,得到每封的大小:

主机向服务器发送UIDL命令,得到这四封的唯一标示符: 最后主机向服务器发送QUIT命令,回话结束: 2.邮寄发送过程(SMTP协议) 1)操作过程 打开wireshark,开始俘获。然后打开Foxmail,点击写,写一封,点发送,如下图:

然后打开wireshark,停止俘获,并保存(结果 “capture_for_emailSend.pcapng”另附)。 2)结果分析 因为SMTP协议是基于TCP协议的,所以要先进行三次握手: 主机向服务器发送EHLO加上主机名(val-pc),服务器响应并回复250,表示服务器可用: 主机向服务器发送发送用户登录命令“AHTU LOGIN”,服务器回复334,表示接受: 因为SMTP要求用户名和密码必须经过64位编码后发送,不接受明文。所以客户端分别向服务器发送编码后的用户名和密码,服务器分别回复334和235表示接受和通过: 客户端先后向服务器发送“MAIL FROM”和“RCPT TO”命令,后面分别接上发件人和收件人的地址。服务器分别回复“250 MAIL OK”,表示接受成功: 接下来客户端向服务器发送命令“DATA”,表示将要向服务器发送正文,服务器回应“354 End data with .”表示同意接收:

SMTP协议的命令和应答

从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP 命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,列表如下: SMTP命令命令说明 HELLO<domain><CRLF>识别发送方到接收SMTP的一个HELLO命令 MAILFROM:<reverse-path><CRLF><reverse-path>为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。 RCPTTO:<forward-path><CRLF><forward-path>标识各个邮件接收者的地址 DATA<CRLF> 接收SMTP将把其后的行为看作邮件数据去处理,以<CRLF>.<CRLF>标识数据的结尾。 REST<CRLF>退出/复位当前的邮件传输 NOOP<CRLF>要求接收SMTP仅做OK应答。(用于测试) QUIT<CRLF>要求接收SMTP返回一个OK应答并关闭传输。 VRFY<string><CRLF>验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。 EXPN<string><CRLF>验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。 HELP<CRLF>查询服务器支持什么命令 注:<CRLF>为回车、换行,ASCII码分别为13、10(十进制)。 SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成。一些较复杂的邮件程序利用该特点,首先检查应答码的首数字,并根据其值来决定下一步的动作。下面将SMTP的应答码列表如下: 应答码说明 501参数格式错误 502命令不可实现 503错误的命令序列 504命令参数不可实现 211系统状态或系统帮助响应 214帮助信息 220<domain>服务就绪 221<domain>服务关闭 421<domain>服务未就绪,关闭传输信道 250要求的邮件操作完成 251用户非本地,将转发向<forward-path> 450要求的邮件操作未完成,邮箱不可用 550要求的邮件操作未完成,邮箱不可用 451放弃要求的操作;处理过程中出错 551用户非本地,请尝试<forward-path> 452系统存储不足,要求的操作未执行

常用端口号和协议对照表

TCP 1=TCP Port Service Multiplexer TCP 2=Death TCP 5=Remote Job Entry,yoyo TCP 7=Echo TCP 11=Skun TCP 12=Bomber TCP 16=Skun TCP 17=Skun TCP 18=消息传输协议,skun TCP 19=Skun TCP 20=FTP Data,Amanda TCP 21=文件传输,Back Construction,Blade Runner,Doly Trojan,Fore,FTP trojan,Invisible FTP,Larva, WebEx,WinCrash TCP 22=远程登录协议 TCP 23=远程登录(Telnet),Tiny Telnet Server (= TTS) TCP 25=电子邮件(SMTP),Ajan,Antigen,Email Password Sender,Happy 99,Kuang2,ProMail trojan,Shtrilitz,Stealth,Tapiras,Terminator,WinPC,WinSpy,Haebu Coceda TCP 27=Assasin TCP 28=Amanda TCP 29=MSG ICP TCP 30=Agent 40421 TCP 31=Agent 31,Hackers Paradise,Masters Paradise,Agent 40421 TCP 37=Time,ADM worm TCP 39=SubSARI TCP 41=DeepThroat,Foreplay TCP 42=Host Name Server TCP 43=WHOIS TCP 44=Arctic TCP 48=DRAT TCP 49=主机登录协议 TCP 50=DRAT TCP 51=IMP Logical Address Maintenance,Fuck Lamers Backdoor TCP 52=MuSka52,Skun TCP 53=DNS,Bonk (DOS Exploit) TCP 54=MuSka52 TCP 58=DMSetup TCP 59=DMSetup TCP 63=whois++ TCP 64=Communications Integrator TCP 65=TACACS-Database Service TCP 66=Oracle SQL*NET,AL-Bareki TCP 67=Bootstrap Protocol Server TCP 68=Bootstrap Protocol Client

实验10 使用Wireshark分析SMTP和POP3协议

实验十使用Wireshark分析SMTP和POP3协议 一、实验目的 分析SMTP和POP3协议 二、实验环境 与因特网连接的计算机,操作系统为Windows,安装有Wireshark、IE等软件。三、实验步骤 大多数电子邮件客户端允许用户撰写电子邮件并将其方到发件箱中,还能发送发件箱中的邮件,接收新邮件到收件箱。大多数用户都知道必须连接到因特网才能发送和接收邮件,但他们可能不知道网络通信的细节。 发送邮件的过程和接收邮件的过程截然不同,它们甚至使用不同的应用层协议。电子邮件客户端通常使用邮件传送协议(Simple Mail Transfer Protocol, SMTP)来发送邮件,并用邮局协议(Post Office Protocol, POP)接收邮件。客户端发送邮件时,通常连接一台独立的本地邮件服务器,并将所有外发的邮件发送到这个服务器而不管接收者的地址。本地邮件服务器将报文放在发送邮件队列中。此时,电子邮件客户端不再涉及邮件的传输,而由本地邮件服务器负责对每个接收者传送邮件。SMTP不仅用于电子邮件客户端和本地邮件服务器之间的数据传输,而且还用于本地邮件服务器和每一个接收者的邮件服务器之间的数据传输。 一旦电子邮件报文到达接收者的邮件服务器,就随同该用户的其他接收邮件报文一起放在邮件队列中,用户可以通过类似的POP这样的协议来获取所有的接收邮件。 1、俘获发送邮件时SMTP分组 (1)启动IE,在IE工具栏中选择“邮件”-> “阅读邮件”,出现Outlook界面,在Outlook中选择“工具”->“选项”->“邮件设置”-> “电子邮件帐户...”,出现“电子邮件帐户”窗口,选择“添加新电子邮件帐户”,单击“下一步”,选择“POP3(P)”,单击“下一步”,将会出现如下界面:

SMTP简单邮件传输协议

一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非TCP 传输层协议组成。使用 SMTP ,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输。 在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一跳 IP 地址。 在传输文件过程中使用25号端口 编辑本段协议原理 SMTP-简单邮件传输协议(SimpleMailTransferProtocol),是定义邮件传输的协议,它是基于TCP服务的应用层协议,由RFC0821所定义。SMTP协议规定的命令是以明文方式进行的。为了说明SMTP的工作原理,我们以向163发送邮件为实例进行说明。 在linux环境下,使用"telnet smtp.163. com 25"连接smtp.163. com 的25号端口(SMTP的标准服务端口);在windows下使用telnet程序,远程主机指定为smtp.163. com,而端口号指定为25,然后连接smtp.163. com:交互过程如下: SMTP [lix@nslix]$telnet smtp.163. com 25 220 163 .com Anti-spam GT for Coremail System (163com[071018]) HELO smtp.163 .com 250 OK auth login 334 dXNlcm5hbWU6 USER base64加密后的用户名 334 UGFzc3dvcmQ6 PASS base64加密后的密码 235 Authentication successful MAILFROM:XXX@163 .COM 250 Mail OK RCPTTO:XXX@163 .COM

常用协议端口号

常用协议端口号 1813端口使用UDP传输 3306端口使用TCP传输 Tracert 默认使用UDP 数据包来探测路由路径, 端口为33434 TCP协议支持 协议名称TCP端口号协议名称解释 ACAP 674 AIM 5190 BEEP 10288 CAST 4224 CMP 829 COPS 3288 PKTCABLE_COPS 2126 PKTCABLE_MM_COPS 3918 DAAP 3689 DHCPFO 519 DIAMETER 3868 DISTCC 3632 DLSW 2065 NP 20000 NS 53

DSI 548 FTPDATA 20 FTP 21 GIFT 1213 CS 1720 HTTP 80 PROXY_HTTP 3128 PROXY_ADMIN_HTTP 3132 HKP 11371 DAAP 3689 SSDP 1900 IB 3050 ICAP 1344 IMAP 143 IRC 6667 ISAKMP 500 JABBER 5222 KERBEROS 88 LAPLINK 1547 LDAP 389 GLOBALCAT_LDAP 3268

PRINTER 515 MBTCP 502 MSNMS 1863 MSRP 0 MySQL 3306 NBSS 139 CIFS 445 NCP 524 NDMP 10000 PA 0x0d44 BROKER 0x0bc6 SRS 0x0bca ENS 0x0bc8 RMS 0x0bcb NOTIFY_LISTENER 0x0bc9 NETSYNC 5253 NNTP 119 NTP 123 POP 110 PPTP 1723 PVFS2 3334

SMTP与POP协议简析

SMTP、POP协议简析

作者:李鹏博时间:2016/06

1.SMTP协议与POP协议说明 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 POP(Post Office Protocol)即邮局协议,用于电子邮件的接收。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。本文只介绍POP3。 2.SMTP协议简析 通过抓包,可以看到清晰的服务器与客户端的交流过程。如下图。

如上图,将整个流程分为三部分:握手阶段、认证阶段、发送数据阶段。其中TCP三次握手在上图中未体现,握手成功后,进入认证阶段。 SMTP命令字说明 HELO客户端为标识自己的身份而发送的命令(通常带域名) EHLO使服务器可以表明自己支持扩展简单邮件传输协议(ESMTP) 命令。 MAIL FROM标识邮件的发件人;以MAIL FROM: 的形式使用。 RCPT TO标识邮件的收件人;以RCPT TO: 的形式使用。 DATA客户端发送的、用于启动邮件内容传输的命令。 RSET使整个邮件的处理无效,并重置缓冲区。 QUIT终止会话。 对于服务器的每个回复,都有一个返回码,这个返回码标志着上次的请求操作完成状态。如果第一个数字是2表示操作成功;3表示操作正在进行;5表示操作失败。 握手阶段 认证阶段 握手成功后,邮件服务器(上面示例是163的邮件服务器)会发送欢迎连接信息。然后是客户端HELO(或EHLO),向服务器标识用户身份;接下来进行认证操作。认证成功后,客户端告诉服务器这封邮件从哪个邮箱来,到哪个邮箱去,mail from只有一个,但是recpt to 后面可以跟多个收件人地址。成功后,客户端请求发送邮件数据。 数据发送阶段 服务器回复DATA命令后,会有一个结束符说明。如上图,就是以.结束邮件DATA。其中即为“\r\n”;

协议号和端口号的区别

协议号和端口号的区别 协议号和端口号的区别 网络层-数据包的包格式里面有个很重要的字段叫做协议号。比如在传输层如果是tcp连接,那么在网络层ip包里面的协议号就将会有个值是6,如果是udp 的话那个值就是17-----传输层 传输层--通过接口关联(端口的字段叫做端口)---应用层,详见RFC 1700 协议号是存在于IP数据报的首部的20字节的固定部分,占有8bit.该字段是指出此数据报所携带的是数据是使用何种协议,以便目的主机的IP层知道将数据部分上交给哪个处理过程。也就是协议字段告诉IP层应当如何交付数据。 而端口,则是运输层服务访问点TSAP,端口的作用是让应用层的各种应用进程都能将其数据通过端口向下交付给运输层,以及让运输层知道应当将其报文段中的数据向上通过端口交付给应用层的进程。 端口号存在于UDP和TCP报文的首部,而IP数据报则是将UDP或者TCP报文做为其数据部分,再加上IP数据报首部,封装成IP数据报。而协议号则是存在这个IP数据报的首部. 比方来说: 端口你在网络上冲浪,别人和你聊天,你发电子邮件,必须要有共同的协议,这个协议就是TCP/IP协议,任何网络软件的通讯都基于TCP/IP协议。如果把互联网比作公路网,电脑就是路边的房屋,房屋要有门你才可以进出,TCP/IP 协议规定,电脑可以有256乘以256扇门,即从0到65535号“门”,TCP/IP协议把它叫作“端口”。当你发电子邮件的时候,E-mail软件把信件送到了邮件服务器的25号端口,当你收信的时候,E-mail软件是从邮件服务器的110号端口这扇门进去取信的,你现在看到的我写的东西,是进入服务器的80端口。 关于端口,再做一些补充 现在假设我们有一台服务器,别人可以用一种tcp/ip协议的一种如ftp登录上我们的机器上进行文件的上传下载,但是同时我们又希望别人能够浏览我们的web服务器,如果要是没有端口,那末很显然,我们无法区分这两种不同的服务,同时客户端也无法区分我们给他提供了那种服务。我们现在采用端口来解决这个问题,在使用tcp/ip协议在主机上建立服务之前,我们必须制定端口,指定端口号将表示运行的是那种服务。 比如,客户端发送一个数据包给ip,然后ip将进来的数据发送给传输协议(tcp 或者udp),然后传输协议再根据数据包的第一个报头中的协议号和端口号来决定将此数据包给哪个应用程序(也叫网络服务)。也就是说,协议号+端口号唯一的确定了接收数据包的网络进程。由于标志数据发送进程的'源端口号'和标志数据接受进程的'目的端口号'都包含在每个tcp段和udp段的第一个分组中,系统可以知道到底是哪个客户应用程序同哪个服务器应用程序在通讯,而不会将数据发送到别的进程中。 但是要注意的一点是同样的一个端口在不同的协议中的意义是不同的,比如tcp和udp中的端口31指的并不是同一个端口。但是对于同一个协议,端口号确实唯一的。

常用协议及端口号

Ethereal支持的常用协议端口号 TCP协议支持 协议名称TCP端口号协议名称解释 ACAP 674 AIM 5190 BEEP 10288 CAST 4224 CMP 829 COPS 3288 PKTCABLE_COPS 2126 PKTCABLE_MM_COPS 3918 DAAP 3689 DHCP FO 519 DIAMETER 3868 DISTCC 3632 DLSW 2065 NP 20000 NS 53 DNS5353 DSI 548 FTP DATA 20 FTP21 GIFT 1213 CS 1720 HTTP 80

PROXY_HTTP 3128 PROXY_ADMIN_HTTP 3132 HKP 11371 DAAP 3689 SSDP 1900 IB 3050 ICAP 1344 IMAP 143 IRC 6667 ISAKMP 500 JABBER 5222 KERBEROS 88 LAPLINK 1547 LDAP 389 GLOBALCAT_LDAP 3268 LDP 646 PRINTER 515 MB TCP502 MSNMS 1863 MSRP 0 MySQL 3306 NBSS 139 CIFS 445 NCP 524 NDMP 10000 PA 0x0d44

BROKER 0x0bc6 SRS 0x0bca ENS 0x0bc8 RMS 0x0bcb NOTIFY_LISTENER 0x0bc9 NETSYNC 5253 NNTP 119 NTP 123 POP 110 PPTP 1723 PVFS2 3334 RMI 1099 RSH 514 RSYNC 873 RTSP 554 SIP 5060 SKINNY 2000 SLSK_1 2234 SLSK_2 5534 SLSK_3 2240 SMRSE 4321 SMTP25 SNMP161 SNMP_TRAP 162 SMUX 199 SOCKS 1080

利用wireshark分析SMTP、POP3协议实验报告

利用wireshark分析SMTP、POP3协议实验报告

利用wireshark分析SMTP、POP3协议实验报告 一、实验目的 利用wireshark抓包,分析SMTP协议和POP3协议内容。 二、实验环境 连接Internet的计算机,系统为windows8.1; Foxmail,软件版本为7.2; Wireshark,软件版本为1.10.7。 三、实验过程 1.邮箱登陆及接收过程(POP3协议) 1)操作过程 打开wireshark开始俘获。然后打开Foxmail邮箱,输入用户名,密码,POP 服务器,SMTP服务器,如下图: 然后点击创建,登陆成功如下图:

然后点击收取,结果如下图: 打开wireshark,停止俘获,并保存(结果“capture_for_emailLogin.pcapng”另附)。 2)结果分析 因为POP3协议默认的传输协议是TCP协议,因此连接服务器要先进行三次握手,如下图:

连接成功,主机向服务器发送明文用户名和密码,如下图: 认证成功,开始接收处理,主机先向服务器发送SATA命令,得到邮件数量: 主机向服务器发送LIST命令,得到每封邮件的大小:

主机向服务器发送UIDL命令,得到这四封邮件的唯一标示符: 最后主机向服务器发送QUIT命令,回话结束: 2.邮寄发送过程(SMTP协议) 1)操作过程 打开wireshark,开始俘获。然后打开Foxmail,点击写邮件,写一封邮件,点发送,如下图: 然后打开wireshark,停止俘获,并保存(结果“capture_for_emailSend.pcapng”另附)。 2)结果分析

基于POP3与SMTP协议的邮件收发程序的开发

一、设计思想 电子邮件指用电子手段传送信件、单据、资料等信息的通信方法。电子邮件综合了电话通信和邮政信件的特点,它传送信息的速度和电话一样快,又能象信件一样使收信者在接收端收到文字记录。电子邮件系统又称基于计算机的邮件报文系统。它承担从邮件进入系统到邮件到达目的地为止的全部处理过程。电子邮件不仅可利用电话网络, 而且可利用任何通信网传送。在利用电话网络时, 还可利用其非高峰期间传送信息,这对于商业邮件具有特殊价值。由中央计算机和小型计算机控制的面向有限用户的电子系统可以看作是一种计算机会议系统。 电子邮件的工作过程遵循客户- 服务器模式。每份电子邮件的发送都要涉及到发送方与接收方,发送方式构成客户端,而接收方构成服务器,服务器含有众多用户的电子信箱。发送方通过邮件客户程序,将编辑好的电子邮件向邮局服务器(SMTP服务器)发送。邮局服 务器识别接收者的地址,并向管理该地址的邮件服务器(POP3服务器)发送消息。 一个邮件系统的传输包含用户代理User Agent 传输代理TransferAgent 及接受代理DeliveryAgent 三大部分。 用户代理是一个用户发信和收信的程序, 负责将电子邮件按照一定的标准包装,然后送至邮件服务器, 或由邮件服务器收回。传输代理负责信件的交换和传输。将信件传送至适当的邮件主机, 再由接受代理将信件分发至不同的邮件信箱。传输代理必须要能够接受用户邮件程序送来的信件,解读收信人的地址,根据SMTP协议将它正确无误地传递到目的地。现在一般的传输代理已采用Sendmail 程序完成工作。电子邮件到达邮件主机后, 在经接收代理POP协议被用户读取至自己的主机。 电子邮件在发送与接收过程中都要遵循SMTP POP3等协议,这些协议确保了电子邮件 在各种不同系统之间的传输。其中,SMTP负责电子邮件的发送,而POP3则用于接收In ternet 上的电子邮件。 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/ IP协议族, 它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器, 我们就可以把E—mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP!务器则是遵循SMTP 协议的发送邮件服务器,用来发送或中转你发出的电子邮件。 POP3(Post Office Protocol 3)即邮局协议,目前已发展到第三版,称POP3它规 定怎样将个人计算机连接到Internet 的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议 的接收邮件服务器,用来接收电子邮件的。总的来说POP3协议是让用户把服务器上的信收 到本地来所需要的一种协议。 本程序为一个基于SMTP和POP3协议的小型EMAIL收发程序,简单的实现了邮件的收发功能。

常见端口号对应的协议

协议号 ip 0 IP # In ternet protocol 互联网协议icmp 1 ICMP # Internet con trol message ggp 3 GGP # Gateway-gateway protocol tcp 6 TCP # Tran smissi on con trol protocol egp 8 EGP # Exterior gateway protocol pup 12 PUP # PARC uni versal packet udp 17 UDP # User datagram protocol hmp 20 HMP # Host mon itori ng protocol xn s-idp 22 XNS-IDP # Xerox NS IDP rdp 27 RDP # "reliable datagram" protocol ipv6 41 IPv6 # In ternet protocol IPv6 ipv6-route IPv6-Route # Routi ng header for IPv6 ipv6-frag 44 IPv6-Frag # Fragme nt header for IPv6 esp 50 ESP # Encapsulating security payload ah 51 AH # Authe nticati on header ipv6-icmp 58 IPv6-ICMP # ICMP for IPv6 ipv6-nonxt IPv6-NoNxt # No next header for IPv6 ipv6-opts 60 IPv6-Opts # Dest in ati on optio ns for IPv6 rvd 66 RVD # MIT remote virtual disk 端口编号

协议号和端口号大全

协议号和端口号大全 协议号和端口号大全协议号是存在于IP数据报的首部的20字节的固定部分,占有8bit.该字段是指出此数据报所携带的是数据是使用何种协议,以便目的主机的IP层知道将数据部分上交给哪个处理过程。 也就是协议字段告诉IP层应当如何交付数据。 而端口,则是运输层服务访问点TSAP,端口的作用是让应用层的各种应用进程都能将其数据通过端口向下交付给运输层,以及让运输层知道应当将其报文段中的数据向上通过端口交付给应用层的进程。 端口号存在于UDP和TCP报文的首部,而IP数据报则是将UDP或者TCP报文做为其数据部分,再加上IP数据报首部,封装成IP数据报。 而协议号则是存在这个IP数据报的首部.IP协议号0HOPOPT IPv6逐跳选项1ICMP Inter控制消息2IGMP Inter组管理3GGP网关对网关4IP IP中的IP(封装)5ST流6TCP传输控制7CBT CBT8EGP外部网关协议9IGP任何专用内部网关(Cisco将其用于IGRP) 10BBN-RCC-MON BBNRCC监视11NVP-II网络语音协议12PUP PUP13ARGUS ARGUS14EMCON EMCON15XNET跨网调试器16CHAOS Chaos17UDP用户数据报18MUX多路复用19D-MEAS D测量子系统20HMP 主机监视21PRM数据包无线测量22XNS-IDP XEROXNS IDP23TRUNK-1第1主干24TRUNK-2第2主干25LEAF-1第1叶26LEAF-2第2叶27RDP 可靠数据协议28IRTP Inter可靠事务29ISO-TP4ISO传输协议第4类

Wireshark抓包分析资料报告POP3和SMTP协议详情

Wireshark抓包分析POP3和SMTP协议 一、实验目的 1.初步掌握Wireshark的使用方法,熟悉抓包流程; 2.通过对Wireshark抓包实例进行分析,加强对POP3协议和 SMTP协议的理解; 3.培养动手实践能力和自主学习自主探究的精神。 二、实验要求 利用Wireshark软件抓包,得到登录的信息和发送的信息,并根据所抓包对POP3协议和SMTP协议进行分析。 三、实验环境 1.系统环境:Windows 8专业版 2.接收:Foxmail 6正式版 3.Wireshark:V1. 4.9 四、实验过程 (一)登录及接收过程(POP3协议) 1.POP3协议简介[1] POP3(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的服务器进行收发的

协议。它是因特网电子的第一个离线协议标准,POP3协议允许用户从服务器上把存储到本机主机上,同时根据客户端的操作删除或保存在服务器上的。而POP3服务器则是遵循POP3协议的接收服务器,用来接收电子的。POP3协议是TCP/IP协议族中的一员,由RFC 1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子。 2.实验过程 (1)准备工作 ●申请一个126 ●安装并配置Foxmail,将接收和发送的服务器分别设置 为POP3服务器和SMTP服务器 ●在安装好的Foxmail上添加申请到的126账户

添加后的信息 (2)打开Wireshark软件,选择正在联网的网卡,开始抓包。 (3)打开Foxmail,选择账号登录,点击左上角收取,开始连接服务器。

SMTP协议原理

SMTP协议原理 SMTP协议原理 SMTP-简单邮件传输协议(SimpleMailTransferProtocol),是定义邮件传输最常用的协议,它是基于TCP服务的应用层协议,由RFC821所定义。SMTP协议规定的命令是以明文方式进行的。为了说明SMTP的工作原理,我们以向163发送邮件为实例进行说明。 在linux环境下,使用"telnet smtp.163. com 25"连接smtp.163. com的25号端口(SMTP的标准服务端口);在windows下使用telnet程序,远程主机指定为smtp.163. com,而端口号指定为25,然后连接smtp.163. com:交互过程如下:[lix@nslix]$telnet smtp.163. com 25 220 163 .com Anti-spam GT for Coremail System (163com[071018]) HELO smtp.163 .com 250 OK auth login 334 dXNlcm5hbWU6 USER base64加密后的用户名 334 UGFzc3dvcmQ6 PASS base64加密后的密码 235 Authentication successful MAILFROM:XXX@163 .COM

250 Mail OK RCPTTO:XXX@163 .COM 250 Mail OK DATA 354 End data with . QUIT 250 Mail OK queued as smtp5,D9GowLArizfIFTpIxFX8AA==.41385S2 HELO是客户向对方邮件服务器发出的标识自己的身份的命令,这里假设发送者为ideal;MAILFROM命令用来表示发送者的邮件地址;RCPTTO:标识接收者的邮件地址,这里表示希望发送邮件给XXX@163. COM,如果邮件接收者不是本地用户,例如RCPTTO:ideal,则说明希望对方邮件服务器为自己转发(Relay)邮件,若该机器允许转发这样的邮件,则表示该邮件服务器是OPENRELAY的,否则说明该服务器不允许RELAY;DATA表示下面是邮件的数据部分,输入完毕以后,以一个"."开始的行作为数据部分的结束标识;QUIT表示退出这次会话,结束邮件发送。 这就是一个简单的发送邮件的会话过程,其实当使用outlookexpress等客户软件发送时,后台进行的交互也是这样的,当然,SMTP协议为了处理复杂的邮件发送情况如附件等等,定义了很多的命令及规定,具体可以通过阅读RFC821来获得。当你的一个朋友向你发送邮件时,他的邮件服务器和你的邮件服务器通过SMTP协议通信,将邮件传递给你邮件地址所指示的邮件服务器上(这里假设你的本地邮件服务器是Linux系统),若你通过telnet协议直接登录到邮件服务器上,则可以使用mail 等客户软件直接阅读邮件,但是若你希望使用本地的MUA(MailUserAgent,如

常见的重要网路协议端口号

经常用到的网络协议端口号: 用来规定信息格式;数据及控制信息的格式、编码及信号电平等。用来说明通信双方应当怎么做;用于协调与差错处理的控制信息。)详细说明事件的先后顺序;速度匹配和排序等网际层协议:包括:IP 协议、ICMP 协议、ARP 协议、RARP 协议。传输层协议:TCP 协议、UDP 协议。应用层协议:FTP、Telnet、SMTP、HTTP、RIP、NFS、DNS。TCP (1)FTP:定义了文件传输协议,使用21 端口。常说某某计算机开了FTP 服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP 服务。(2)Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS 模式下的通信服务。如以前的BBS 是纯字符界面的,支持BBS 的服务器将23 端口打开,对外提供服务。(3)SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置中常看到有这么SMTP 端口设置这个栏,服务器开放的是25 号端口。(4)POP3:它是和SMTP 对应,POP3 用于接收邮件。通常情况下,POP3 协议所用的是110 端口。也是说,只要你有相应的使用POP3 协议的程序(例如Foxmail 或Outlook),就可以不以Web 方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是163 邮箱就没有必要先进入网易网站,再进入自己的邮箱来收信)。UDP (1)HTTP:这是大家

用得最多的协议,它就是常说的"超文本传输协议"。上网浏览网页时,就得在提供网页资源的计算机上打开80 号端口以提供服务。常说"WWW服务"、"Web 服务器"用的就是这个端口。(2)DNS:用于域名解析服务,这种服务在Windows NT 系统中用得最多的。因特网上的每一台计算机都有一个网络地址与之对应,这个地址是常说的IP 地址,它以纯数字+"."的形式表示。然而这却不便记忆,于是出现了域名,访问计算机的时候只需要知道域名,域名和IP 地址之间的变换由DNS 服务器来完成。DNS 用的是53 号端口。(3)SNMP:简单网络管理协议,使用161 号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。(1). HTTP 协议代理服务器常用端口号:80/8080/3128/8081/9080 (2). SOCKS 代理协议服务器常用端口号:1080 (3). FTP 协议代理服务器常用端口号:

相关主题
文本预览
相关文档 最新文档