包结构:
目前实验能理解的结构:
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
网友评论