DNS及mDNS 名字(名称)压缩规则

---------------------------------------------------------

Author             :Shawn Lee

WebSite            :http://blog.csdn.net/twelvelee

Email               :[email protected]

Update-Time   : 2011年8月24日星期三

Shawn声明:本人鄙视直接复制本人文章而不加出处的个人或团体,

但不排斥别人转载Shawn Lee的文章,只是请您注明出处并和本人

联系或留言给我。

---------------------------------------------------------

1.名字压缩存在的合理性:

在网络上传送时,如果数据的尺寸太大,就会占用网络很长时间进行发送,这样网络的效率就比较低。想要提高网络的使用效率,就可以减少发送的数据的尺寸。当产生一个mDNS数据包, mDNS执行程序应该对需要压缩的资源记录名字使用名字压缩,当一个数据包含多于一个问题时,一个数据包中的连续问题经常是相似的名字,就可以使用名称压缩来减少整个数据包的字节数。传输压缩之后的数据包,可以使网络更加有效率。

1.1      名字压缩方法:

压缩本质就是使用一个两字节的指针,指向已有的名字,压缩后的名字中包含这个指针,(这个指针并不是通常C语言中的内存地址,而是一个偏移量)。

1.1.1 不使用名字压缩时域名的存储如下:

www.xupt.edu.cn

www.baidu.com

绿色框中的数字表示计数,占用一个字节(它的值表示随后的标识符字节数),之后是标签标示符长度在63字节之内,最后后以字符 ‘\0’ 结尾。

1.1.2 使用压缩时

用一个指向之前的指针来替代之前的出现的名字,这个指针使用字节开头的两个比特是都是1。这就可以将这两字节的一个指针从一个标签中区分出来,因为标签限制在63个字节或更少,标签必须以00比特开始。(10和01组合留作将来使用)。OFFSET段指定一个从消息开始(在域头中ID段的第一个字节)的偏移。零偏移指的是ID段的第一个字节。

压缩方法很简单,当一个域名中的标识符是压缩的,它的“计数”字节中的最高两位将被设置为11。这表示它是一个16 bit指针而不再是8 bit的计数字节。指针中的剩下14 bit表示该标识符在D N S报文中所在的位置偏移(相对于DNS报文头)。注意一个指针可能指向一个完整的域名,也可能只指向域名的结尾部分,并且一个域名也可以前半部分不压缩,仅对后半部分才应用指针压缩。此外嵌套压缩也是存在的,即指针指向的域名也可能是压缩的(包含一个指针)。

OFFSET段指一个从消息开始(在域头中ID段的第一个字节)的偏移。零偏移指的是ID段的第一个字节。

1.2      举例:

如一个数据包中三个名字:

1)         youdian.jsj.com  (假如“y”在数据包中的偏移量为40)

总长度16个字节

2)          xian.youdian.jsj.com

总长度21个字节

    3) youdian.jsj.com

第二个名字经过压缩:

长度由原来的21个字节缩短为现在的7个字节。

第三个名字经过压缩后:

长度有原来的16个字节缩短为现在的两个字节

另外有两点需要注意:

1.     一个域名仅能包含一个指针,要么只有两个字节就只包含一个指针,要么只在结尾部分跟随一个指针。

2.     包含指针的域名无须以字符 ‘\0’ 结尾。

2      参考文献

RFC 1035 的4.1.4节所述massage compression

http://freesoft.org/CIE/RFC/1035/index.htm

 

你可能感兴趣的:(DNS及mDNS 名字(名称)压缩规则)