Young's Blog

包子铺

[TCP/IP] DNS Review 1

1.DNS服务器之间的数据交换
    更新Primary服务器的配置文件后,Primary上的DNS服务会收到通知,重新加载配置文件。Secondary服务器一般会每隔一段时间(通常是 3个小时)后访问一下Primary服务器,如果Primary服务器有新的数据,则会进行 Zone Transfer来传递数据。

2.DNS服务器没有相应域名的数据
    这个时候DNS服务器必需要从其他的Authoritative DNS服务器中获取数据,不是所有的DNS服务器都知道这些Authoritative DNS服务器的地址,但是这些DNS服务器必需要知道的一点是怎么和Root服务器(只是IP地址)进行连接。而Root服务器知道其他 Authoritative DNS服务器的IP地址,所以整个过程就变成:我们首先访问Primary DNS服务器,然后Primary DNS服务器去访问Root服务器获取所对应的Authoritative DNS服务器的IP地址,最后访问该Authoritative DNS服务器来得到正确的域名数据。
   
3.DNS数据包中的Flags标志位
    +--------------------------------------------------+
    | QR | OpCode | AA | TC | RD | RA | (Zero) | RCode |
    +--------------------------------------------------+
   
    QR:         1Bit,0表示Query,1表示Response
    OpCode:     4Bit,值为0,表示Standard Query;值为1表示Inverse Query;值为2表示Server Status Requested。
    AA:         1Bit,表示当前服务器返回的是Authoritative Answer。
    TC:         1Bit,表示当前数据Truncated,如果数据包是UDP类型,则表示总长度超出512Bytes,只有前面512Bytes返回回来。
    RD:         1Bit,表示Recursive Desired,这个标志位可以同时在Request和Response过程中设置,在Response中设置这个标志位表示:
                      a).服务器返回包含CNAME的数据,同时也会指出这个数据是Authoritative的还是Cached的。
                      b).服务器返回错误,报告该域名或者主机不存在,这个数据可能也会包含CNAME信息,来对应着不存在的主机。
                      c).服务器返回错误,报告由于网络原因无法连接其他的DNS服务器。

                  如果在Request中设置这个标志位表示,对于这个域名的解析,需要DNS服务器自己去进行Recursive的查询,来获得答案,例如:
                      1).我的机器解析"report.example.com"这个域名,随后发送数据包到我所配置的DNS服务器上。
                      2).DNS服务器发现自己没有"report.example.com"的记录,DNS服务器就向Root服务器发起Query来查询"report.example.com"。
                      3).Root服务器返回.COM域的Authoritative DNS服务器列表给DNS服务器。
                      4).DNS服务器向这个列表中的Authoritative DNS发起对"report.example.com“的Query。
                      5).Authoritative DNS发现"report"是"test"的别名,于是返回"test.noexample.com"的地址信息和"report=test"的CNAME数据。
                      6).DNS服务器接收这个数据后,把相应的地址信息转发给我。

    RA:        1Bit,通常在Response数据中设置,表示当前服务器可以进行Recursive的Query。
    RCode:     4Bit,表示返回值,0表示成功,3表示域名错误。

4.关于在DNS数据包中域名部分的字符指针
    由于DNS 数据包中可能会出现多个域名,因此采用一种特殊的数据压缩方法:在任何可能有域名字符数据的地方,如果一个字节的高两位置为1则表示下一个字节不是普通的 字符串计数,而是字符串指针,下一个字节的8Bit,加上当前这个字节没有置0的6Bit,一共是14Bit的字符串指针,这个指针所记录的地址是从 DNS数据包开始来计算的。

posted on 2010-01-19 11:46 Young 阅读(309) 评论(0)  编辑 收藏 引用 所属分类: LearnNote


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理