美文网首页
解析一个DNS请求包(内涵C++和nodejs演示)

解析一个DNS请求包(内涵C++和nodejs演示)

作者: 死鱼 | 来源:发表于2019-05-28 18:12 被阅读0次

    包结构:

    目前实验能理解的结构:

    1、头部
    2、问题部分(放域名)
    3、类型部分(type class等)

    头部(16 x 6 bit):
    名称 占位大小 说明 备注
    会话标识 2位(16bit) 一个queryid用来一一对应请求包和应答包
    会话标志们👇 共2位(16bit)
    QR 1bit 查询/响应标志,0为查询,1为响应
    opcode 4bit 0表示标准查询,1表示反向查询,2表示服务器状态请求 有4个二进制位可以用,正常查询直接设0
    AA 1bit 表示授权回答 响应包用的,判断服务器是否一个认证的域服务器
    TC 1bit 表示可截断的 表示报文是否被截断了
    RD 1bit 表示期望服务端帮忙做递归,或响应包告诉你这个包是否递归过 如果希望DNS服务器返回递归后的结果,就设置1;希望自己回来递归迭代就设0
    RA 1bit 表示是否有能力递归 响应包用(Recursion available)
    question_count 2位(16bit) 询问域名数目
    answer_count 2位(16bit) 应答的结果数目 解析结果数目
    ns_count 2位(16bit) 认证机构服务器数目 在响应包里面才有,就是NS
    addition_count 2位(16bit) 应答的附加内容数目 实验发现是在zone里面,额外添加的解析就会在addition里面。
    问题部分(大小不定):

    www.baidu.com
    

    要把这里转变成这样子,然后紧紧拼接到头部后面。数字表示后面一个级别的域名字符串多长。最后要接一个0,表示结束

    3www5baidu3com0
    
    类型部分
    名称 占位大小 说明 备注
    type 2位(16bit) 请求类型,1:A ipv4解析,2:NS服务器,28:AAAA ipv6解析,5:CNAME 转给其他域名,cdn用到
    classes 2位(16bit) 1代表Inter协议,一般填1就行了
    应答部分中的 offset

    例如C112,表示拿12位置开始的域名,直到/0为止

    详细代码

    进去找"send_dns_package.*",想办法运行它吧

    //nodejs : 
    node send_dns_package.js
    
    //c,在mac上
    g++ send_dns_package.cpp -o bin
    sudo ./bin
    

    github

    运行

    c代码运行截图 node运行截图

    相关文章

      网友评论

          本文标题:解析一个DNS请求包(内涵C++和nodejs演示)

          本文链接:https://www.haomeiwen.com/subject/racjtctx.html