位于因特网电子邮件的核心地位的应用层协议

  • 与普通邮件一样,电子邮件是一种异步通信媒介。
    • 当人们方便时就可以收发邮件,不必与他人的计划进行协调。
    • 无需等待对方的非同步收发邮件
  • 电子邮件特点

    1. 快速分发群发
    2. 价格便宜
    3. 附件,超链接,HTML 格式文本和图片的报文发送

      电子邮件系统的总体情况

      image.png
  • 因特网电子邮件系统 3 个主要组成部分

    • 用户代理 (user agent)
      • 用户代理允许用户阅读,回复,转发,保存和编写报文。
        • 发件人完成邮件的编写
        • 其邮件代理向邮件服务器发送邮件
        • 邮件被放在邮件服务器的外出报文队列中
        • 收件方阅读报文时,其用户代理在其邮件服务器的邮箱中取得响应报文。
    • 邮件服务 (mail server)
      • 邮件服务器形成了电子邮件体系结构的核心。
        • 每个收件人在其中的某个邮件服务器上有一个邮箱 (mailbox)
        • 收件人的邮箱管理和维护者收到的报文
      • 典型邮件发送过程
        • 从发送方的用户代理开始
        • 传输到发送方的邮件服务器
        • 再传输到接收方的邮件服务器
        • 在此处被分发到接收方的邮箱中
        • 接收方在其邮箱中读取报文之前,需要使用用户名和口令来鉴别是否是本人
      • 发送方的邮箱也需要能够处理接收方的邮件服务器的故障。
        • 如果发送方的服务器不能将邮件交付给接收方的服务器
        • 发送方的邮件服务器在一个报文队列 (message queue) 中保持该报文并在以后尝试再次发送。
        • 通常 30 分钟左右进行一次尝试
        • 如果几天后仍不能成功,服务器就删除该报文并以电子邮件的形式通知发送方。
    • 简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP)
      • SMTP 是因特网电子邮件中主要的应用层协议。
      • 使用 TCP 可靠数据传输服务
        • 从发送方的邮件服务器向接收方的邮件服务器发送邮件
      • SMTP 像大多数应用层协议一样拥有两部分
        • 运行在发送方邮件服务器的客户端
        • 运行在接收方邮件服务器的服务器端
        • 每台邮件服务器上既运行 SMTP 客户端也运行 SMTP 的服务端。(收发邮件)

image.png

2.3.1 SMTP

  • RFC 5321给出了 SMTP的定义
  • SMTP是因特网电子邮件的核心
  • SMTP用于从发送方的邮件服务器发送报文到接收方的邮件服务器
  • 它限制所有邮件报文的体部分(不只是其首部)只能采用简单的7比 特ASCII表示
  • 在今天的多媒体时代,7位ASCII的限制的确有点痛苦,即在用SMTP传送邮件之前, 需要将二进制多媒体数据编码为ASCII码,并且在使用SMTP传输后要求将相应的 ASCII 码邮件解码还原为多媒体数据
  • 使用HTTP传送前不需要将多媒 体数据编码为ASCII码(2.2)

    例:Alice想给Bob发送一 封简单的ASCII报文

  1. Alice调用她的邮件代理程序并提供Bob的邮件地址(例如bob® someschool. edu), 撰写报文,然后指示用户代理发送该报文
  2. Alice的用户代理把报文发给她的邮件服务器,在那里该报文被放在报文队列中
  3. 运行在Alice的邮件服务器上的SMTP客户端发现了报文队列中的这个报文,它就 创建一个到运行在Bob的邮件服务器上的SMTP服务器的TCP连接
  4. 在经过一些初始SMTP握手后,SMTP客户通过该TCP连接发送Alice的报文
  5. 在Bob的邮件服务器上,SMTP的服务器端接收该报文。Bob的邮件服务器然后将 该报文放入Bob的邮箱中
  6. 在Bob方便的时候,他调用用户代理阅读该报文

image.png

  • SMTP 一般不使用中间邮件服务器发送邮件,即使这两个邮件服务器位于地球的两端也是这样
  • 假设Alice的邮件服务器在中国香港,而Bob的服 务器在美国圣路易斯,那么这个TCP连接也是从香港服务器到圣路易斯服务器之间的直接 相连
  • 如果Bob的邮件服务器没有开机,该报文会保留在Alice的邮件服务器上 并等待进行新的尝试,这意味着邮件并不在中间的某个邮件服务器存留

  • SMTP是如何将一个报文从发送邮件服务器传送到接收 邮件服务器的

  • SMTP与人类面对面交往的行为方式有许多类似性
  1. 客户SMTP (运行在发送邮件服务器主机上)在25号端口建立一个到服务器 SMTP (运行在接收邮件服务器主机上)的TCP连接
  2. 如果服务器没有开机,客户会 在稍后继续尝试连接
  3. 一旦连接建立,服务器和客户执行某些应用层的握手,就像人 们在互相交流前先进行自我介绍一样
  4. SMTP的客户和服务器在传输信息前先相互介 绍
  5. 在SMTP握手的阶段,SMTP客户指示发送方的邮件地址(产生报文的那个人) 和接收方的邮件地址
  6. 一旦该SMTP客户和服务器彼此介绍之后,客户发送该报文
  7. SMTP能依赖TCP提供的可靠数据传输无差错地将邮件投递到接收服务器
  8. 该客户如 果有另外的报文要发送到该服务器,就在该相同的TCP连接上重复这种处理;否则, 它指示TCP关闭连接

例: 个在SMTP客户(C)和SMTP服务器(S)之间交换报文文本

客户的主机名为crepes, fr,服务器的主机名为hamburger. edu
以C:开头的ASCII码 文本行正是客户交给其TCP套接字的那些行
以S:开头的ASCII码则是服务器发送给其 TCP套接字的那些行
一旦创建了 TCP连接,就开始了下列过程
image.png
客户从邮件服务器crepes, fr向邮件服务器hamburger, edu发送了一个报文 (”Do you like ketchup? How about pickles?” )
作为对话的一部分,该客户发送了 5条命 令:HELO (是 HELLO 的缩写)、MAIL FROM. RCPTTO、DATA 以及 QUIT。这些命令都 是自解释的
该客户通过发送一个只包含一个句点的行,向服务器指示该报文结束了
按照ASCII码的表示方法,每个报文以CRLF. CRLF结束,其中的CR和LF分别表示回 车和换行
服务器对每条命令做出回答,其中每个回答含有一个回答码和一些(可选 的)英文解释
在这里指出SMTP用的是持续连接:如果发送邮件服务器有几个报文 发往同一个接收邮件服务器,它可以通过同一个TCP连接发送这些所有的报文
对每个报 文,该客户用一个新的MAIL FROM: crepes, fr 始,用一个独立的句点指示该邮件的结 束,并且仅当所有邮件发送完后才发送QUITO

尝试:使用Telnet与SMTP服务器进行一次直接对话

  1. telnet serverName 25

serverName是本地邮件服务器的名称
直接在本地主机与邮件 服务器之间建立一个TCP连接
你立即会从该服务器收到220回答
在适当的时机发出 HELO、MAIL FROM、RCPTTO、DATA、CRLF. CRLF 以及 QUIT 等SMTP命令

编程作业3:你将在SMTP的客户 端实现一个简单的用户代理,它允许你经本地邮件服务器向任意的接收方发送电子邮件 报文

2.3.2 SMTP 与 HTTP 的对比

  • 两个协议都用于从一台主机向另一台主机传 送文件
    • HTTP从Web服务器向Web客户(通常是一个浏览器)传送文件(对象)
    • SMTP从一个邮件服务器向另一个邮件服务器传送文件(即电子邮件报文)
  • 当进行文件传送时,持续的HTTP和SMTP都使用持续连接

  • 区别1

    • HTTP主要是一个拉协议(pull protocol), 即在方便的时候,某些人在Web服务器上装载信息,用户使用HTTP从该服务器拉取这些信息。特别是TCP连接是由想接收文件的机器发起的
    • SMTP基本上是一个推协议(push protocol),即发送邮件服务器把文件推向接收邮件服务器。特别是,这个TCP 连接是由要发送该文件的机器发起的。
  • 区别 2
    • SMTP要求每个报文(包括它们的体)采 用7比特ASCII码格式。如果某报文包含了非7比特ASCII字符(如具有重音的法文字 符)或二进制数据(如图形文件),则该报文必须按照7比特ASCII码进行编码。
    • HTTP数 据则不受这种限制
  • 区别 3 是如何处理一个既包含文本又包含图形(也可能是其他媒体类型)的 文档
    • HTTP把每个对象封装到它自己的HTTP响应报文中
    • SMTP则把所有报文对象放在一个报文之中

2.3.3 邮件报文格式

  • RFC 5322 定义了写信人需要在信里加上各种各样的环境首部信息,
    • 这个信息位于报文体前面
    • 包括在一系列首部行中
  • 首部行和该报文的体用空行(回车换行)进行分割
  • 邮件首部行和它们的语义解释的精准格式
  • 和 HTTP 协议一样,每个首部行包括了可读的文本,是由关键词后接冒号及其值组成
    • 某些关键字是必需的,有一些是可选的
  • 每个首部必须含有 From: 首部行和 To: 首部行
  • 这些首部行不同于 2.3.1 节里面所学的 SMTP 命令 (及时包含了相同的词汇 from 和 to)
  • 那些命令是 SMTP 握手协议的一部分,这里的首部行是邮件报文自身的一部分

