SMTP如何处理多对象超文本数据?

起因是我们的教材[1]在对比SMTP协议和HTTP协议的时候提到的一个差异:

A third important difference concerns how a document consisting of text and images (along with possibly other media types) is handled. As we learned in Section 2.2, HTTP encapsulates each object in its own HTTP response message. Internet mail places all of the message’s objects into one message.

其中提到在处理一个既包含文本又包含图片(有可能还有其他类型)时,HTTP会把每个对象封装到自己的HTTP响应消息中,而因特网邮件(注意这里泛指所有因特网邮件协议而非特指SMTP)则把所有消息对象封装在一个消息里。

现在的问题是SMTP究竟如何处理非文本数据,是否真的如教材所言将所有类型的数据其封装成一个消息?

SMTP的局限及其扩展MIME

原始的SMTP[2]规定了SMTP传输的数据需要通过7位ASCII码进行传输,高位的比特数据作废。对于英文文本来说绰绰有余,但对于其他语言的文本或者非文本数据来说就造成了很大的障碍。解决这个问题有两种方法[3]:MIME和SMTP服务扩展(SMTP Service Extension

多用途互联网邮件扩展(MIME)

MIME最早是为SMTP设计的扩展标准[4],当然后来也被扩展并用于HTTP
在RFC1521的摘要中就已经明确了:

In particular, this document is designed to provide facilities to include multiple objects in a single message

MIME标准是一个将多个媒体对象封装在一个消息中的方案。具体做法就是在原来的报文头部增加五个域:

  • MIME-VersionMIME的版本号
  • Content-Type内容类型,通过Content-Type:<type/subtype; parameters>定义消息中传送的内容的类型
  • Content-Transfer-Encoding 内容传输编码,提供了除了7位ASCII码以外的编码方式
  • Content-Id内容标识,可选,多消息环境中的消息唯一的标识
  • Content-Description 内容描述,可选

通过增加这些字段可以把原来只限于文本的数据扩展成其他类型。然而遇到多个对象的时候应该如何处理?

处理多个对象

Content-Type中有一种数据类型为Multipart意为含有多个不同类型的数据部分。对于Multipart类型的数据,Content-Type域除了原来的参数还会增加一个参数boundary,意为封装这些不同类型的数据部分的边界。两个连字符-后加上这个边界参数值可以分隔不同类型的数据,最后再加上两个连字符-则为最后的边界。

借用RFC1521中的例子,这是一个包含不同编码的文本的消息:

From: Nathaniel Borenstein <nsb@bellcore.com>
To:  Ned Freed <ned@innosoft.com>
Subject: Sample message
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="simple boundary"

This is the preamble.  
It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers.
--simple boundary

This is implicitly typed plain ASCII text.
It does NOT end with a linebreak.
--simple boundary
Content-type: text/plain; charset=us-ascii

This is explicitly typed plain ASCII text.
It DOES end with a linebreak.

--simple boundary--
This is the epilogue.  It is also to be ignored.

再借用一个RFC2046[5]中的例子演示alternative子类型

From: Nathaniel Borenstein <nsb@bellcore.com>
To: Ned Freed <ned@innosoft.com> 
Date: Mon, 22 Mar 1993 09:41:09 -0800 (PST) 
Subject: Formatted text mail 
MIME-Version: 1.0 Content-Type: multipart/alternative; boundary=boundary42 

--boundary42
Content-Type: text/plain; charset=us-ascii 

... plain text version of message goes here ... 

--boundary42 
Content-Type: text/enriched 

... RFC 1896 text/enriched version of same message goes here ... 

--boundary42 
Content-Type: application/x-whatever 

... fanciest version of same message goes here ... 

--boundary42--

这里除了包含文本对象还有应用对象(x-whatever),而这个应用对象是否显示则取决于对方使用的版本是否支持。

正如在SMTP最新的标准RFC5321[6]中所述:

SMTP transports a mail object. A mail object contains an envelope and content.

SMTP传送的是一个邮件对象,只封装一次。

HTTP

那么HTTP呢?既然前面提到了MIME也被借鉴到了HTTP中,处理多对象数据的时候会有什么不同么?

光说不练假把式,一言不合先抓包。

这里打开苏州续江数码科技有限公司的官网在页面加载期间进行抓包得到

续江的进程

很显然各个对象之间是独立封装的,连GET的时间都是不一样的,第一个报文被归为文档类点开可以看到响应头部

响应头部

Content-Typetext/html,这里包含了整个网页的文本信息。其他的报文则是网页中的图片。

HTTP支持Multipart么?当然啦,它是MIME标准,我们怎么能不支持它。但是这么早说支持,给人一种SMTP的感觉。这也是HTTP所支持的MIME与SMTP支持的MIME不同的地方。

HTTP支持特有的子类Multipart/Byteranges[5]而非严格服从MIME,原始的HTTP一开始不支持multipart,当然后续也并不推荐这种封装策略[7],大概是出于作为拉协议本身的需求。

The "multipart/form-data" type has been specifically defined for carrying form data suitable for processing via the POST request method


  1. GB/T 7714
    Kurose J, Ross K. Computer Networking: A top-down approach[J]. 2013.

  2. Postel J. RFC 821: Simple Mail Tranfer Protocol[R]. IETF Network Working Group, 1982.

  3. Riabov V V. SMTP (Simple Mail Transfer Protocol)[J]. River College, 2005.

  4. Moore K. MIME (Multipurpose Internet Mail Extensions) part two: Message header extensions for non-ascii text[J]. 1993.

  5. RFC2046 A. Multipurpose Internet Mail Extensions (MIME), Part Two: Media Types[J].

  6. Klensin J. RFC 5321—Simple mail transfer protocol (SMTP)[R]. RFC 5321, 2008.

  7. Nebel E, Masinter L. RFC 1867: Form-based File Upload in HTML[J]. Internet Engineering Task Force< URL: ftp: ds. internic. net rfc rfc1867. txt, 1995.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 组织:中国互动出版网(http://www.china-pub.com/) RFC文档中文翻译计划(http://...
    Palomar阅读 1,570评论 0 6
  • 8. 方法定义(Method Definitions) 通用的HTTP/1.0的方法集将在下面定义,虽然该方法集可...
    Palomar阅读 3,152评论 0 2
  • 本文包括:1、名词解释2、邮件收发过程3、JavaMail 知识概要4、发送一封符合 MIME 协议的 JavaM...
    廖少少阅读 4,002评论 2 13
  • 整体Retrofit内容如下: 1、Retrofit解析1之前哨站——理解RESTful2、Retrofit解析2...
    隔壁老李头阅读 15,064评论 4 39
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,858评论 25 707