转自: http://wmfbravo.blog.163.com/
感谢: wmfbravo
2 基础知识
& 注释:
本章的内容主要翻译自《ASN.1 Communication between
Heterogeneous Systems》。
2.1 相关背景知识
2.1.1 OSI参考模型
Figure 2-1 OSI 七层参考模型
虽然ASN.1和OSI密切相关,但实际上它也应用在很多非OSI模型的情况下。
II. 表示层 Presentation Layer
两个系统在传输数据前需要协商共用的编码方式。表示层负责在两个应用系统间进行编码协商和实际信息编码。为了达到这个目的,表示层需使用以下概念:
1) 抽象语法:定义了数据的常用结构(包括不同的数据类型),并且建立了和应用层对话所依赖的框架。
2) 实际语法:本地的,并且定义本地系统的数据表示方法。
3) 传输语法:定义两个系统间基于各自会话层的表示层间交换数据的表示方法。
4) 编码规则:提供从本地实际语法到传输语法和其相反操作的方法。
应用这些记法,表示层能够提供应用层这些服务:
l 传输语法的协商(在会话开始前挑选一种传输语法的方法,改变传输语法的方法);
l 确定传输语法的集合(抽象语法的多种表示方式);
l 用实际语法(内部表示方式)的编码、解码规则来翻译为传输语法(外部表示方式)或者做相反操作;
l 把一个协商后的传输语法和应用内部采用的抽象语法进行关联;
l 访问会话层服务。
在Figure 2-2表示层上下文协商中,详细描述了这样一个过程:
1) 应用A发送一个P-CONNECT.request原语给自己的表示层,并且声明操作这个传输的相关抽象语法名字为(AS1,AS2)。每个抽象语法的名字实际是一串成为对象标识符(Object
Identifier,在ASN.1中是OBJECT IDENTIFIER类型的值)的数字,它能唯一的标识抽象语法:的确,我们应当注意到这是一个开放式的架构,能适应各种机器,各种抽象语法,各种传输语法。
2) 表示层为每个抽象语法关联传输语法,并且为会话层编码表示协议数据值PPDV(Presentation
Protocol Data Value),这些数据会被送往对方系统的表示层。PPDV中包含着可用的抽象语法。
3) 表示层B收到这个PPDV数据后,向自己的应用层回送P-CONNECT.indication原语,指示应用A的抽象语法可用。
4) 应用B以P-CONNECT.response原语应答,指示在这个传输中可用的抽象语法的名字(这里只指示AS2)。
5) 会话层B接收到原语后,发送PPDV指明传输语法,这个语法应当是已经协商中的一个(如上图中是T2、T3中的T2)。
6) 最后,表示层A收到PPDV后,检查对方推荐的传输语法,如果接受它则发送P-CONNECT.confirm原语给应用A。
应当注意,表示层没有参与到应用间可用抽象语法的确定过程中。通常,会用多个抽象语法/传输语法的组合关系。一个抽象语法可以用多个传输语法来表示;一个传输语法也可以用来表示多个抽象语法。抽象语法/传输语法组合的协商结果被成为表示上下文(Presentation
Context)。上下文用整数来标识,为了防止重新分配时出现覆盖,一般让一个实体采用偶数而另一个实体采用奇数。其它上下文可以在通讯过程中动态协商。
在初始协商的最后,系统在它的配置中有了一套表示上下文,在任何时候,系统都能从中选出合适的上下文进行交换操作。
来自应用层的数据会被根据相关的表示上下文进行编码。当只有一个上下文被指定时,他们将被直接编码(简单编码 Simple Encoding);否则应用数据包括嵌入数据(embedded data)都要在前面加上正确的上下文标识符(完整编码 Complete
Encoding)。
III. 应用层 Application Layer
采用OSI模型时,我们称一个应用的一个通讯方面为一个应用实体;通讯实体用通讯协议和表示业务来共享信息。
在ASN.1中,各个应用的数据结构作为应用协议数据值APDV(Application
Protocol Data Value)发送。每当它要传输数据时,应用实体都会在给出APDV的同时,告知表示层自己的ASN.1名字。通过参考ASN.1的定义,表示层可以得知数据单元的类型和长度,以及传输时应当采用的编码方法。在连接的另一端,表示层分析收到数据结构中的ASN.1标识符,就能得知第一个数据单元有多少比特,第二个有多少,等等。有了这些信息,表示层按照接收方内部格式对数据做必要的转换。
自从ISO要求所有的应用层和表示层数据交换都要用ASN.1抽象语法描述后,ASN.1在OSI中只作为表示方法用。随着OSI模型的广泛应用,ASN.1主要用在高层中(部分因为在ASN.1出现前,许多低层已经存在了),但是这不是一种限制。如果ASN.1能广泛应用在低层中,就能充分影响编码过程,阻止数据在不同层上反复出现。
2.1.2 边界对齐
对于同样一条消息,在计算机内存中是以字节为单位存储的,在链路上则是以比特为单位传送的,对于其中每个信元(IE:Information Element),当从比特流映射到字节流的时候,就涉及到边界对齐的问题,如果一个信元的第一个比特也恰好是字节流中某字节的开始比特,我们称之为开始于边界对齐的,同样,如果信元的最后一个比特也恰好是字节流中某字节的最后一个比特,则可以称之为结束于边界对齐的。
对于不是结束于边界对齐的情况,一般要进行补位。有两种方式:
1) 对信元的结束立即进行补位,保证下一个信元是开始于边界对齐的;
2) 从信元结束的位置开始新的信元,到消息结束,再进行补位操作。
通常第一个种方式用在对消息大小要求不苛刻的编码过程中和通常的解码过程中;第二种方式用在对消息大小要求苛刻的编码过程中(如无线通讯系统的空中接口消息编码中)。
当把边界对齐问题和大小端问题放在一起时,常常会造成理解上的困难。某些协议中为了明确表示位域跨字节情况下的排列,用MSB、LSB标识最高、最低比特位置所在。
2.1.3 大小端(Bid Endian vs. Little Endian)
来源于Swift的小说Gulliver’s Travels中一个故事:两个国家连年征战,起因在于吃煮鸡蛋时到底是从比较尖的一端开始,还是从比较圆的一端开始。
不幸的是类似事情在计算机中也存在如下情况:
l 大端方式-Motorola的PPC系列,IP协议中(MSDN中说的网络序)
l 小端方式-VAX计算机,Intel的x86系列(MSDN中说的主机序)
字段内部的比特高低次序相同(左高右低),而字段之间的高低次序相反。
在32位系统中我们分以下这些情况来一一说明:
1) Byte类型(8bits)
在只有一个字节的情况下,大端方式和小端方式没有分别。如:0x34
|
bit7 |
bit6 |
bit5 |
bit4 |
bit3 |
bit2 |
bit1 |
bit0 |
|
Bid Endian |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0x34 |
Little Endian |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0x34 |
2) Short类型(16bits)
大小端方式之间有差别。如:0x1234
|
bit7 |
bit6 |
bit5 |
bit4 |
bit3 |
bit2 |
bit1 |
bit0 |
|
Bid Endian (0) |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0x12 |
Bid Endian (1) |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0x34 |
Little Endian (0) |
0 |
0 |
1 |
1 |
0 |
1 |
|