📄 rfc3072.txt
字号:
SDX_EC_levelOvflw = 9
SDX_EC_paramMissing = 10
SDX_EC_magicError = 11
SDX_EC_not_consistent = 12
SDX_EC_wrongDataType = 13
SDX_EC_noMemory = 14
SDX_EC_error = 99 // rc is sufficiently
8.5 专用函数
除了上述基本定义外,还有一个全局函数(SDX_getOptions)可以返回指向全局性选项
表的指针。通过这些选项可以改变SDXF的行为方式,比方说可以定义自己的转换表或者
从外部资源(比如磁盘)上读取转换表的函数。在这个选项表内还包含用于加解密的函数指
针,因此通过设定该指针可以安装自己的加密函数。选项表指针可以通过下述命令取得:
SDX_TOptions *opt = SDX_getOptions ();
结构如下:
typedef struct
{
Byte *toHost; // Trans tab net -> host
Byte *toNet; // Trans tab host -> net
int maxlevel; // highest possible level
int translation; // translation net <-> host
// is in effect=1 or not=0
TEncryptProc *encryptProc; // alternate encryption routine
TGetTablesProc *getTablesProc; // alternate routine defining
// translation Tables
TcvtUTF8Proc *convertUTF8; // routine to convert to/from UTF-8
} SDX_TOptions;
typedef long TencryptProc (
int mode, // 1= to encrypt, 2= to decrypt, 3= encrypted length
Byte *buffer, // data to en/decrypt
long len, // len: length of buffer
char *passw); // Password
// returns length of en/de-crypted data
// (parameter buffer and passw are ignored for mode=3)
// returns blocksize for mode=3 and len=0.
// blocksize is zero for non-blocking algorithms
typedef int TGetTablesProc (Byte **toNet, Byte **toHost);
// toNet, toHost: pointer to output params. Both params
// points to translation tables of 256 Bytes.
// returns success: 1 = ok, 0 = error.
typedef int TcvtUTF8Proc
( int mode, // 1 = to UTF-8, 2 = from UTF-8
Byte *target, int *targetlength, // output
Byte *source, int sourcelength); // input
// targetlength contains maximal size as input param.
// returns success: 1 = ok, 0 = no conversion
9. 对UTF-8的支持
许多系统支持UTF-8作为交换数据的字符格式,这种格式的最大好处是不需要为特定
的程序指定固定的字符集,因为它囊括了所有的字符集,使用双字节编码按照“同一字符集”
UCS-2表示字符。SDXF本身并不处理UTF-8,对一个UTF-8序列可能有多种解释,程序可
以:
? 重新构成UCS-2序列;
? 仅仅接受纯粹的ASCII字符而把非ASCII字符映射成非打印字符;
? 以ASCII为目标字符集,非ASCII字符作适当的变换(比如把法语中带有重音号
的元音去掉重音号);
? 以ASCII作为目标字符集,非ASCII字符映射成其他的字符,但不一定是非打印
字符。
? 等等。
不过SDXF为函数“extract”和“create”提供了接口,为了实现这些处理可以在属性
表内指定相应的函数指针。默认情况下该指针为空,就是说SDXF不再作进一步的转换,
仅仅把数据作为“二进制”位串简单的复制一份。如果指定了函数,则在“toUTF8”模式
调用create和在“fromUTF8”模式调用extract时就要执行该函数,由SDXF负责激活,对
用户是透明的。如果函数返回0,则SDXF没有作任何转换而仅仅复制数据。
10. 安全问题
只要数据块头部中的任何数据错误,则整个数据块无效。经过加密或压缩的SDXF结
构任何数据错误都会导致该数据块无法使用,在解密或解压缩后应该由“enter”函数进行完
整性检查。如果使用TCP/IP(更精确地讲是IP)作为传输媒介,可以信赖该协议在传输层
上的CRC校验。
11. 几点提示
1、 只要在“create”结构块时同时使用“leave”,就可以保证SDXF结构的一致性
构造。在结构块创建时,其数据类型被设为0,就是说这个块还不完整,
SDX_leave把数据类型设为“structured”。
2、 在原子块创建时要把依赖于平台的格式转换为平台无关的格式,在构造结束要
转存缓冲区内的数据时进行,除此之外不作其它的处理。
3、 应用程序不需要构造特殊的SDXF结构,只要调用前面定义的函数就可以动态
地创建数据。
4、 基于SDXF可以定义客户端/服务器应用的专门协议,只要根据以下两条原则就
可以保证扩展协议的向后兼容性:一是忽略无法识别的块,二是不能依赖于块
的顺序。
12. 关于IANA
SDXF作为一种开放性的标准,其压缩和加密算法不是固定的,可以采用任何不同的算
法,因此必须对压缩和加密算法的方法号进行统一管理。(加密方法本身并非SDXF语义的
一部分,但可用于连接协议协商采用的加密方法。)以下两项由IANA注册。
12.1 压缩方法
压缩SDXF块包含一个“压缩头”,其中用一个单字节无符号整数(1-255)表示采用的
压缩方法,这个列表由IANA负责维护:
压缩方法
说明
备注
01
RUN-LENGTH算法
参见第5章
02
DEFLATE(zip)
参见[DEFLATE]
03-239
IANA分配
240-255
专用方法
12.2 加密方法
既可以采用固定的加密方法,也可以在握手协议中协商加密方法。对于后者必须为每种
可能用到的加密方法分配一个编号,该列表由IANA负责维护:
加密方法
说明
01-239
IANA分配
240-255
专用方法
12.3 关于方法编号的分配
如果希望为SDXF注册新的压缩或加密方法,应该与IANA联系取得方法号。“编号分
配”文档包含一系列的方法号与相应的协议,参见[IANA]。新的方法必须作为RFC正式公
布,或者由标准化组织(如OSI)公布。
13. 讨论
关于Internet数据交换已经有许多标准可用,IETF推荐使用ASN.1和XML,因此需要
就建立新的数据格式的必要性进行讨论。
13.1 SDXF与ASN.1
制定ASN.1的目的是提供一种独立于程序语言的定义数据结构的方法,但是它并没有
定义实际用于发送的数据格式,而一般采用BER或PER(以及某些派生类型如CER和DER),
参见[BER]和[PER]。隐藏在ASN.1背后的理念是:在任何平台上开发指定的应用程序都可
以用ASN.1的符号表示程序的数据结构。除了这些之外,还可以通过ASN.1编译器的帮助
生成实际的程序语言定义。这个编译器同时还生成把数据结构包装成BER格式或者对BER
格式解包的转换函数。
直接把ASN.1与SDXF相比可能不太合适,SDXF的数据格式更接近于BER(相对而
言),是用ASN.1定义数据结构与SDXF并没有矛盾。但是SDXF并不需要一个完整的数据
结构构造发送的信息,接收到的信息也不包含完整的数据结构。其中的主要差别在于消息构
造和解释的概念,我把它称为“动态”和“静态”:ASN.1采用静态的方法,在消息创建之
前必须存在完整的数据结构;SDXF则采用动态的方法,通过调用SDXF函数渐近地组装和
分解消息。静态结构对某些应用可能是适宜的,但是对于复杂的任务要完整地定义消息往往
是不可能的。ASN.1尝试解决复杂结构文本文档的一个努力是XML,XML文档包含一系列
章节、段落和文本元素,这些元素又可以递归地包含其它的章节,个元素可以带有特定的文
本属性。
13.2 SDXF 与XML
另一方面,SDXF与XML非常类似,都可以处理递归定义的复杂的数据流,主要的差
别在于可以处理的数据类型。XML仅处理纯文本数据(另外还要注意XML并没有规定字
符数据的标准格式),XML文档的所有标签都是可以阅读的,不能直接包含图像之类的二进
制数据,但是可以通过HTML之类的外部链接引用二进制数据。在XML中,信息数据和
控制数据之间没有明显的区别,仅仅使用转义字符(比如“<”和“&”)和<![CDATA[…]]>
结构来区分。SDXF处理机器可读的数据,而不是用于人类阅读,也不能用文本编辑器编辑
SDXF数据(使用压缩和加密时尤其如此)。通过SDXF函数可以方便快捷的访问所有的数
据元素,标准的SXDF数据结构解析器只有一个简单的框架,“while-switch-case ID –enter /
extract”,参见第3.4.2节。
由于XML和SDXF(以及ASN.1)背后完全不同的原理,直接对其进行比较不是很明
智的,XML自有其存在的价值。SDXF同样如此。但是不管怎样,我们可以把XML数据流
转化成SDXF结构。首先把所有的XML标签都转化成块ID,元素序列<tag>纯文本</tag>
可以转换成类型为“字符”的原子(非结构)块。带有属性的标签和嵌套标签转换成结构块。
由于XML允许在文本流任何位置出现标签,必须引入一个人为的“简单文本”标签。比如
用<t>表示文本元素标签,则序列:<t>this is a text <attr value='bold'>with</attr> attributes</t>
应该想象成:
<t><et>this is a text </et><attr value='bold'><et>with</et></attr>
<et> attributes</et></t>
其中“et”表示“简单文本”标签,,则转换成如下的SDXF结构:
ID_t
|
+-- ID_et = " this is a text "
|
+-- ID_attr
| |
| +-- ID_value = "bold"
| |
| +-- ID_et = "with"
|
+-- ID_et = " attributes"
ID_t和ID_et可以用同一个ID表示,只能根据数据类型来区分(结构块用<t>,纯字符
用<et>)。图像之类的二进制数据可以直接嵌入SDXF结构而无需使用HTML或其他的外部
链接。
14. 作者地址
Max Wildgrube
Schlossstrasse 120
60486 Frankfurt
Germany
EMail: max@wildgrube.com
15. 鸣谢
感谢Michael J. Slifcak (mslifcak@iss.net)的积极探讨。
16. 参考
[ASN.1] Information processing systems - Open Systems
Interconnection, "Specification of Abstract Syntax Notation
One (ASN.1)", International Organization for
Standardization, International Standard 8824, December
1987.
[BER] Information Processing Systems - Open Systems
Interconnection - "Specification of Basic Encoding Rules
for Abstract Notation One (ASN.1)", International
Organization for Standardization, International Standard
8825-1, December 1987.
[DEFLATE] Deutsch, P., "DEFLATE Compressed Data Format Specification
version 1.3", RFC 1951, May 1996.
[IANA] Internet Assigned Numbers Authority,
http://www.iana.org/numbers.htm
[PER] Information Processing Systems - Open Systems
Interconnection -"Specification of Packed Encoding Rules
for Abstract Syntax Notation One (ASN.1)", International
Organization for Standardization, International Standard
8825-2.
[UCS] ISO/IEC 10646-1:1993. International Standard -- Information
technology -- Universal Multiple-Octet Coded Character Set
(UCS)
[UTF8] Yergeau, F., "UTF-8, a transformation format of ISO 10646",
RFC 2279, January 1998.
17. 版权声明
Copyright (C) The Internet Society (2001). All Rights Reserved.
This document and translations of it may be copied and furnished to
others, and derivative works that comment on or otherwise explain it
or assist in its implementation may be prepared, copied, published
and distributed, in whole or in part, without restriction of any
kind, provided that the above copyright notice and this paragraph are
included on all such copies and derivative works. However, this
document itself may not be modified in any way, such as by removing
the copyright notice or references to the Internet Society or other
Internet organizations, except as needed for the purpose of
developing Internet standards in which case the procedures for
copyrights defined in the Internet Standards process must be
followed, or as required to translate it into languages other than
English.
The limited permissions granted above are perpetual and will not be
revoked by the Internet Society or its successors or assigns.
This document and the information contained herein is provided on an
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
INCLUDING
BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
INFORMATION
HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES
OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
致谢
Funding for the RFC Editor function is currently provided by the
Internet Society.
RFC3072——Structured Data Exchange Format (SDXF) 结构化数据交换格式
3
RFC文档中文翻译计划
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -