IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP/IP详解 卷1:协议 学习笔记 第二十八章 SMTP:简单邮件传送协议 -> 正文阅读

[网络协议]TCP/IP详解 卷1:协议 学习笔记 第二十八章 SMTP:简单邮件传送协议

在这里插入图片描述
用户与用户代理打交道,有多个用户代理可供选择,Unix上常用用户代理包括MH、Berkeley Mail、Elm、Mush。

用TCP进行邮件交换是由报文传送代理MTA(Message Transfer Agent)完成的。最普通的Unix系统的MTA是Sendmail,用户通常不跟MTA打交道,由管理员设置本地的MTA,用户通常可以选择自己的用户代理。

本章研究两个MTA之间如何用TCP交换邮件。SMTP协议指定了在一个简单TCP连接上,两个MTA如何进行通信。

两个MTA之间用NVT ASCII进行通信,客户向服务器发出命令,服务器用数字应答码和可选的人可读字符串进行响应。

发送一个只有一行的简单邮件,观察SMTP连接,下例中使用-v选项的目的是显示MTA在SMTP连接上发送和接收的内容,以>>>开头的是SMTP客户发出的命令,以3位数字的应答码开始的行是从SMTP服务器来的:
在这里插入图片描述
只有5个SMTP命令用于发送邮件:HELO、MAIL、RCTP、DATA、QUIT。

以上过程我们先键入mail启动用户代理,然后键入主题,键入后,再键入报文正文,在新的一行上键入一个句点结束报文,之后用户代理把邮件传给MTA,由MTA进行交付。

客户MTA主动与服务器连接,之后等待服务器发来的问候报文(应答代码为220)。下一步客户用HELO命令发送客户主机名。MAIL命令发送邮件的发送人。RCPT发送邮件接收方,如果有多个接收方,则发多个RCPT命令。DATA命令发送邮件内容,之后客户发送了一个句点表示邮件发送结束。最后的QUIT命令结束了邮件的发送。以下是上例的时间序列:
在这里插入图片描述
我们键入到用户代理的报文是1,2,3.,但报文段12中共发送了393字节,发送的内容如下:
在这里插入图片描述
在这里插入图片描述
其中前3行是由MTA加上的,第4行由用户代理生成。

最小SMTP实现支持8种命令(包含上例中的5种)。

其他一些SMTP命令:
1.RSET:异常终止当前邮件事务,并使两端复位,丢掉所有发送方、接收方、邮件的存储信息。
2.VRFY:查询接收方地址的详细信息,通常是管理员在查找邮件交付差错时手工使用。
3.NOOP:强迫服务器响应一个OK应答码(200)。
4.TURN:使客户和服务器交换角色,无需重新建立TCP连接就能以相反方向发送邮件(Sendmail不支持此命令)。
5.SEND、SOML、SAML:类似MAIL命令,很少被实现,它们允许邮件直接发送到客户终端或接收方邮箱。

电子邮件组成部分:
1.信封:上例种由两个SMTP命令指明:
在这里插入图片描述
2.首部:由用户代理使用。上例中有9个首部字段:Received、Message-Id、From、Data、Reply-To、X-Phone、X-Mailer、To、Subject,以X开头的字段不是RFC定义的,比较长的字段值,如上例中的Received,被分在几行中,第一行以外的行以空格开头。
3.正文:RFC 822指定正文为NVT ASCII文字行,用DATA命令发送邮件时,先发送首部,后跟一个空行,然后是正文。DATA命令发送的各行必须小于1000字节。

用户代理接收正文,并加上一些首部字段,把结果传到MTA,MTA加上一些首部字段和信封,把结果发送到另一个MTA。

内容通常指首部和正文的组合,是用户用DATA命令发送的。

上例中客户MTA的输出第一行是通过以太网连接到邮件主机,这是因为作者系统已被配置成把所有向外的邮件发送到一台中继机上进行转发,这样做的原因是:
1.简化了除MTA外的其他所有MTA配置。
2.它允许某个机构中的一个系统作为邮件集线器,从而可能把其他所有系统隐藏起来。

