背景
我们都知道应用程序向最近的DNS服务器根据域名查询IP地址,DNS服务器就会返回该域名的IP地址;
但是他的一个实现流程是怎样的呢?
而机器又是怎么知道DNS服务器的ip地址的呢?
服务器如何请求DNS服务器解析域名
其实每台电脑可以自己手动设置一个DNS服务器的地址,当然也可以让电脑自动获取,比如电脑自己预先设置好的DNS服务器ip地址,知道了ip地址就可以根据之前讲的访问百度服务器的方式访问DNS服务器;
而服务器是如何发送请求给DNS服务器的?我们的计算机上有相应的DNS客户端,相当于DNS客户端的部分,我们称之为DNS解析器。
DNS解析器其实是利用操作系统的层面提供的Socket库,来进行网络相关的一些常见的操作,比如说发送请求到DNS服务器去查询ip地址;
Socket库是在加州大学伯克利分校开发的 UNIX 系操作系统 BSD 中开发的 C 语言库,互联网中所使用的大多数功能都是基于 Socket 库来开发的。因此,BSD 之外的其他操作系统以及 C 语言之外的其他编程语言也参照 Socket库开发了相应的网络库。可以说,Socket 库是网络开发中的一种标准库。
当解析器被调用时,程序的控制流程会转移到解析器内部。如下图:
当控制流程转入解析器,解析器生成需要发送给DNS服务器的查询消息,然后委托给操作系统内部的协议栈来执行,(解析器本身不具备网络收发数据的功能)。协议栈执行发送消息的操作,通过网卡将消息发送给DNS服务器。如果DNS服务器找到该服务器,则会将IP地址写入响应消息返回给客户端,然后再经过协议栈传递给解析器,最后经解析器取出消息取出IP地址,传给应用程序。至此,完成了向DNS服务器查询IP地址的任务。
协议栈
操作系统内部的网络控制软件,也叫“协议驱动”“TCP/IP驱动”等。
域名服务器
世界上有这么多机器,所以怎么可能都在一台DNS服务器上呢?所以世界上有数万台DNS服务器,很多很多,提供DNS的查询服务,在查找ip地址的时候,几万台DNS服务器如何大接力呢?
首先需要对域名服务器划分层级,每级存储的信息和职责都不一样;
根域名服务器:根域名服务器是最高层的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。一般情况下,根域名服务器不直接把待查询的域名直接转换成IP地址(根域名服务器也没有存放这种信息),而是告诉本地域名服务器下一步应该找哪一个顶级域名服务器进行查找,全世界有13台根域DNS服务器;
顶级域名服务器:管理在该顶级域名服务器注册的所有的二级域名。当收到DNS查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应该找的域名服务器的IP地址)。
权限域名服务器:负责一个区中的域名服务器,保存该区中所有主机的域名到IP地址的映射。当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的DNS客户,下一步应该找哪一个权限域名服务器。
域名解析步骤
1、每台DNS服务器都有缓存的功能,先去缓存中查询是否可以根据域名解析出来ip;
2、任何一台DNS服务器上都有根域DNS服务器的地址,访问根域DNS服务器开始一层一层去找,如:百度域名(www.baidu.com);
3、先访问根域DNS服务器查询管理“.com”的顶级域名服务器域名地址;
4、在访问顶级域名服务器查询管理“baidu.com”的权限域名服务器地址解析ip;
5、获取域名对应的ip之后缓存并返回应用程序;
域名结构
通常 Internet 主机域名的一般结构为:主机名.三级域名.二级域名.顶级域名
根域
“.“,其实网址www.baidu.com在配置中应该是www.baidu.com.,在我们输入网址时会省略根域
常见顶级域名
.com:表示商业机构
.cn:表示中国国家域名
.top:表示高端,顶级,事业突破,国际通用域名
.net:表示网络服务机构
.org:表示非营利性组织
.gov:表示政府机构
.edu:表示教育机构
13台根域名服务器部署地址
全球共有13台根域名服务器。这13台根域名服务器中名字分别为“A”至“M”,其中10台设置在美国,另外各有一台设置于英国、瑞典和日本。
根服务器主要用来管理互联网的主目录,全世界只有13台。
1个为主根服务器,放置在美国。其余12个均为辅根服务器,其中9个放置在美国,欧洲2个,位于英国和瑞典,亚洲1个,位于日本。
所有根服务器均由美国政府授权的互联网域名与号码分配机构ICANN统一管理,负责全球互联网域名根服务器、域名体系和IP地址等的管理。
分布地点
下表是这些机器的管理单位、设置地点及最新的IP地址:
名称 |
管理单位及设置地点 |
IP地址 |
A |
INTERNIC.NET(美国,弗吉尼亚州) |
198.41.0.4 |
B |
美国信息科学研究所(美国,加利弗尼亚州) |
128.9.0.107 |
C |
PSINet公司(美国,弗吉尼亚州) |
192.33.4.12 |
D |
马里兰大学(美国马里兰州) |
128.8.10.90 |
E |
美国航空航天管理局(美国加利弗尼亚州) |
192.203.230.10 |
F |
因特网软件联盟(美国加利弗尼亚州) |
192.5.5.241 |
G |
美国国防部网络信息中心(美国弗吉尼亚州) |
192.112.36.4 |
H |
美国陆军研究所(美国马里兰州) |
128.63.2.53 |
I |
Autonomica公司(瑞典,斯德哥尔摩) |
192.36.148.17 |
J |
VeriSign公司(美国,弗吉尼亚州) |
192.58.128.30 |
K |
RIPE NCC(英国,伦敦) |
193.0.14.129 |
L |
IANA(美国,弗吉尼亚州) |
198.32.64.12 |
M |
WIDE Project(日本,东京) |
202.12.27.33 |
全球DNS根服务器为什么只有13台
DNS协议的最初定义要从20世纪80年代未期开始算起,它使用了端口上的UDP和TCP协议。
UDP通常用于查询和响应,TCP用于主服务器和从服务器之间的区传送。遗憾的是,在所有UDP实现中能保证正常工作的最大包长是512字节,对于在每个包中必须含有数字签名的一些DNS新特性(例如,DNSSEC)来说实在是太小了。
512字节的限制还影响了根服务器的数量和名字。
要让所有的根服务器数据能包含在一个512字节的UDP包中,根服务器只能限制在13个,而每个服务器要使用字母表中的单个字母命名。
以太网数据的长度必须在46-1500字节之间,这是由以太网的物理特性决定的。
事实上,这个1500字节就是网络层IP数据包的长度限制,理论上,IP数据包最大长度是65535字节。
这是由IP首部16比特总长度所限制的,去除20字节IP首部和8个字节UDP首部,UDP数据包中数据最大长度为65507字节。
在Internet数据传输中,UDP数据长度控制在576字节(Internet标准MTU值),而在许多UDP应用程序设计中数据包被限制成512字节或更小。这样可以防止数据包的丢失。
许多解析器首先发送一条UDP查询,如果它们接收到一条被截断的响应,则会用TCP重新发送该查询。
这个过程绕过了512字节的限制,但是效率不高。您或许认为DNS应该避开UDP,总是使用TCP,但是TCP连接的开销大得多。
一次UDP名字服务器交换可以短到两个包:一个查询包、一个响应包。一次TCP交换则至少包含7个包:三次握手初始化TCP会话、一个查询包、一个响应包以及最后一次握手来关闭连接。