---------------------------------------------------------
Author :Shawn Lee
WebSite :http://blog.csdn.net/twelvelee
Email :xiaofengoffice@163.com
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)