MIME概述
电子邮件协议SMTP通过连接建立
、邮件传送
、连接释放
三个阶段实现发送方和接收方之间的通信。
不过SMTP有很多的缺点:
- SMTP不能传送可执行文件或其他的二进制对象。
- SMTP限于传送7位的ASCLL码很多非英语语言无法传送。
- SMTP服务器会拒绝超过一定长度的邮件。
- 某些SMTP的实现并没有完全按照SMTP的互联网标准。如:
回车、换行的删除和增加
超过76个字符会截断或者自动换行
后面多余的空格删除
将制表符tab转换为若干个空格
提出了通用互联网邮件扩充MIME
MIME继续使用原来的邮件格式,增加了邮件主体的结构,定义了传送非ASCALL码的编码规则。
MIME增加5个新的邮件首部
-
MIME-Version
表示使用的MIME的版本号,一般是1.0
-
Content-Type
说明邮件主体的数据类型和子类型
Content-Type都是“主类型/子类型”的形式。主类型有text, image,audio, video, application, multipart, message等,分别表示文本、图片、音频、视频、应用、分段、消息等。 -
Content-Transfer-Encoding
在传送邮件主体如何编码的
Content-Transfer-Encoding共有Base64, Quoted-printable, 7bit, 8bit, Binary等几种。
使用最广泛的编码方式:Base64, Quoted-Printable。 -
Content-Disposition
可读字符串,说明此邮件主体是否是图像、音频或视频
-
Content-ID
邮件的唯一标识符
了解了MIME基本概况,我们看看两种使用最广泛的编码方式。
base64编码
对于任意的二进制文件,都可用base64编码。base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。
基本原理
定义一个base62索引表,有字符"A-Z、a-z、0-9、+、/" 64个可打印字符。
6位二进制代码共有64种不同的值,从0到63,下面是对应表
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
具体步骤
- 把二进制代码划为一个个24位长的单元,再把每一个24位单元划分为4个6位组。
- 在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位(四个字节)。
- 根据base64编码对照表获得对应的值。
例题
试将数据 11001100 10000001 00111000进行base64编码,并得到最后传输的ASCII数据。
-
第一步:正好是24位长,分为4个6位组
110011 001000 000100 111000
-
第二步:在每组前面添加两个0
00110011 00001000 00000100 00111000
51 8 4 56 -
第三步:根据base64编码对照表获得对应的值。
00110011 00001000 00000100 00111000
51 8 4 56
z I E 4 -
第四步:找出对应的二进制值
z -> 122 -> 01111010
I -> 73 -> 01001001
E -> 69 -> 01000101
4 -> 52 -> 00110100
quoted-printable编码
这种方法适用于所传送的数据中只有少量的非ASCLL码
ASCII编码是7位编码,一共可以组成128个不同的ASCII码,其中可以打印的有95个(95个中包括了空格),还有33个控制字符不可打印。
基本步骤
可以打印的ASCLL码,不变
等号“=”和不可打印的ASCLL码以及非ASCLL码的数据编码方式:
- 每个字节(8位)的二进制用两个十六进制数字表示
- 在其前面加上一个等号“=”
例题
试将数据01001100 10011101 00111001进行quoted-printable编码,并得出最后传送的ASCII数据。这样的数据用quoted-printable编码后其编码开销有多大?
-
第一步:将二进制分为8位一组,转为十六进制,超过5F不可打印(当然也可直接转化为十进制,超过95不可打印)
01001100 10011101 00111001
4C 9D 39 -
可打印:不用改变,不可打印:两个十六进制数字前面加上“=”
01001100 10011101 00111001
4C 9D 39
4C =9D 39 -
可打印:不用改变,不可打印:将“=”和两个十六进制数字分别转化为8位二进制(
=
:00111101)4C、39可以打印,9D不可以打印
=9D:00111101 00111001 01000100ASCII数据:
01001100 00111101 00111001 01000100 00111001
开销:(5-3)/3=66.7%
ASCLL字符代码表
图片来自百度
参考文献:
计算机网络(第7版)-谢希仁