查看mailhost主机名在DNS中的定义:
在这里插入图片描述
如果用于中继的主机改变了,只需改变它的DNS名,其他所有单个系统的邮箱配置都无需改变。

在这里插入图片描述
上图中所有MTA之间的通信都使用SMTP协议。

SMTP用NVT ASCII表示一切(信封、首部、正文),这是一个7bit字符码,以8bit字符发送,高位比特被置为0。

当用户代理把邮件发给MTA后,如果后续MTA交付失败,MTA必须把该报文放入队列中以后再试。Host Requirements RFC推荐初始时间间隔至少为30分钟,发送方至少4~5天内不能放弃。

DNS的一种资源记录类型是邮件交换记录,称为MX记录,它用于指定负责处理发往收件人域名的邮件服务器。下例中,使用MX记录向不直接连到Internet的主机发送邮件,下例中主机mlfarm.com不直接连到Internet,但有一个MX记录指向Internet上的一个邮件转发器:
在这里插入图片描述
上图显示有两个MX记录,各有不同的优先级,MTA先从具有低优先级数值的MX记录开始尝试连接:
在这里插入图片描述
以下是邮件发送和DNS通信的tcpdump输出:
在这里插入图片描述
第一行是MTA向它的域名服务器查询mlfarm.com的MX记录,2后面的加号表示设置了递归标志位。

第二行是域名服务器的响应,2后面的星号表示置位了授权比特,并包含2个RR(两个MX主机名),0个授权RR,2个附加RR(两个主机的IP地址)。

第3~5行与主机mercury.hsi.com上的SMTP建立了一个TCP连接,目的主机上的响应220在第六行。

主机mercury.hsi.com必须把邮件报文交付给mlfarm.com,对于没有连接到Internet上与它的MX站点交换邮件的系统,UUCP协议是一个常用办法。

上例中,MTA使用DNS获取一个MX记录,不幸的是,MTA与DNS之间的交互随不同的实现而不同。RFC 974规定MTA必须首先获取MX记录,如果没有MX记录,再尝试通过DNS获取目的主机的IP。MTA也必须处理DNS中的CNAME记录(CNAME用于将一个域名映射到另一个域名,这对于需要在同一个IP地址上运行多个服务的情况来说非常方便。若要同时运行文件传输服务和Web服务,则可以把ftp.example.com和www.example.com都指向DNS记录example.com,而后者则有一个指向IP地址的A记录。如此一来,若服务器IP地址改变,则只需修改example.com的A记录即可)。

另一个发送邮件的例子,从BSD/386主机上向rstevens@mailhost.tuc.noao.edu发送邮件的步骤如下:
1.Sendmail向DNS询问主机mailhost.tuc.noao.edu的CNAME记录,发现存在一个CNAME记录:
在这里插入图片描述
2.发出noao.edu的CNAME记录的DNS查询,结果是不存在。
3.Sendmail发出noao.edu的MX记录的DNS查询,得到一个记录:
在这里插入图片描述
4.Sendmail发出noao.edu的A记录的DNS查询,得到返回值140.252.1.54。
5.发起一个到140.252.1.54的SMTP连接并发送邮件。

由以上过程可知,CNAME查询是为目的主机做的而非为MX记录做的,因为MX记录中的主机名不是别名,而是一个具有A记录的主机名。

MX记录的另一个用途是在目的主机出故障时提供另一个邮件接收器,查看sun的MX记录发现它有两条:
在这里插入图片描述
优先级值较低的MX记录表明应首先尝试发送到主机本身,另一条是把邮件发送到主机noao.edu。

