0

我的理解是,最初的 SMTP 协议被定义为仅使用 7 位来限制字符的传输,以节省传输成本。

该协议已有将近 40 年的历史,从那时起,多个 RFC 扩展了标准。

出于兼容性原因,许多(如果不是大多数)8 位干净的现代服务器会将消息转换为“7 位兼容”格式,例如quoted-printable 或 base64。

所以从技术上讲,所有的字符都是 7bit ASCII。

但是,我的问题的关键是,即使数据以 7bit 友好的方式编码,这是否意味着 SMTP 服务器之间的比特物理传输是以 7bit 为单位发生的,还是以 8bits 为单位发生的?

我的假设是它发生在 8 位,即使数据是用 ASCII 编码的。它是否正确?

以下是我找到的一些相关链接:

<< 用户每年发送数十亿条 8 位消息。据我所知,所有服务器都可以处理 8 位消息。几年前,我能够找到一些运行古老的 7 位版本 sendmail 的主机,但现在我看不到任何主机。>>

http://cr.yp.to/smtp/8bitmime.html

<< 然而,在实践中,正文通常使用所有八位进行编码。>>

https://www.ibm.com/support/knowledgecenter/en/SSB27U_6.4.0/com.ibm.zvm.v640.kiml0/smtmlfr.htm

<< 这在实践中不会引起问题,因为几乎所有现代邮件中继都是 8 位干净的>>

https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#8BITMIME

更新

我的问题的细化应该表述为:今天的 SMTP 服务器是否仍然清除高位,并仅使用低 7 位对 7 位 ASCII 进行编码,或者它们实际上是否使用完整的八位字节,从而对 MSB 有意义?

4

1 回答 1

0

我认为您要问的是:“ SMTP 客户端在向 SMTP 服务器发送消息时是否会移动位,以使每个字符仅使用 7 位,而第 8 位是下一个字符的开始?”

如果是这样,没有。从未如此。

从一开始,SMTP 客户端/服务器就一直使用每个字符的全部 8 位。

换句话说,SMTP 客户端和服务器使用 ASCII 字符编码,它不包括在 ISO-8859-1 等 8 位字符编码中发现的重音字符。ASCII 编码中值大于 127 的字符被视为未定义。

造成这种情况的原因可能有很多:

  1. ASCII 易于支持
  2. 每个语言环境都有自己首选的扩展字符编码,与其他语言环境不兼容——其中一些需要多个字节来表示一个字符。
  3. 我不确定 UTF-8 是否存在(但我认为多字节 unicode 确实存在 - 例如 UCS2 / UTF-16)
  4. 期望有这么多软件在所有广泛使用的字符集之间实现字符集转换是困难和不现实的(unicode 和 charset 转换库当时还没有广泛使用)
  5. MIME、SMTP 等之前的“MESSAGE”规范是为美国“互联网”编写的,可能不需要 ASCII 以外的任何内容(因此原始消息规范(例如 rfc0822 和更早版本)没有定义编码机制)。
于 2020-10-17T12:47:35.210 回答