SMTP 传输 7 位还是 8 位字符(是否清除 MSB?)
Does SMTP transfer 7bit or 8bit characters (clear MSB or not?)
我的理解是,最初的SMTP协议是为了节省传输成本而定义的,只使用7位来限制字符的传输。
该协议已有将近 40 年的历史,此后多个 RFC 扩展了标准。
出于兼容性原因,许多(如果不是大多数)8 位干净的现代服务器将消息转换为“7 位兼容”格式,例如 quoted-printable 或 base64。
从技术上讲,所有字符都是 7 位 ASCII。
然而,我的问题的症结在于,即使数据以 7 位友好方式编码,这是否意味着 SMTP 服务器之间的物理位传输以 7 位为单位发生,还是以 8 位为单位发生?
我的假设是它发生在 8 位中,即使数据是用 ASCII 编码的。这是正确的吗?
以下是我找到的一些相关链接:
<< Users send billions of 8-bit messages every year. As far as I know,
all servers can handle 8-bit messages. A few years ago I was able to
find a few hosts running ancient 7-bit versions of sendmail, but I
don't see any now.>>
http://cr.yp.to/smtp/8bitmime.html
<< In practice, however, the body is typically encoded using all eight
bits. >>
https://www.ibm.com/support/knowledgecenter/en/SSB27U_6.4.0/com.ibm.zvm.v640.kiml0/smtmlfr.htm
<< This does not cause problems in practice, since virtually all
modern mail relays are 8-bit clean >>
https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#8BITMIME
更新
我的问题的细化应该表述为:今天的 SMTP 服务器是否仍然清除高位,并仅使用低七位对 7 位 ASCII 进行编码,或者它们实际上使用完整的八位位组,对MSB?
我想您要问的是:“SMTP 客户端在向 SMTP 服务器发送消息时是否会移位,以便每个字符仅使用 7 位,而第 8 位是下一个字符的开始?”
如果是,否。从来没有这样。
从一开始,SMTP clients/servers 就一直使用每个字符的全部 8 位。
换句话说,SMTP 客户端和服务器使用的 ASCII 字符编码不包括 ISO-8859-1 等 8 位字符编码中的重音字符。 ASCII 编码中值大于 127 的字符被视为未定义。
这可能有多种原因:
- ASCII 易于支持
- 每个语言环境都有自己的首选扩展字符编码,这些编码与其他语言环境不兼容 - 其中一些语言环境需要多个字节来表示一个字符。
- 我不确定 UTF-8 是否存在(但我认为多字节 unicode 存在 - 例如 UCS2 / UTF-16)
- 期望这么多软件实现所有广泛使用的字符集之间的字符集转换是困难和不现实的(当时 unicode 和 charset 转换库还没有广泛使用)
- MIME、SMTP 等之前的“MESSAGE”规范是为美国“互联网”编写的,可能不需要 ASCII 之外的任何内容(因此原始消息规范(例如 rfc0822 和更早版本未定义的原因)编码机制)。
我的理解是,最初的SMTP协议是为了节省传输成本而定义的,只使用7位来限制字符的传输。
该协议已有将近 40 年的历史,此后多个 RFC 扩展了标准。
出于兼容性原因,许多(如果不是大多数)8 位干净的现代服务器将消息转换为“7 位兼容”格式,例如 quoted-printable 或 base64。
从技术上讲,所有字符都是 7 位 ASCII。
然而,我的问题的症结在于,即使数据以 7 位友好方式编码,这是否意味着 SMTP 服务器之间的物理位传输以 7 位为单位发生,还是以 8 位为单位发生?
我的假设是它发生在 8 位中,即使数据是用 ASCII 编码的。这是正确的吗?
以下是我找到的一些相关链接:
<< Users send billions of 8-bit messages every year. As far as I know, all servers can handle 8-bit messages. A few years ago I was able to find a few hosts running ancient 7-bit versions of sendmail, but I don't see any now.>>
http://cr.yp.to/smtp/8bitmime.html
<< In practice, however, the body is typically encoded using all eight bits. >>
https://www.ibm.com/support/knowledgecenter/en/SSB27U_6.4.0/com.ibm.zvm.v640.kiml0/smtmlfr.htm
<< This does not cause problems in practice, since virtually all modern mail relays are 8-bit clean >>
https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#8BITMIME
更新
我的问题的细化应该表述为:今天的 SMTP 服务器是否仍然清除高位,并仅使用低七位对 7 位 ASCII 进行编码,或者它们实际上使用完整的八位位组,对MSB?
我想您要问的是:“SMTP 客户端在向 SMTP 服务器发送消息时是否会移位,以便每个字符仅使用 7 位,而第 8 位是下一个字符的开始?”
如果是,否。从来没有这样。
从一开始,SMTP clients/servers 就一直使用每个字符的全部 8 位。
换句话说,SMTP 客户端和服务器使用的 ASCII 字符编码不包括 ISO-8859-1 等 8 位字符编码中的重音字符。 ASCII 编码中值大于 127 的字符被视为未定义。
这可能有多种原因:
- ASCII 易于支持
- 每个语言环境都有自己的首选扩展字符编码,这些编码与其他语言环境不兼容 - 其中一些语言环境需要多个字节来表示一个字符。
- 我不确定 UTF-8 是否存在(但我认为多字节 unicode 存在 - 例如 UCS2 / UTF-16)
- 期望这么多软件实现所有广泛使用的字符集之间的字符集转换是困难和不现实的(当时 unicode 和 charset 转换库还没有广泛使用)
- MIME、SMTP 等之前的“MESSAGE”规范是为美国“互联网”编写的,可能不需要 ASCII 之外的任何内容(因此原始消息规范(例如 rfc0822 和更早版本未定义的原因)编码机制)。