image.png

  • 报文首部之后,紧接着一个空白行,然后是以 ASCII 格式表示的报文体

尝试:用 Telnet 向服务器发送包含一些首部行的报文

  • 包括 Subject: 首部行

2.3.4 邮件访问协议

  • 一旦SMTP将邮件报文从Alice的邮件服务器交付给Bob的邮件服务器,该报文就被 放入了 Bob的邮箱中
  • 按惯例假定Bob是通过登录到服务器主机,并直 接在该主机上运行一个邮件阅读程序来阅读他的邮件的
  • 之前是这么做的,但是现在 邮件访问使用了一种客户-服务器体系结构,即典型的用户 通过在用户端系统上运行的客户程序来阅读电子邮件,这里的端系统可能是办公室的PC、 便携机或者是智能手机

    • 通过在本地主机上运行邮件客户程序,用户享受一系列丰富的特 性,包括查看多媒体报文和附件的能力
  • 假设Bob (接收方)在其本地PC±运行用户代理程序,考虑在他的本地PC上也 放置一个邮件服务器是自然而然的事

  • Alice的邮件服务器就能直接 与Bob的PC进行对话
  • 前面讲过邮件服务器管理用 户的邮箱,并且运行SMTP的客户端和服务器端 。
  • 如果Bob的邮件服务器位于他的PC 上,那么为了能够及时接收可能在任何时候到达的新邮件,他的PC必须总是不间断 地运行着并一直保持在线。 对于许多因特网用户而言是不现实的
  • 典型的用 户通常在本地PC上运行一个用户代理程序,而它访问存储在总是保持开机的共享邮 件服务器上的邮箱。该邮件服务器与其他用户共享,并且通常由用户的ISP进行维护

  • 考虑当从Alice向Bob发送一个电子邮件报文时所取的路径

  • 在沿着该路径的某些点上,需要将电子邮件报文存放在Bob的邮件服务器上
  • 通过 让Alice的用户代理直接向Bob的邮件服务器发送报文,就能够做到这一点
    • 这能够由 SMTP来完成:实际上,SMTP被设计成将电子邮件从一台主机推到另一台主机
  • 通常Alice的用户代理和Bob的邮件服务器之间并没有一个直接的SMTP对话

    • 如 图2・16所示,Alice的用户代理用SMTP将电子邮件报文推入她的邮II 件服务器,接着她的 邮件服务器(作为一个SMTP客户)再用SMTP将该邮件中继到Bob的邮件服务器
      • 主要是因为不通过Alice的邮件服务器进行中继,Alice的用户代 理将没有任何办法到达一个不可达的目的地接收服务器
    • 通过首先将邮件存放在自己的邮 件服务器中,Alice的邮件服务器可以重复地尝试向Bob的邮件服务器发送该报文,如每 30分钟一次,直到Bob的邮件服务器变得运行为止
    • 并且如果Alice的邮件服务器关机, 她则能向系统管理员进行申告
    • SMTP RFC文档定义了如何使用SMTP命令经过多个 SMTP服务器进行报文中继
  • 值得注意的是Bob 的用户代理不能使用SMTP得到报文,因为取报文是一个拉操作,而SMTP协议是一个推协议

  • 通过引入一个特殊的邮件访问协议来解决这个难题,该协议将Bob邮件服务器上的 报文传送给他的本地PC
  • 目前有一些流行的邮件访问协议,包括第三版的邮局协议(Post Office Protocol—Version 3 , POP3)、因特网邮件访问协议(Internet Mail Access Protocol, IMAP)以及 HTTP

image.png

  • SMTP用来将邮件从发送方的邮件服务器传输到接收方的邮件服务器
  • SMTP也用来将邮件从发送方的用户代理传送到发送方的邮件服务器
    • 如POP3这样的邮件访问协议用来将邮件从接收方的邮件服务器传送到 接收方的用户代理

1. POP3

  • 由 RFC 1939 定义
  • 该协议简单所以功能有限

  • 当用户代理(客户)打开了一个 到邮件服务器(服务器)端口 110上的TCP连接后,POP3就开始工作了

  • 随着建立TCP 连接,POP3按照三个阶段进行工作:特许(authorization)、事务处理以及更新
  1. 特许阶段:当用户代理以明文形式发送用户名和口令以鉴别用户
  2. 事务处理阶段:用户代理取回报文,同时用户代理还能进行对报文做删除标记,取消保温删除标记以及获取邮件的统计信息
  3. 更新阶段:出现在客户发出 quit 命令后,目的是结束该 POP3 会话。该邮件复苏期会删除那些被标记为删除的报文
  • 在 POP3 的事务处理过程中,用户代理发出一些命令,服务器对每个命令做出回答

    1. +0K (有时后面还跟有服务器到客户的数据),被服务器用来指示前面 的命令是正常的
    2. -ERR,被服务器用来指示前面的命令出现了某些差错。
  • 特许阶段有两个主要命令:user 和 pass

    尝试:Telnet 登陆到 POP3 服务器的 110 端口

  • 使用 POP3 的用户代理通常被用户配置为”下载并删除” 或者 “下载并保留” 方式

  • POP3用户代理发岀的命令序列取决于用户代理程 序被配置为这两种工作方式的哪一种

    使用下载并删除方式

  • 用户代理发出list、 retr和 dele命令

  • 假设用户在他(她)的邮箱里有两个报文

