DNS协议
域名系统(Domain Name System,DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,主要用于将域名转换为IP地址(也可以将IP地址转换为相应的域名地址)。DNS使用TCP和UDP端口53。
DNS通常使用UDP进行通信,但在某些情况下,DNS可以使用TCP进行通信。
- 大型响应: 当DNS响应的大小超过了UDP报文的最大限制时(通常是512字节),DNS服务器可能会选择使用TCP来发送较大的响应。
- 如果在UDP上进行DNS通信时出现丢包或数据损坏,DNS服务器可能会尝试使用TCP来进行可靠的重传。
- 在DNS区域传输中,当一个DNS服务器需要从另一个DNS服务器获取大量的区域记录时,它可能会选择使用TCP来进行传输。
虽然TCP在DNS中的使用相对较少,但它是DNS协议的一部分,用于一些特定情况下的通信。DNS在RFC 1035中定义,该标准允许DNS使用UDP和TCP进行通信。
DNS协议源文档
DNS协议特点
- 分布式数据库系统:DNS是一种层次结构分布的数据库系统,由全球分布的DNS服务器组成,负责将域名和IP地址相互映射。
- 分层架构:DNS采用树形结构的分层架构,从根服务器到顶级域名,再到二级和三级域名,形成清晰的层级结构。
- 递归查询:DNS支持递归查询,允许客户端向DNS服务器发送查询请求,DNS服务器将负责解析域名并返回相应的IP地址。
DNS通信流程
以浏览器访问网页为例。
- 用户从浏览器中访问网页,浏览器将从URL中获取主机域名,比如百度www.baidu.com。首先浏览器会从缓存中检查是否在域名队友的IP,有则直接访问,无则会查询本机hosts文件
- 本机hosts文件有对应的IP则直接访问,无则将域名传给DNS应用的客户端。
- DNS客户端收到后将会向 DNS 服务器发送一个包含主机名的请求,请求 DNS 服务器解析这个主机名的 IP 地址。DNS地址有很多,一般默认使用的地址是8.8.8.8(谷歌全球免费DNS服务器)。
- DNS 服务器会给DNS客户端返回一份包含主机域名对应IP地址的报文。
- 浏览器收到IP地址后,即可与主机建立TCP连接,从而发送HTTP请求。
DNS报文
DNS报文一共分成3部分,分别是DNS首部(12个字节)、DNS问题、DNS资源记录(只包含在应答报文中)
DNS首部
DNS口部分了6部分,每个部分12字节
- ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。
- 标识:DNS 报文中的标志字段。
- QR:查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
- Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
- AA:授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
- TC:表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
- RD:期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
- RA:可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
- Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
- RCODE:返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。
- 问题计数:DNS 查询请求的数目。
- 回答资源记录数:DNS 响应的数目。
- 权威名称服务器计数:权威名称服务器的数目。
- 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。
DNS问题
查询问题
- QNAME:具体域名。
- QTYPE:DNS 查询请求的资源类型,A表示IPv4主机地址,AAAA表示IPv6主机地址。
- QCLASS:地址类型,通常为互联网地址,值为 1。
以下为百度的dns查询报文
回复问题
- NAME:回复域名。
- TYPE:回复资源类型,参考查询问题。
- CLASS:回复地址类型,参考查询问题。
- TTL:生存时间,以秒为单位。
- RDLENGTH:地址长度。
- RDATA:具体IP地址,也有可能是别名域名。
以下为百度的dns回复报文
DNS资源记录
DNS资源记录分为权威服务器区域(Authoritative nameservers)和附加信息区域(Additionnal records),两者的报文格式一致,并与回复报文一致。
- NAME:域名,DNS 请求的域名。
- TYPE:类型,资源记录的类型,与问题部分中的查询类型值是一样的。
- CLASS:类,地址类型,与问题部分中的查询类值是一样的。
- TTL:生存时间,以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
- RDLENGTH:资源数据长度,资源数据的长度。
- RDATA:资源数据,表示按查询段要求返回的相关资源记录的数据。
以下为百度的dns资源记录报文
mDNS
多播DNS(Multicast DNS,mDNS),主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,使用现有的DNS信息结构、语法和资源记录类型,并且没有指定新的操作代码或响应代码。
mDNS协议特点
- 局域网内通讯:与单播的dns不同,mdns只在局域网内通讯,UDP端口为5353,目的是为了提供服务以及主机IP地址 。
- 组播发送报文:使用地址
224.0.0.251(ipv6:FF02::FB)
,并且主机域名以.local
结尾。
mDNS通信流程
- 局域网内主机A开启了mDNS服务,并注册信息如:IP地址、提供的服务(TCP、FTP等)、端口号。
- 主机B加入局域网,并使用mDNS在局域网内发送查询TCP服务器的请求。
- 主机A收到请求后将会回复所注册的信息,主机B收到回复后即可与主机A建立TCP连接。
学习笔记,有问题欢迎指出
参考链接
https://c.biancheng.net/view/6457.html