论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
程序人生
›
DNS
DNS
万万哇
金牌会员
|
2022-9-16 17:12:48
|
显示全部楼层
|
阅读模式
楼主
主题
623
|
帖子
623
|
积分
1869
DNS
什么是DNS
DNS是域名系统(Domain Name System),简单来说就是平时上网输入的URL,如 www.baidu.com 就是域名,而DNS就是将这个域名解析成IP地址,如 www.baidu.com 的一个IP地址为 14.215.177.38,DNS使用的端口号为53,使用UDP协议
为什么需要DNS
因为在我们上网的过程中,IP地址很难记住,而域名相对说就简单很多,所以需要把我们的域名转换成IP地址
计算机为什么不使用域名和使用IP地址?
因为域名长度可变,计算机处理起来困难,而IP地址是定长的,处理起来简单很多
为什么需要分不同的域名服务器(如根域名...)
从理论上来讲,可以只需要一台服务器把所有的域名都装入这台服务器就可以,大家查询DNS的时候访问这个DNS服务器即可,为了安全也可以设置多个服务器,每台服务器都装入所有的IP地址,个人认为这样显然是可以的(如果担心访问量太大导致网络瘫痪就设置多个这样的服务器,而且同一个IP可以用多台主机来进行处理),书上的解释就是所有的主机都访问这一台DNS服务器导致瘫痪,期待更合理的解释
DNS解析过程
首先看浏览器DNS的缓存,如果浏览器DNS缓存有,那么就直接访问;
如果浏览器DNS没有相应的缓存,则看HOST文件,如果HOST有文件,则直接访问即可;
如果发现还没有对应的IP地址,则主机需要向本地DNS服务器(ISP服务器或者自己手动设置的DNS服务器)发起查询,但是这里有一个问题,本地DNS服务器地址哪里来的?(如果是通过运营商上网的,会自动分配IP与设置DNS,如果是通过路由器上网的,那么就会通过DHCP的方式配置IP与DNS地址,具体可以百度DHCP客户端请求IP地址的过程,这里暂时还不太清楚,留下这个坑)
本地DNS服务器收到请求后,会查看本机的DNS缓存,
值得注意的是,本地DNS缓存需要安装诸如systemd-resolved,dnsmasq或nscd之类的缓存服务
,如果没有安装,则没有操作系统级别的DNS缓存;
本地DNS服务器发起请求(Ubuntu可以通过cat /etc/resolv.conf和nslookup [host]查看)
,在Ubuntu下,查看本地DNS的服务器的地址为127.0.0.53,显然这个是一个环回地址(环回地址的意思就是主机向自身发送消息,环回地址的IP为127.0.0.1 - 127.255.255.254),那么显然这个数据发送给本机的,本机肯定不能解析这个IP地址,实际上127.0.0.53相当于本地DNS服务器,127.0.0.53还有一个上游DNS服务器的地址(可以通过resolvectl查看)
,如果是通过路由器连接网络的,通常上游DNS的地址为路由器本身的地址,如192.168.1.1,那么这个上游DNS服务器怎么来的?本地主机连接路由器的时候,通过DHCP分配本机的IP地址,同时也会告诉主机DNS服务器地址,具体看DHCP篇,梳理一下这个过程就很好理解了,
DNS请求首先发给本地DNS服务器127.0.0.53,本地DNS服务器把DNS请求发给路由器,之后路由器再根据上网方式的不同,比如路由器也可以通过DHCP上网,那么路由器也会获得DNS服务器的地址,比如进入路由器后台,查看得到路由器得到的两个DNS服务器地址,那么就是路由器收到DNS请求就把该请求转发路由器得到的这两个DNS服务器地址,之后就是DNS正常解析的流程
需要补充的是,主机到本地DNS服务器(127.0.0.53)通常都是递归的方式进行查询,而本地DNS服务器与顶级域名服务器···(一级,二级,三级)通常都是迭代,如何从顶级域名到各级域名服务器可以百度,比较简单;
wireshark抓包分析
DNS数据报格式
事务 ID(2字节):DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的;
标志(2字节):DNS 报文中的标志字段;
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),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。
问题计数(2字节):DNS 查询请求的数目;
回答资源记录数(2字节):DNS 响应的数目;
权威名称服务器计数(2字节):权威名称服务器的数目;
附加资源记录数(2字节):额外的记录数目(权威名称服务器对应 IP 地址的数目)。
以上,为DNS的头部,长度固定,为12字节
问题部分
其中,查询名长度不固定,查询类型2字节,查询类长度2字节,在DNS请求报文中,只有以上部分,而查询名长度不固定,所以查询类型和查询类是通过DNS报文最后4个字节来确定的;
以上,就是DNS请求的所有部分
在回复报文中,除了以上部分,还有如下三个:
域名:DNS 请求的域名。
类型:资源记录的类型,与问题部分中的查询类型值是一样的。
类:地址类型,与问题部分中的查询类值是一样的。
生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
资源数据长度:资源数据的长度。
资源数据:表示按查询段要求返回的相关资源记录的数据。
发送的DNS请求包,如图
分别有以太网首部(14字节),IP数据报首部(固定部分20字节),之后是DNS数据报格式
接收的DNS数据包
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
万万哇
金牌会员
这个人很懒什么都没写!
楼主热帖
markdown day 01
谈谈技术能力
读Java性能权威指南(第2版)笔记02_ J ...
redis for windows 7.0.2安装包全网首 ...
WPF dotnet 6 开启 PM v2 的 DPI 感知 ...
基于CSDN云和docker全家桶的微服务项目 ...
ClickHouse(05)ClickHouse数据类型详解 ...
Nacos注册中心-----从0开始搭建和使用 ...
9个GaussDB常用的对象语句
阿里云域名购买流程以及免费证书的申请 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表