image.png

  • 用户代理首先请求邮件服务器列出所有存储的报文的长度
  • 接着用户代理从邮件服务器取回并删除每封邮件
  • 注意到在特许阶段以后,用户代理仅使用四个命令list、retr. dele 和quit,这些命令的语法定义在RFC 1939中。
  • 在处理quit命令后,POP3服务器进入更 新阶段,从用户的邮箱中删除邮件1和2


  • 使用下载并删除方式存在的问题是,邮件接收方Bob可能是移动的,可能希望从多个 不同的机器访问他的邮件报文,如从办公室的PC、家里的PC或他的便携机来访问邮件

  • 下载并删除方式将对Bob的邮件报文根据这3台机器进行划分,特别是如果Bob最先是在 他办公室的PC上收取了一条邮件,那么晚上当他在家里时,通过他的便携机将不能再收 取该邮件

使用下载并保留方式

  • 用户代理下载某邮件后,该邮件仍保留在邮件服务器 上
  • Bob就能通过不同的机器重新读取这些邮件
  • 在用户代理与邮件服务器之间的POP3会话期间,该POP3服务器保留了一些状态信息
    • 特别是记录了哪些用户报文被标记为删除了
  • POP3服务器并不在POP3会话过 程中携带状态信息
  • 会话中不包括状态信息大大简化了 POP3服务的实现

尝试:Telnet 登陆到 POP3 服务器的 110 端口

  • 假设邮件服务器的名字是 mailServer

image.png

  • 如果你的命令拼写错了,该POP3服务器将返回一个- ERR报文

    2. IMAP

  • 使用POP3访问时,一旦Bob将邮件下载到本地主机后,他就能建立邮件文件夹, 并将下载的邮件放入该文件夹中。

  • 然后Bob可以删除报文,在文件夹之间移动报文, 并查询报文(通过发送方的名字或报文主题)
  • 但是这种文件夹和报文存放在本地主 机上的方式,会给移动用户带来问题,因为他更喜欢使用一个在远程服务器上的层次 文件夹,这样他可以从任何一台机器上对所有报文进行访问
  • 使用POP3是不可能做 到这一点的,POP3协议没有给用户提供任何创建远程文件夹并为报文指派文件夹的方法

  • RFC 3501 定义的因特网邮件访问协议(IMAP)

  • 和 POP3 一样,IMAP 也是一个邮件访问协议,但是比 POP3 有更多特色也更复杂
  • IMAP服务器把每个报文与一个文件夹联系起来
  • 当报文第一次到达服务器时,它 与收件人的INBOX文件夹相关联
  • 收件人则能够把邮件移到一个新的、用户创建的文 件夹中,阅读邮件,删除邮件等
  • IMAP协议为用户提供了创建文件夹以及将邮件从一 个文件夹移动到另一个文件夹的命令
  • 提供了在远程文件夹中查询邮件 的命令,按指定条件去查询匹配的邮件
  • 与POP3不同,IMAP服务器 维护了 IMAP会话的用户状态信息
    • 与POP3不同,IMAP服务器 维护了 IMAP会话的用户状态信息
  • IMAP的另一个重要特性是它具有允许用户代理获取报文某些部分的命令

    • 一 个用户代理可以只读取一个报文的报文首部,或只是一个多部分MIME报文的一部分。
    • 当用户代理和其邮件服务器之间使用低带宽连接(一个低速调制解调器链路)
    • 使用这种低带宽连接的用户可能并不想取回邮箱中所有邮件,尤其包含大容量音频和视频的邮件

      3. 基于 Web 的电子邮件

  • 使用这种 Web 浏览器作为邮件收发,那么用户代理就是普通浏览器

  • 用户和远程邮箱之间的通信通过 HTTP 进行
  • 当用户想从邮箱中访问一个报文时,该电子邮件报文从用户的邮件服务器发送到浏览器,使用的是 HTTP 而不是 POP3 或 IMAP 协议
  • 当用户发送邮件报文时,电子邮件报文从发送者浏览器发送到邮箱服务器,使用的是 HTTP 而不十四 SMTP
  • 然而,发送者的邮件服务器 与其他的邮件服务器之间发送和接收邮件 时,仍然使用的是SMTP