下例中,先关掉sun.tuc.noao.edu的SMTP服务器,然后从主机vangogh.cs.berkeley.edu向sun主机发邮件,当端口25上的连接请求到达时,TCP应响应一个RST,因为没有被动打开的进程在监听此端口:
在这里插入图片描述
连接不在运行的SMTP服务器的tcpdump输出:
在这里插入图片描述
sun主机有两个IP地址。第一行vangogh向sun的第1个IP地址140.252.1.29的端口25发送一个SYN,第二行它被拒绝。然后vangogh尝试sun的第二个IP地址,它也产生一个RST。SMTP客户尝试第二个IP地址的原因在于它不区分第一次打开失败时的差错,如果第一次的差错类似主机不可达,那么第二次尝试或许可行。

接下来会看到SMTP客户向sun的第一个IP重传SYN 75秒,之后向sun的第二个IP也重传75秒,150秒后客户会移到下一个具有更高优先级的MX记录。

VRFY命令无需发送邮件就可验证邮件地址是否存在,并获取该邮件地址的信息。EXPN命令验证邮件地址是否存在,无需发送邮件就可扩充该邮件表。许多SMTP实现(如旧版Sendmail)把两者看成一个。

连接到一个新的Sendmail版本:
在这里插入图片描述
上例中,我们故意在HELO命令中输入错误的主机名bsdi而非sun,许多SMTP服务器首先得到客户的IP地址,之后进行DNS指针查询,之后比较传来的主机名,这样服务器是基于IP地址注册到客户的连接,而非基于用户可能错误的键入的主机名,有些服务器会用幽默的报文回答,如你是一个骗子、为什么叫你自己···,但上例中服务器只是通过指针查询打印出我们的真实域名和IP地址。

之后输入了用一个无效的名字输入VRFY命令,服务器响应550差错,之后键入了有效的名字,服务器进行了回答。之后输入EXPN命令,得到了不同的回答,EXPN命令获取到该用户的邮件是否被转发,并打印出转发的地址。

许多站点禁止VRFY和EXPN命令,有时因为隐私,有时因为安全漏洞,如向白宫的SMTP服务器发这两个命令:
在这里插入图片描述
RFC 1425定义了扩充的SMTP框架,称为扩充的SMTP(ESMTP),这些变化以向后兼容的方式被加入,不影响已有实现。如果客户想使用新特性,会通过EHLO而非HELO命令启动与一个服务器的会话,相兼容的服务器用250应答码响应,这个应答通常有好几行,每行都包含一个关键字和一个可选的参数,这些关键字指定了该服务器支持的SMTP扩充。新的SMTP扩充将在RFC中描述并在IANA注册。

连接到一个支持ESMTP的服务器:
在这里插入图片描述
此服务器对EHLO命令的应答中列出了扩充命令EXPN、SIZE、HELP。SIZE命令作用为发送邮件报文的大小,这样服务器就可以选择是否接收此长度的报文,增加此命令的原因为,随着对非ASCII码(如图像、音频)等内容的支持,Internet邮件报文的长度在不断增大。

连接另一个支持ESMTP的服务器:
在这里插入图片描述
这个服务器也支持SIZE命令,且明确指出服务器不接受长度超过461M字节的报文。8BITMIME允许客户把可选参数BODY加到MAIL FROM命令中,从而指定正文中包含NVT ASCII还是8bit数据,除非客户收到服务器对于EHLO命令的8BITMIME关键字应答,否则禁止客户发送任何非NVT ASCII字符。该服务器的XADR关键字是以X开头的,这代表本地SMTP扩充。

向不支持EHLO命令的SMTP服务器发送EHLO:
在这里插入图片描述
客户会收到500应答而非250,客户此时应发送RSET命令,之后应发送一个HELO命令。

RFC 1522指明了一个在RFC 822报文首部中如何发送非ASCII字符的方法,目的是为了允许在发送方名、接收方名、主题中使用其他字符。

首部字段中可以包含编码字,它的格式如下:
在这里插入图片描述
其中charset是字符集,有效值有两种串us-ascii和iso-8859-x(x是单个数字)。

