| |
|
开发:
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:简单邮件传送协议 |
用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服务器来的: 以上过程我们先键入mail启动用户代理,然后键入主题,键入后,再键入报文正文,在新的一行上键入一个句点结束报文,之后用户代理把邮件传给MTA,由MTA进行交付。 客户MTA主动与服务器连接,之后等待服务器发来的问候报文(应答代码为220)。下一步客户用HELO命令发送客户主机名。MAIL命令发送邮件的发送人。RCPT发送邮件接收方,如果有多个接收方,则发多个RCPT命令。DATA命令发送邮件内容,之后客户发送了一个句点表示邮件发送结束。最后的QUIT命令结束了邮件的发送。以下是上例的时间序列: 最小SMTP实现支持8种命令(包含上例中的5种)。 其他一些SMTP命令: 电子邮件组成部分: 用户代理接收正文,并加上一些首部字段,把结果传到MTA,MTA加上一些首部字段和信封,把结果发送到另一个MTA。 内容通常指首部和正文的组合,是用户用DATA命令发送的。 上例中客户MTA的输出第一行是通过以太网连接到邮件主机,这是因为作者系统已被配置成把所有向外的邮件发送到一台中继机上进行转发,这样做的原因是: 查看mailhost主机名在DNS中的定义:
SMTP用NVT ASCII表示一切(信封、首部、正文),这是一个7bit字符码,以8bit字符发送,高位比特被置为0。 当用户代理把邮件发给MTA后,如果后续MTA交付失败,MTA必须把该报文放入队列中以后再试。Host Requirements RFC推荐初始时间间隔至少为30分钟,发送方至少4~5天内不能放弃。 DNS的一种资源记录类型是邮件交换记录,称为MX记录,它用于指定负责处理发往收件人域名的邮件服务器。下例中,使用MX记录向不直接连到Internet的主机发送邮件,下例中主机mlfarm.com不直接连到Internet,但有一个MX记录指向Internet上的一个邮件转发器: 第二行是域名服务器的响应,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发送邮件的步骤如下: 由以上过程可知,CNAME查询是为目的主机做的而非为MX记录做的,因为MX记录中的主机名不是别名,而是一个具有A记录的主机名。 MX记录的另一个用途是在目的主机出故障时提供另一个邮件接收器,查看sun的MX记录发现它有两条: 下例中,先关掉sun.tuc.noao.edu的SMTP服务器,然后从主机vangogh.cs.berkeley.edu向sun主机发邮件,当端口25上的连接请求到达时,TCP应响应一个RST,因为没有被动打开的进程在监听此端口: 接下来会看到SMTP客户向sun的第一个IP重传SYN 75秒,之后向sun的第二个IP也重传75秒,150秒后客户会移到下一个具有更高优先级的MX记录。 VRFY命令无需发送邮件就可验证邮件地址是否存在,并获取该邮件地址的信息。EXPN命令验证邮件地址是否存在,无需发送邮件就可扩充该邮件表。许多SMTP实现(如旧版Sendmail)把两者看成一个。 连接到一个新的Sendmail版本: 之后输入了用一个无效的名字输入VRFY命令,服务器响应550差错,之后键入了有效的名字,服务器进行了回答。之后输入EXPN命令,得到了不同的回答,EXPN命令获取到该用户的邮件是否被转发,并打印出转发的地址。 许多站点禁止VRFY和EXPN命令,有时因为隐私,有时因为安全漏洞,如向白宫的SMTP服务器发这两个命令: 连接到一个支持ESMTP的服务器: 连接另一个支持ESMTP的服务器: 向不支持EHLO命令的SMTP服务器发送EHLO: RFC 1522指明了一个在RFC 822报文首部中如何发送非ASCII字符的方法,目的是为了允许在发送方名、接收方名、主题中使用其他字符。 首部字段中可以包含编码字,它的格式如下: encoding是一个字符,用来指定编码方法,它支持两个值: RFC 822指定正文是NVT ASCII文本行,没有结构;RFC 1521扩充正文为允许把结构置入正文,这被称为MIME(Multipurpose Internet Mail Extensions,通用Internet邮件扩充)。 MIME不要求任何扩充,MIME加入了告知收件者正文结构的新标题,正文仍可以用NVT ASCII码来发送。与另一方交换MIME报文所需的一切就是双方都要有一个能理解MIME的用户代理,不需要MTA做任何改变。 MIME定义的5个新标题字段如下:
对于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定义了各部分的边界是一行 第二个边界后的首部字段中指定了另一个multipart报文,以一行 TCP是全双工协议,SMTP可以一次发送多个命令,但SMTP用半双工形式使用TCP,原因是有些SMTP实现每处理完一条命令就清除它们的输入缓存,使得SMTP不能全双工使用。 当域名的MX记录有多个目标地址且优先级相同时,表示轮循。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年12日历 | -2024/12/27 13:39:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |