精华内容
下载资源
问答
  • 2021-05-21 11:24:53

    Header各字段分别解释如下:

    • ID 请求客户端设置的16位标示,服务器给出应答的时候会带相同的标示字段回 来,这样请求客户端就可以区分不同的请求应答了。
    • QR 1个比特位用来区分是请求(0)还是应答(1)。
    • OPCODE 4个比特位用来设置查询的种类,应答的时候会带相同值,可用的值如下:
      • 0 标准查询 (QUERY)
      • 1 反向查询 (IQUERY)
      • 2 服务器状态查询 (STATUS)
      • 3-15 保留值,暂时未使用
    • AA 授权应答(Authoritative Answer) - 这个比特位在应答的时候才有意义,指出给 出应答的服务器是查询域名的授权解析服务器。 注意因为别名的存在,应答可能存在多个主域名,这个AA位对应请求名,或 者应答中的第一个主域名。
    • TC 截断(TrunCation) - 用来指出报文比允许的长度还要长,导致被截断。
    • RD 期望递归(Recursion Desired) - 这个比特位被请求设置,应答的时候使用的相 同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的 支持是可选的。
    • RA 支持递归(Recursion Available) - 这个比特位在应答中设置或取消,用来代表服 务器是否支持递归查询。
    • Z 保留值,暂时未使用。在所有的请求和应答报文中必须置为0。
    • RCODE 应答码(Response code) - 这4个比特位在应答报文中设置,代表的含义如下:
      • 0 没有错误。
      • 1 报文格式错误(Format error) - 服务器不能理解请求的报文。
      • 2 服务器失败(Server failure) - 因为服务器的原因导致没办法 处理这个请求。
      • 3 名字错误(Name Error) - 只有对授权域名解析服务器有意义, 指出解析的域名不存在。
      • 4 没有实现(Not Implemented) - 域名服务器不支持查询类型。
      • 5 拒绝(Refused) - 服务器由于设置的策略拒绝给出应答。比如, 服务器不希望对某些请求者给出应答,或者服务器不希望进 行某些操作(比如区域传送zone transfer)。
      • 6-15 保留值,暂时未使用。
    • QDCOUNT 无符号16位整数表示报文请求段中的问题记录数。
    • ANCOUNT 无符号16位整数表示报文回答段中的回答记录数。
    • NSCOUNT 无符号16位整数表示报文授权段中的授权记录数。
    • ARCOUNT 无符号16位整数表示报文附加段中的附加记录数。

    Question各字段分别解释如下:

    • QNAME 域名被编码为一些labels序列,每个labels包含一个字节表示后续字符串长度,以及这个字符串,以0长度和空字符串来表示域名结束。注意这个字段可能为奇数字节,不需要进行边界填充对齐。
    • QTYPE 2个字节表示查询类型,.取值可以为任何可用的类型值,以及通配码来表示所有的资源记录。
    • QCLASS 2个字节表示查询的协议类,比如,IN代表Internet。

    资源记录格式(Resource record):
      应答,授权,附加段都共用相同的格式:多个资源记录,资源记录的个数由报文头段中对应的几个数值确定,每个资源记录格式如下:

    • NAME 资源记录包含的域名
    • TYPE 2个字节表示资源记录的类型,指出RDATA数据的含义
    • CLASS 2个字节表示RDATA的类
    • TTL 4字节无符号整数表示资源记录可以缓存的时间。0代表只能被传输,但是不能被缓存。
    • RDLENGTH 2个字节无符号整数表示RDATA的长度
    • RDATA 不定长字符串来表示记录,格式根TYPE和CLASS有关。比如,TYPE是A,CLASS 是 IN,那么RDATA就是一个4个字节的ARPA网络地址。

    报文压缩
      为了减小报文,域名系统使用一种压缩方法来消除报文中域名的重复。使用这种方法,后面重复出现的域名或者labels被替换为指向之前出现位置的指针。 指针占用2个字节,前两个比特位都为1。因为lablels限制为不多于63个字节,所以label的前两位一定为0,这样就可以让指针与label进行区分。(10 和 01 组合保留,以便日后使用) 。偏移值(OFFSET)表示从报文开始的字节指针,偏移量为0表示ID字段的第一个字节。 压缩方法让报文中的域名成为: 以0结尾的labels序列 - 一个指针 - 指针结尾的labels序列。指针只能在域名不是特殊格式的时候使用,否则域名服务器或解析器需要知道资源记录的格式。目前还没有这种情况,但是以后可能会出现。 如果报文中的域名需要计算长度,并且使用了压缩算法,那么应该使用压缩后的长度,而不是压缩前的长度。 程序可以自由选择是否使用指针,虽然这回降低报文的容量,而且很容易产生截断。不过所有的程序都应该能够理解收到的报文中包含的指针。

    eg: A查询   
    dig   www.baidu.com   A
    
    请求报文:
    a4 bb 01 20 00 01 00 00 00 00 00 01 03 77 77 77            ... .... .....www
    05 62 61 69 64 75 03 63 6f 6d 00 00 01 00 01 00            .baidu.c om......
    00 29 10 00 00 00 00 00 00 00                              .)...... ..
    
    Flags: 0x0120 Standard query
    	0... .... .... ....          = Response: Message is a query
    	.000 0... .... ....          = Opcode: Standard query (0)
    	.... ..0. .... ....          = Truncated: Message is not truncated
    	.... ...1 .... ....          = Recursion desired: Do query recursively
    	.... .... .0.. ....          = Z: reserved (0)
    	.... .... ..1. ....          = AD bit: Set
    	.... .... ...0 ....          = Non-authenticated data: Unacceptable
            
    Questions: 1
    Answer RRs: 0
    Authority RRs: 0
    Additional RRs: 1
    
    Queries:
    	Name: www.baidu.com             0x03 77 77 77 05 62 61 69 64 75 03 63 6f 6d 00
    	Type: A (Host Address) (1)      0x00 01
    	Class: IN (0x0001)              0x00 01
    
    应答报文:
    a4 bb 81 80 00 01 00 03 00 00 00 00 03 77 77 77              ........ .....www
    05 62 61 69 64 75 03 63 6f 6d 00 00 01 00 01 c0              .baidu.c om......
    0c 00 05 00 01 00 00 04 0a 00 0f 03 77 77 77 01               ........ ....www.
    61 06 73 68 69 66 65 6e c0 16 c0 2b 00 01 00 01               a.shifen ...+....
    00 00 00 d5 00 04 dc b5 26 96 c0 2b 00 01 00 01               ........ &..+....
    00 00 00 d5 00 04 dc b5 26 95                                 ........ &.
    
    Flags: 0x8180 Standard query response, No error
    	1... .... .... ....             = Response: Message is a response
    	.000 0... .... ....             = Opcode: Standard query (0)
    	.... .0.. .... ....             = Authoritative: Server is not an authority for domain
    	.... ..0. .... ....             = Truncated: Message is not truncated
    	.... ...1 .... ....             = Recursion desired: Do query recursively
    	.... .... 1... ....             = Recursion available: Server can do recursive queries
    	.... .... .0.. ....             = Z: reserved (0)
    	.... .... ..0. ....             = Answer authenticated: Answer/authority portion was not authenticated by the server
    	.... .... ...0 ....             = Non-authenticated data: Unacceptable
    	.... .... .... 0000             = Reply code: No error (0)
    
    Questions: 1
    Answer RRs: 3
    Authority RRs: 0
    Additional RRs: 0
    
    Queries:
    	Name: www.baidu.com 0x03 77 77 77 05 62 61 69 64 75 03 63 6f 6d 00
    	Type: A (Host Address) (1) 0x00 01
    	Class: IN (0x0001) 0x00 01
    
    Answers:
    	www.baidu.com: type CNAME, class IN, cname www.a.shifen.com
    		Name: www.baidu.com                                        0xc00c 报文压缩 1100 0000 0000 1100 偏移12字节
    		Type: CNAME (Canonical NAME for an alias) (5)              0x0005
    		Class: IN                                                  0x0001
    		Time to live: 1034 (17 minutes, 14 seconds)                0x0000040a
    		Data length: 15                                            0x000f
    		CNAME: www.a.shifen.com                                    0x03 77 77 77 01 61 06 73 68 69 66 65 6e c0 16
    	
    	www.a.shifen.com: type A, class IN, addr 220.181.38.150
    		Name: www.a.shifen.com                                     0xc02b 偏移43字节
    		Type: A (Host Address) (1)
    		Class: IN (0x0001)
    		Time to live: 213 (3 minutes, 33 seconds)
    		Data length: 4
    		Address: 220.181.38.150
    	
    	www.a.shifen.com: type A, class IN, addr 220.181.38.149
    		Name: www.a.shifen.com
    		Type: A (Host Address) (1)
    		Class: IN (0x0001)
    		Time to live: 213 (3 minutes, 33 seconds)
    		Data length: 4
    		Address: 220.181.38.149
    
    更多相关内容
  • DNS报文格式

    2019-04-05 15:29:17
    DNS报文格式详解。主机名到IP地址的映射有两种方式:1)静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用;2)动态映射,建立一套域名解析系统(DNS),只在专门的...
  • DNS报文格式解析

    2022-02-22 10:00:45
    DNS

    DNS 分为查询请求和查询响应,请求和响应的报文格式相同

    DNS 报文格式如上图所示,包括报文首部、问题部分、资源记录部分。

    一、报文首部

    DNS 报文的报文首部如下图所示,包括事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个字段,每个字段2个字节,共12个字节。

    该部分中每个字段含义如下。

    • 事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。
    • 标志:DNS 报文中的标志字段。
    • 问题计数:DNS 查询请求的数目。
    • 回答资源记录数:DNS 响应的数目。
    • 权威名称服务器计数:权威名称服务器的数目。
    • 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。

    标志字段又分为若干个字段,如图所示。
     

    标志字段中每个字段的含义如下:

    • QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
    • Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
    • AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
    • TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
    • RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
    • RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
    • Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
    • rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。

    为了能够更好地了解 DNS 数据包的基础结构部分,下面通过捕获的 DNS 数据包查看基础结构部分。

    1) DNS 请求数据包基础结构部分,如图所示。
     

    图中的数据包为 DNS 请求包,Domain Name System(query) 部分方框标注中的信息为 DNS 报文中的基础结构部分。

    为了方便讲解这里将信息列出进行说明:

    Domain Name System (query)
        Transaction ID: 0x9ad0                              #事务ID
        Flags: 0x0000 Standard query                        #报文中的标志字段
            0... .... .... .... = Response: Message is a query
                                                            #QR字段, 值为0, 因为是一个请求包
            .000 0... .... .... = Opcode: Standard query (0)
                                                            #Opcode字段, 值为0, 因为是标准查询
            .... ..0. .... .... = Truncated: Message is not truncated
                                                            #TC字段
            .... ...0 .... .... = Recursion desired: Don't do query recursively 
                                                            #RD字段
            .... .... .0.. .... = Z: reserved (0)           #保留字段, 值为0
            .... .... ...0 .... = Non-authenticated data: Unacceptable   
                                                            #保留字段, 值为0
        Questions: 1                                        #问题计数, 这里有1个问题
        Answer RRs: 0                                       #回答资源记录数
        Authority RRs: 0                                    #权威名称服务器计数
        Additional RRs: 0                                   #附加资源记录数

    以上输出信息显示了 DNS 请求报文中基础结构部分中包含的字段以及对应的值。这里需要注意的是,在请求中 Questions 的值不可能为 0;Answer RRs,Authority RRs,Additional RRs 的值都为 0,因为在请求中还没有响应的查询结果信息。这些信息在响应包中会有相应的值。

    2) DNS 响应数据包基础结构部分如图所示。
     

    图中方框标注部分为响应包中基础结构部分,每个字段如下:

    Domain Name System (response)
        Transaction ID: 0x9ad0                                    #事务ID
        Flags: 0x8180 Standard query response, No error           #报文中的标志字段
            1... .... .... .... = Response: Message is a response
                                                                  #QR字段, 值为1, 因为是一个响应包
            .000 0... .... .... = Opcode: Standard query (0)      # Opcode字段
            .... .0.. .... .... = Authoritative: Server is not an authority for
            domain                                                #AA字段
            .... ..0. .... .... = Truncated: Message is not truncated
                                                                  #TC字段
            .... ...1 .... .... = Recursion desired: Do query recursively 
                                                                  #RD字段
            .... .... 1... .... = Recursion available: Server can do recursive
            queries                                               #RA字段
            .... .... .0.. .... = Z: reserved (0)
            .... .... ..0. .... = Answer authenticated: Answer/authority portion
            was not authenticated by the server
            .... .... ...0 .... = Non-authenticated data: Unacceptable
            .... .... .... 0000 = Reply code: No error (0)        #返回码字段
        Questions: 1
        Answer RRs: 2
        Authority RRs: 5
        Additional RRs: 5

    以上输出信息中加粗部分为 DNS 响应包比请求包中多出来的字段信息,这些字段信息只能出现在响应包中。在输出信息最后可以看到 Answer RRs,Authority RRs,Additional RRs 都有了相应的值(不一定全为 0)。

    二、问题部分

    问题部分指的是报文格式中查询问题区域(Queries)部分。该部分是用来显示 DNS 查询请求的问题,通常只有一个问题。该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。

    问题部分格式如图所示。
     

    该部分中每个字段含义如下:

    • 查询名:一般为要查询的域名,有时也会是 IP 地址,用于反向查询。
    • 查询类型:DNS 查询请求的资源类型。通常查询类型为 A 类型,表示由域名获取对应的 IP 地址。
    • 查询类:地址类型,通常为互联网地址,值为 1。


    1) DNS 请求包的问题部分字段信息,如图所示。
     


    在下图中,Queries 部分的信息为问题部分信息,每个字段说明如下:

    Domain Name System (query)                        #查询请求
        Queries                                       #问题部分
            baidu.com: type A, class IN
                Name: baidu.com                       #查询名字段, 这里请求域名baidu.com
                [Name Length: 9]
                [Label Count: 2]
                Type: A (Host Address) (1)            #查询类型字段, 这里为A类型
                Class: IN (0x0001)                    #查询类字段, 这里为互联网地址

    其中,可以看到 DNS 请求类型为 A,那么得到的响应信息也应该为 A 类型。

    2) DNS 响应包的问题部分字段信息,如图所示。
     

    从图中 Queries 部分中可以看到,响应包中的查询类型也是 A,与请求包的查询类型是一致的。

    三、资源记录部分

    资源记录部分是指 DNS 报文格式中的最后三个字段,包括回答问题区域字段、权威名称服务器区域字段、附加信息区域字段。这三个字段均采用一种称为资源记录的格式,格式如图所示。
     

    资源记录格式中每个字段含义如下:

    • 域名:DNS 请求的域名。
    • 类型:资源记录的类型,与问题部分中的查询类型值是一样的。
    • 类:地址类型,与问题部分中的查询类值是一样的。
    • 生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
    • 资源数据长度:资源数据的长度。
    • 资源数据:表示按查询段要求返回的相关资源记录的数据。


    资源记录部分只有在 DNS 响应包中才会出现。下面通过 DNS 响应包来进一步了解资源记录部分的字段信息。

    1) DNS 响应包的资源记录部分的字段信息,如图所示。
     

    其中,方框中标注的信息为 DNS 响应报文的资源记录部分信息。该部分信息主要分为三部分信息,即回答问题区域、权威名称服务器区域、附加信息区域,下面依次分析这三部分信息。

    2) 回答问题区域字段的资源记录部分信息如下:

    Answers                                                      #“回答问题区域”字段
        baidu.com: type A, class IN, addr 220.181.57.216         #资源记录部分
            Name: baidu.com                                      #域名字段, 这里请求的域名为baidu.com
            Type: A (Host Address) (1)                           #类型字段, 这里为A类型
            Class: IN (0x0001)                                   #类字段
            Time to live: 5                                      #生存时间
            Data length: 4                                       #数据长度
            Address: 220.181.57.216                              #资源数据, 这里为IP地址
        baidu.com: type A, class IN, addr 123.125.115.110        #资源记录部分
            Name: baidu.com
            Type: A (Host Address) (1)
            Class: IN (0x0001)
            Time to live: 5
            Data length: 4
            Address: 123.125.115.110

    其中,Name 的值为 baidu.com,表示 DNS 请求的域名为 baidu.com;类型为 A,表示要获取该域名对应的 IP 地址。Address 的值显示了该域名对应的 IP 地址。这里获取到了 2 个 IP 地址,分别为 220.181.57.216 和 123.125.115.110。

    3) 权威名称服务器区域字段的资源记录部分信息如下:

    Authoritative nameservers                               #“权威名称服务器区域”字段
    baidu.com: type NS, class IN, ns ns7.baidu.com      #资源记录部分
    Name: baidu.com
    Type: NS (authoritative Name Server) (2)        #类型字段, 这里为NS类型
    Class: IN (0x0001)
    Time to live: 5
    Data length: 6
    Name Server: ns7.baidu.com                      #权威名称服务器
    baidu.com: type NS, class IN, ns dns.baidu.com      #资源记录部分
    Name: baidu.com
    Type: NS (authoritative Name Server) (2)        #类型字段, 这里为NS类型
    Class: IN (0x0001)
    Time to live: 5
    Data length: 6
    Name Server: dns.baidu.com                      #权威名称服务器
    baidu.com: type NS, class IN, ns ns3.baidu.com      #资源记录部分
    Name: baidu.com
    Type: NS (authoritative Name Server) (2)
    Class: IN (0x0001)
    Time to live: 5
    Data length: 6
    Name Server: ns3.baidu.com                      #权威名称服务器
    baidu.com: type NS, class IN, ns ns4.baidu.com      #资源记录部分
    Name: baidu.com
    Type: NS (authoritative Name Server) (2)
    Class: IN (0x0001)
    Time to live: 5
    Data length: 6
    Name Server: ns4.baidu.com                      #权威名称服务器
    baidu.com: type NS, class IN, ns ns2.baidu.com      #资源记录部分
    Name: baidu.com
    Type: NS (authoritative Name Server) (2)
    Class: IN (0x0001)
    Time to live: 5
    Data length: 6
    Name Server: ns2.baidu.com                      #权威名称服务器

    其中,Name 的值为 baidu.com,表示 DNS 请求的域名为 baidu.com;类型为 NS,表示要获取该域名的权威名称服务器名称。Name Server 的值显示了该域名对应的权威名称服务器名称。这里总共获取到 5 个,如 ns7.baidu.com。

    4) 附加信息区域字段的资源记录部分信息如下:

    Additional records                                            #“附加信息区域”字段
        dns.baidu.com: type A, class IN, addr 202.108.22.220      #资源记录部分
            Name: dns.baidu.com                                   #“权威名称服务器”名称
            Type: A (Host Address) (1)                            #类型字段, 这里为A类型
            Class: IN (0x0001)
            Time to live: 5
            Data length: 4
            Address: 202.108.22.220                               #“权威名称服务器”的IP地址
        ns2.baidu.com: type A, class IN, addr 61.135.165.235      #资源记录部分
            Name: ns2.baidu.com                                   #“权威名称服务器”名称
            Type: A (Host Address) (1)                            #类型字段, 这里为A类型
            Class: IN (0x0001)
            Time to live: 5
            Data length: 4
            Address: 61.135.165.235                               #“权威名称服务器”的IP地址
        ns3.baidu.com: type A, class IN, addr 220.181.37.10       #资源记录部分
            Name: ns3.baidu.com                                   #“权威名称服务器”名称
            Type: A (Host Address) (1)                            #类型字段, 这里为A类型
            Class: IN (0x0001)  
            Time to live: 5
            Data length: 4
            Address: 220.181.37.10                                 #“权威名称服务器”的IP地址
        ns4.baidu.com: type A, class IN, addr 220.181.38.10        #资源记录部分
            Name: ns4.baidu.com                                    #“权威名称服务器”名称
            Type: A (Host Address) (1)                             #类型字段, 这里为A类型
            Class: IN (0x0001)
            Time to live: 5
            Data length: 4
            Address: 220.181.38.10                                 #“权威名称服务器”的IP地址
        ns7.baidu.com: type A, class IN, addr 180.76.76.92         #资源记录部分
            Name: ns7.baidu.com                                    #“权威名称服务器”名称
            Type: A (Host Address) (1)                             #类型字段, 这里为A类型
            Class: IN (0x0001)
            Time to live: 5
            Data length: 4
            Address: 180.76.76.92                                  #“权威名称服务器”的IP地址

    其中,Name 的值为“权威名称服务器”名称,Type 的值为 A,表示获取域名对应的 IP 地址;Address 的值显示了所有获取到的权威名称服务器对应的 IP 地址。

    例如,权威名称服务器名称 ns7.baidu.com 对应的 IP 地址为 180.76.76.92。

    四、请求应答类型--type字段

    根据RFC 1034可知,type字段可以为以下几种类型:

    A               a host address   请求应答类型为域名服务器地址

    CNAME    identifies the canonical name of an alias  请求应答类型为域名服务器别名

    HINFO      identifies the CPU and OS used by a host      请求应答类型为域名服务器系统信息

    MX            identifies a mail exchange for the domain.  See [RFC-974 for details.   邮件代理服务器

    NS            the authoritative name server for the domain   权威服务器

    PTR          a pointer to another part of the domain name space 指向域名空间

    SOA          identifies the start of a zone of authority]   标识权威DNS域的起始位置

    对于CNAME、NS类型的资源为域名服务器在本地查找不到后返回的备用域名,对于CNAME资源会在应答资源区返回CNAME域名的IP,对于NS类型的域名,在权威域名区列出NS类型的域名,在附加资源段返回NS类型的域名的IP;以上均在同一个应答报文中进行记录,对于发起DNS请求的客户端来说,只需匹配最原始的请求域名或与请求报文的序列号相同的应答报文,解析出所有IP即可

    ​​​​​​​

     

    展开全文
  • DNS报文解析及代码实现(详细)

    千次阅读 2021-10-30 18:46:22
    DNS报文封装在UDP数据报或TCP数据段中,然后封装在IP数据报中,最后封装成数据链路层中的帧通过物理层传输。 DNS报文结构有哪些类型 DNS报文可以分为查询和应答,他们的总体结构是相同的。DNS的顶层格式分成5个部分...

    在Internet上,DNS可以使用UDP,也可以使用TCP,在两种情况下,DNS服务器使用的公认端口是53。
    DNS报文封装在UDP数据报或TCP数据段中,然后封装在IP数据报中,最后封装成数据链路层中的帧通过物理层传输。

    DNS报文结构有哪些类型

    DNS报文可以分为查询和应答,他们的总体结构是相同的。DNS的顶层格式分成5个部分:

    1、首部(Header)
    2、问题(Question)
    3、回答(Answer)
    4、权威(Authority)
    5、附加(Additional)

    在这里插入图片描述
    大体DNS报文格式就是这样。这里截屏没有权威和附加的资源记录。可以通过标红框上的信息看出
    在这里插入图片描述

    每一类DNS报文都有一个首部部分。首部包括一些字段,用于规定其余部分是否存在,也是规定是查询还是响应,是标准查询还是其他类型的操作。

    在这里插入图片描述

    首部后面是其他部分的名称来自它们在标准查询中的使用。问题部分包括的字段用于描述发送给服务器的问题(查询请求)。这些字段时查询类型、查询类和查询域名。

    在这里插入图片描述
    回答部分包括问题的资源记录。权威部分包括指向权威DNS服务器的资源记录。

    DNS报文的首部格式说明

    查询报文和应答报文都具有相同的首部格式,查询报文主要是将某些字段设置为0,首部长度为12字节。

    在这里插入图片描述
    上图中显示了 DNS 的报文格式。其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个字段是DNS的报文首部,共 12 个字节。

    在这里插入图片描述
    标志字段中每个字段的含义如下:

    Response:查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。

    Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。

    Authoritative:授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。

    Truncated:表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。

    Recursion Desired:期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。

    Recursion Available:可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。

    Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。

    问题部分格式说明

    问题部分用在大多数查询报文中表达具体的查询问题,即定义要查什么。

    在这里插入图片描述
    查询域名:是可变长字段。查询名称由标签序列构成,每个标签前有一个八位位组指出该标签的长度。因为每个域名以空标签结束,因此每个域名的最后一个八位位组的值为0.。

    查询类型:两个八位位组代码,长度16位,它指定查询的类型。这个类型的值包括所有适用于资源记录类型。记录类型如下(信息参考:https://www.cnblogs.com/bonelee/p/7611941.html):

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    查询类:两个八位位组代码,指定查询的类。例如:对于Internet,查询类字段值为1,其符号表示为IN。

    资源记录格式说明

    回答部分、权威部分和附加部分都是共享相同格式,就是可变数目的资源记录,其中记录的数目在首部相应计数字段中规定。只有应答报文才提供资源记录。
    在这里插入图片描述

    Name:可变长字段,指该资源记录匹配的域名。它实际上就是查询报文问题部分查询名称的副本,但由于在域名重复出现的地方DNS使用压缩,这个字段就是到查询报文问题部分中的相应域名的指针偏移。

    Type:两个八位位组代码,长度16位,指定资源记录的类型,说明RDATA字段中数据意义。该字段与问题部分的查询类型字段相同。

    Class:两个八位位组,指定RDATA字段中数据的类,与问题部分的查询类字段相同。

    TTL:生成时间,32位无正负号整数,指定资源记录可以被缓存时间,单位是秒。值为0表示资源记录仅能用于正在进行的业务,不能被缓存。

    Data length:资源数据长度,无符号16位整数,指定RDATA字段长度,以八位位组为字节。

    资源数据:可变长字段,是资源记录的具体内容。其格式取决于资源记录的TYPE和CLASS字段。

    资源数据格式种类包含如下:

    • 数字:八位位组表示数,例如,IPv4地址是4个八位组整数,而IPv6地址是一个16个八位组整数。
    • 域名:可用标签序列来表示。每一个标签前面有1个字节长度字段,它定义标签中的字段数。长度字段的两个高位永远是0,标签的长度不能超过63字节。
    • 偏移指针:域名可以用偏移指针来替换。偏移指针是2字节字段,它的两个高位置为1
    • 字符串:用1字节的长度字段后面跟着长度字段数。长度字段并不像域名长度字段那样受限。字符串可以多达256个字符。

    DNS报文传输

    • 使用UDP进行传输

    使用UDP用户服务器端口53发送消息。由UDP携带的DNS报文长度被限制在512字节之内,其中不包括IP首部或UDP首部。较长的DNS报文被截断,TCP字段在首部中被设置为1。

    UDP是DNS的Internet标准查询的推荐方式,但不包括区域传输。使用UDP发送的查询可能丢失,因此需要考虑传策略。查询或查询的应答可能由网络重新排序,或者经DNS服务器处理过,因此解析程序不能依赖按顺序返回的应答。

    • 使用TCP进行传输

    通过TCP传输的DNS报文使用两个字节长度字段做前缀。这个长度字段给出报文长度,计算长度不包括这个长度字段。该长度字段使得在开始解析报文之前,底层处理能够组装好完整的报文。

    DNS协议解析

    int main(int argc, char *argv[])
    {
        	
    	char errbuf[100];
    	pcap_t *desc = 0;
        char *filename = argv[1];
        if (argc != 2)
        {
            printf("usage: ./dissect_pppoe [pcap file]\n");
            return -1;
        }
    
        printf("ProcessFile: process file: %s\n", filename);
        if ((desc = pcap_open_offline(filename, errbuf)) == NULL)
        {   
            printf("pcap_open_offline: %s error!\n", filename);
            return -1; 
        }   	
    	
    	
        pcap_loop(desc, -1, got_packet, NULL);
        pcap_close(desc);
        return 0;
    }
    

    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    总结

    在分析DNS报文时,可以使用nslookup工具来测试DNS解析,要获取DNS报文的详细数据信息,需要使用Wrieshark捕获DNS流量进行分析。

    欢迎关注微信公众号【程序猿编码】,需要DNS完整源码和报文的添加本人微信号(c17865354792)

    参考:RFC 973、RFC 1886

    展开全文
  • 七、DNS报文及抓包分析

    千次阅读 2021-01-20 14:30:22
    六、DNS的资源记录与报文格式 6.1、资源记录 资源记录(Resource Record)在DNS的查询和应答报文中。DNS服务器也存储资源记录。 资源记录是包含4个字段:(Name, Valuer, Type, TTL) 。TTL是该记录的生存时间,它...

    六、DNS的资源记录与报文格式

    6.1、资源记录

    资源记录(Resource Record)在DNS的查询和应答报文中。DNS服务器也存储资源记录。

    资源记录是包含4个字段:(Name, Valuer, Type, TTL) 。TTL是该记录的生存时间,它决定了RR在缓存中的时间。

    Name和Value的值取决于Type,常见的三种type如下:

    如果Type = A,则Name是主机名,Value是该主机名对应的IP地址。 A资源记录提供了主机名到IP地址的映射。 例如(bar.foo.com, 145.37.93.126, A)。

    如果Type = NS,则Name是一个域(如foo.com),而Value是该域的权威DNS服务器的域名。例如(foo.com, dns.foo.com, NS)。NS资源记录用于将DNS查询报文发送到对应的DNS服务器(路由DNS查询)。

    如果Type = CNAME,则Value是名为Name的主机对应的规范主机名(别名)。 例如(foo.com, relay1.bar. foo. com, CNAME)。该记录保存一个主机名对应的别名。

     

    6.2、报文格式

     DNS有两种报文,查询和回答报文。 而且查询和回答报文的总体格式相同,如下图

    前三行一共12个字节。标识符是一个16比特的数,用于标识该查询。 这个标识符会被复制到对查询的回答报文中,用来匹配发送的请求和接收到的回答。

    标志字段中有若干标志。 1比特的查询/回答标志位指出报文是查询报文(0)还是回答报文(1)。当请求DNS服务器是权威DNS服务器时,1比特的“权威服务器” 标志位被置在回答报文中。

    如果主机或者DNS服务器在该某DNS服务器没有某记录时,希望执行递归查询,将设置1比特的“希望递归查询” 标志位在查询报文中。 如果该DNS服务器支持递归查询,在它的回答报文中会对1比特的“递归可用” 标志位置位。

    还有4个有关数量的字段,这些字段对应后面4类数据区域出现的数量。

    问题区域包括:①名字字段(正在被查询的主机名字)②类型字段(正被询问的问题类型,例如主机地址是与一个名字相关联(类型A)还是与某个名字的邮件服务器相关联(类型MX))。

    在回答报文的回答区域中可以包含多条RR(因此一个主机名能够有多个IP地址)。权威区域包含了其他权威服务器的记录。附加区域包含了其他有帮助的记录。

     

    七、DNS报文示例

    关于DNS的命令见博客https://blog.csdn.net/Master_Cui/article/details/112862903https://blog.csdn.net/Master_Cui/article/details/112862810

    当在浏览器中输入www.baidu.com时,DNS的报文整体是这样的:

    7.1、DNS查询报文分析

    整体来看,DNS查询报文是基于UDP而不是TCP,目标进程的端口是53。接下来再看DNS查询区域

    Transaction ID:标识字段,对应前面报文格式中的标识符。客户程序通过它来确定响应与查询是否匹配。

    Flags:一共16bit的控制位。

    Questions:表示queries区域的数量。

    Answers RRs:表示回答区域的数量。

    Authority RRs:表示授权区域的数量。

    Additional RRs:表示附加区域的数量。

    Queries:Queries区域的内容。

     

    再看flag区域

    Response:0表示query查询消息,1表示response消息。对应报文结构中的1bit的查询/回答标志位。

    Opcode:通常值为0,表示标准查询。其他值1表示反向查询,2表示服务器状态请求。

    Truncated:表示报文是否被截断。因为UDP数据包有长度限制,当长度过长时会被截断。0表示没截断,1标识DNS报文长度超过512字节,被截断。

    Recursion desired:表示希望的查询方式,0表示迭代查询,1表示递归查询。

    Z:保留位

    Non-authenticated data:未认证数据。

     

    最后看下queries字段

    Type:表示查询类型,为A,所以Name表示的就是需要查询的域名(如果是反向查询,则为IP,反向查询即由IP地址反查域名)。

    Class:通常为1,表示Internet数据,简写为IN。

     

    7.2、DNS响应报文分析

    整体来看,DNS响应报文也是基于UDP,发送进程的端口是53。接下来再看DNS响应区域

    Transaction ID:标识字段,为0xc2f2,与查询报文匹配。

    Answers RRs:表示回答区域的数量,说明响应报文中包含3个回答。

    Flags、Questions、Authority RRs、Additional RRs和Queries都是大同小异

     

    再看flag区域

    响应报文的flag区域比查询报文多了一些东西

    Authoritative:表示应答DNS服务器是否是权威服务器,0表示不是,1表示是

    Recursion available:代表服务器是否可以递归查询。1表示可以,0表示不可以。

    Answer authenticated:应答/权限部分未由服务器进行认证。

    Reply code:状态码。0表示没有差错(No error)。

     

    最后看answer区域

    对应前面的Answer RRs数目,有三条,第一条是百度的别名www.a.shifen.com, TTL是85秒,表示只能缓存85,Data Length表示对应answer的字节数,后两个分别给出了别名的IP地址,输入后IP后,出现了百度的页面

     

    参考

    《计算机网络自顶向下方法》

    https://www.cnblogs.com/liyong-blackStone/p/10330188.html

    https://zhuanlan.zhihu.com/p/65076033

    https://blog.csdn.net/u014029795/article/details/87186859#t14

     

    欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

    展开全文
  • Wireshark抓包及DNS报文分析
  • DNS报文格式解析(非常详细)

    万次阅读 多人点赞 2020-11-20 18:27:04
    其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个字段是DNS报文首部,共 12 个字节。 整个 DNS 格式主要分为 3 部分内容,即基础结构部分、问题部分、资源记录部分。...
  • DNS报文结构实例解析

    2011-02-18 22:30:03
    用实例说明DNS报文结构,比较翔实。是我自己写的,有不对的请指正
  • 教你动手写UDP协议栈系列文章序号内容1《教你动手写UDP协议栈-UDP协议栈格式》2《教你动手写UDP协议栈-DHCP报文解析》3《教你动手写UDP协议栈-OTA上位机》4《教你动手写...
  • DNS报文格式及抓包解析

    千次阅读 2020-07-03 21:03:20
    16bit,DNS报文的标识,请求报文和对应的响应报文的事务ID应该相同。 2. 标志 16bit,分为8个字段: 字段 长度/bit 作用 QR 1 查询报文为0,响应报文为1 Opcode 4 标准查询为0,反向查询为2,请求服务器...
  • DNS报文抓包分析

    千次阅读 2019-07-02 00:54:24
    基础协议头长 + dns报文内容长度 = 54Byte + 20Byte(dns name) + 2Byte(type) + 2Byte(Class) = 78Byte 域名化表示方式: 如图中请求域名为: proxyxa.xxx.com.cn 按照格式修改后为:7proxyxa3xxx3com2cn0,总...
  • DNS报文格式说明及服务器端示例程序 用时请参考rfc1035
  • 如何突破DNS报文的512字节限制

    千次阅读 2018-10-29 08:10:00
    “DNS协议大家都应该很熟悉,最近有同学问到如何获得UDP承载的超过512字节的DNS报文,借此机会,我们一起了解下DNS协议与报文长度有关的一些细节。”本文将讨论的是D...
  • dns报文域名压缩

    2017-07-12 11:02:27
    1. 不压缩的DNS 域名示例  示例一 3 www 6 google 3 com \0    示例二 2 ns 9 xinnetdns 3
  • 深入理解DNS报文格式

    万次阅读 2015-04-24 22:24:06
    (一)DNS报文格式 (1)公共报文头格式其中header报文头是必须有的,其他的有没有在报文头里有定义: 标识ID: 请求客户端设置的16位标示,服务器给出应答的时候会带相同的标示字段回来,这样请求客户端就可以...
  • 可改变过源ip和源端口的DNS请求报文发送和响应报文发送
  • DNS协议报文详解

    千次阅读 2021-05-19 18:18:01
    我们通常使用机器的...一、DNS查询和应答报文详解 DNS是一套分布式的域名服务系统。每个DNS服务器上都存放着大量的机器名和IP地址 的映射,并且是动态更新的。DNS查询和应答报文的格式如下表格所示: 0 15 16 ...
  • DNS请求报文和响应报文解析

    千次阅读 2021-04-09 23:58:16
    DNS 分为查询请求和查询响应,请求和响应的报文结构基本相同。DNS 报文格式如图所示。 上图中显示了 DNS报文格式。其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个...
  • 一、TCP报文头部简介    ●源、目标端口号字段:占16比特。TCP协议通过使用"端口"来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序...
  • DNS报文域名压缩

    千次阅读 2014-11-30 14:14:30
    1. 不压缩的DNS 域名示例  示例一 3 www 6 google 3 com \0    示例二 2 ns 9 xinnetdns 3 ...
  • Internet协议分析-TFTP报文分析-DNS 报文分析 网络环境中抓取报文分析
  • DNS欺骗 dns报文详解 dnspptDNS欺骗 dns报文详解 dnspptDNS欺骗 dns报文详解 dnspptDNS欺骗 dns报文详解 dnsppt
  • DNS报文解析,域名长度解析

    千次阅读 2019-06-12 17:03:32
    最近看了些有关DNS的一点东西,dns结构前面都是固定的,从54位开始是正文的Queries区域,那么我想知道域名的长度,一开始觉得肯定有长度标识的,结果没找到,于是就才用了另一种方式: 整个Queries区域的...
  • DNS 请求报文详解

    千次阅读 2018-03-25 03:46:09
    DNS DNS【域名系统:(英文:Domain Name System,缩写:DNS)】是互联网的一项服务。 它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 DNS使用TCP和UDP端口53。 白话版 就是客户端...
  • 1. 域名系统概述,2. DNS报文格式,3. DNS报文问题部分的格式,4. DNS报文资源记录的格式,5. IPv6下DNS报文格式的扩展,6. BIND简介
  • 大多数本地DNS服务器缓存了顶级域名服务器的Ip地址,使得这些请求通常绕过了DNS根服务器。
  • DNS报文格式分析

    千次阅读 2012-05-27 00:42:47
    资料出处:http://hi.baidu.com/yslgoodboy/blog/item/f5cd47f562a95b7fdcc47401.html DNS请求报文的结构是 0 15 16 31 标识ID 标志 问
  • DNS协议详解及报文格式分析

    千次阅读 2020-02-05 15:10:04
    DNS协议详解及报文格式分析 解BUG的过程中碰到了DNS相关的内容,折腾网站和域名邮箱时也对DNS做了一些配置,发现对一些细节有点记不清晰了,因此很有必要重新温习一下这方面的知识。学过网络的应该记得现代计算机...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,538
精华内容 29,015
关键字:

dns报文

友情链接: wursor.zip