域名解析:将域名映射为IP地址的方法和过程
DNS的使用方法:
- 应用程序调用一个叫解析器(resolver)的库过程,把名字作为参数传递给这个过程(例如:gethostbyname()就是一个解析器)
- 解析器发送一个UDP分组给本地DNS服务器,它会负责查找该名字,然后将对应的IP地址返回给解析器
- 解析器返回结果给应用程序,然后应用程序即可开始工作了(封装,发送……)
域名解析:
- 当一个解析器收到一个域名查询时,它将该查询传递给本地的一个域名服务器
- 如果待查询的域名落在该名字服务器的管辖范围内,它将返回权威资源记录(一个权威资源记录(authoritative record)是指来自于管理该记录的权威机构,因此总是正确的,它和缓存的记录不同,后者可能是过期的)
- 如果被请求的域名是远程的,且本地没有关于它的信息,那么本地名字服务器向根域服务器发送一条查询此域的消息
域名解析的种类1:递归查询
主机向本地域名服务器查询一般都是采用递归查询
域名解析的种类1:迭代查询
本地域名服务器向根域名服务器查询通常是采用迭代查询
一次完整的解析例子
- 有一台主机想要访问域名y.abc.com,但是它不知道它的IP地址无法完成封装,所以它首先要查询这个域名对应的IP地址
- 假如所有的服务器都没有缓存,它向本地域名服务器去发出查询的请求
- 本地域名服务器发现y.abc.com不是自己管辖的域名,无法直接给出答案,所以它向根域服务器去求救
- 根域服务器也没有y.abc.com的记录,但是它知道.com顶级域名服务器可能会知道,并且它自己有所有顶级域名的资源记录,于是它告诉本地域名服务器DNS.com的IP地址
- .com域名服务器也没有答案,但是它知道abc.com域名服务器可能知道且它有dns.abc.com的IP地址,于是它告诉本地域名服务器转向dns.abc.com进行查询
- y.abc.com如果是个合法的域名,它的信息一定存储在abc.com域名服务的数据库中
DNS消息传递
DNS消息采用UDP数据段来承载
有两种情况例外:
- UDP的报文超过了512个字节的时候,那么首次请求响应返回参数TC置位,当它再次地请求就需要建立TCP的连接,将数据应答分段来发送
- 主从域名服务器之间的数据更新同步