【MIME协议】base64编码与quoted-printable编码

MIME概述

电子邮件协议SMTP通过连接建立邮件传送连接释放三个阶段实现发送方和接收方之间的通信。

不过SMTP有很多的缺点:

  1. SMTP不能传送可执行文件或其他的二进制对象。
  2. SMTP限于传送7位的ASCLL码很多非英语语言无法传送。
  3. SMTP服务器会拒绝超过一定长度的邮件。
  4. 某些SMTP的实现并没有完全按照SMTP的互联网标准。如:

    回车、换行的删除和增加
    超过76个字符会截断或者自动换行
    后面多余的空格删除
    将制表符tab转换为若干个空格

提出了通用互联网邮件扩充MIME

在这里插入图片描述
MIME继续使用原来的邮件格式,增加了邮件主体的结构,定义了传送非ASCALL码的编码规则。

MIME增加5个新的邮件首部

  1. MIME-Version

    表示使用的MIME的版本号,一般是1.0

  2. Content-Type

    说明邮件主体的数据类型和子类型
    Content-Type都是“主类型/子类型”的形式。主类型有text, image,audio, video, application, multipart, message等,分别表示文本、图片、音频、视频、应用、分段、消息等。

  3. Content-Transfer-Encoding

    在传送邮件主体如何编码的
    Content-Transfer-Encoding共有Base64, Quoted-printable, 7bit, 8bit, Binary等几种。
    使用最广泛的编码方式:Base64, Quoted-Printable。

  4. Content-Disposition

    可读字符串,说明此邮件主体是否是图像、音频或视频

  5. 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

具体步骤

  1. 把二进制代码划为一个个24位长的单元,再把每一个24位单元划分为4个6位组。
  2. 在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位(四个字节)。
  3. 根据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码的数据编码方式:

  1. 每个字节(8位)的二进制用两个十六进制数字表示
  2. 在其前面加上一个等号“=”

例题

试将数据01001100 10011101 00111001进行quoted-printable编码,并得出最后传送的ASCII数据。这样的数据用quoted-printable编码后其编码开销有多大?

  1. 第一步:将二进制分为8位一组,转为十六进制,超过5F不可打印(当然也可直接转化为十进制,超过95不可打印)

    01001100 10011101 00111001
      4C    9D    39

  2. 可打印:不用改变,不可打印:两个十六进制数字前面加上“=”

    01001100 10011101 00111001
      4C    9D    39
      4C    =9D   39

  3. 可打印:不用改变,不可打印:将“=”和两个十六进制数字分别转化为8位二进制(=:00111101)

    4C、39可以打印,9D不可以打印
    =9D:00111101 00111001 01000100

    ASCII数据:

    01001100 00111101 00111001 01000100 00111001

开销:(5-3)/3=66.7%

ASCLL字符代码表

图片来自百度
在这里插入图片描述
参考文献:

计算机网络(第7版)-谢希仁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章