encoding是一个字符,用来指定编码方法,它支持两个值:
1.Q:目的是用于拉丁字符集。大多字符是作为NVT ASCII(最高位置0)发送的,任何要发送的字符若第8bit置1则将其作为3个字符发送,第一个字符是=,后跟着两个十六进制数,比如字符é,它的二进制8bit值为0xe9,作为三个字符发送就是=E9。空格通常作为下划线或三个字符=20发送。这样编码原因是某些文本中含ASCII字符以外的特殊字符。
2.B:以64为基数的编码,即文本中的3个连续字节(24bit)被编码成4个6bit值,每个6bit值的编码如下,当要编码的个数不是3的倍数时,用=填充:
在这里插入图片描述
如以下编码:
在这里插入图片描述
能处理上述编码的用户代理将输出:
在这里插入图片描述
上图中主题行的前4个编码字符为SWYg,按图28-6将字符翻译为4个6bit值的二进制码:
在这里插入图片描述
然后把这24bit重新分组为3个8bit字节:
在这里插入图片描述
这三个8bit字节就是I、f、空格的ASCII表示。

RFC 822指定正文是NVT ASCII文本行,没有结构;RFC 1521扩充正文为允许把结构置入正文,这被称为MIME(Multipurpose Internet Mail Extensions,通用Internet邮件扩充)。

MIME不要求任何扩充,MIME加入了告知收件者正文结构的新标题,正文仍可以用NVT ASCII码来发送。与另一方交换MIME报文所需的一切就是双方都要有一个能理解MIME的用户代理,不需要MTA做任何改变。

MIME定义的5个新标题字段如下:
在这里插入图片描述
在这里插入图片描述
一个例子如下:
在这里插入图片描述
上图中,MIME版本是1.0,内容类型是无格式ASCII码文本,即Internet邮件的默认选择。PLAIN被认为是内容类型(TEXT)的一个子类型,charset是一个参数。

在这里插入图片描述
内容类型和用于内容传送的编码是互相独立的,前者由首部字段Content-Type指明,后者由首部字段Content-Transfer-Encoding指明,RFC 1521中定义了5中不同编码格式:
1.7bit:默认的NVT ASCII。
2.quoted-printable:上述首部字段中的编码字中,当encoding是Q时的编码方法。
3.base64:如图28-6。
4.8bit:某些是非ASCII字符且第8bit置1。
5.binary编码:二进制编码,可编码非ASCII字符和超出行长度限制的邮件。

对于RFC 821 MTA,只有前3种是有效的,因为前三种只包含NVT ASCII字符。只有8BITMIME支持的ESMTP服务器允许使用8bit编码。

尽管内容类型和编码独立,RFC 1521推荐有非ASCII数据的text使用quoted-printable,而image、audio、video、octet-stream application使用base64,这样可与符合RFC 821的MTA保持最大互操作性。multipart和message的内容类型必须以7bit编码。

以下是multipart内容类型的例子,它的子类型是mixed,含义为各部分是顺序处理的,且Boundary定义了各部分的边界是一行--NextPart
在这里插入图片描述
如上图,每个边界上可跟一行下一部分的首部字段。第一个边界后跟着一个空行而非首部,默认第一个边界和第二个边界之间的数据内容类型为具有us-ascii字符集的text/plain。

第二个边界后的首部字段中指定了另一个multipart报文,以一行--OtherAccess为分界,子类型为alternative,即有多种选择,第一种选择是用电子邮件获取RFC,第二种选项是用匿名FTP获取。MIME的用户代理将列出这两种选项,允许收件人选择一个,然后自动用电子邮件或匿名FTP获取一份RFC。

TCP是全双工协议,SMTP可以一次发送多个命令,但SMTP用半双工形式使用TCP,原因是有些SMTP实现每处理完一条命令就清除它们的输入缓存,使得SMTP不能全双工使用。

当域名的MX记录有多个目标地址且优先级相同时,表示轮循。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-05 17:42:25  更:2021-08-05 17:43:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 2:29:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码