先从最熟悉,也是最表层的域名和ip说起:
比如你和我,你叫张三,我叫李四,名字类似于域名。你在网吧玩,很多太多台电脑各自都有个座位号,座位号就类似于ip,我想去网吧找你去玩电脑,光知道名字,但不知道你位置,所以,就需要DNS。
DNS
DNS就是说ip一长串,不好记啊,想个办法弄个简单名字,所以他的主要功能就是把域名转换成具体的ip地址,就是说找你位置,我光知道名字不行,我还得找到具体的座位ip才行。
域名系统作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网
注意:这域名可以和ip地址绑定,一个ip地址可以被多个域名绑定
HOSTS
再说hosts,这个是个本地域名解析文件,不管你是windwos还是linux,那都是有的,没有就自己建一个。
windows一般在:C:/Windows/System32/drivers/etc/hosts
Linux的hosts文件路径一般:/etc/hosts
范例:
127.0.0.1 localhost
127.0.0.1 www.test.com
这个文件其实也是配置了ip和域名之间的映射关系的数据库,有啥作用呢,就是说,本地要是有这个文件,就优先用这个文件中的配置去解析,如果没有,那就通过nds解析。
注意:hosts文件只能配置ip和域名的映射关系,但是不能配置端口号,默认访问80端口
Nginx
因为要解决端口问题,这里就得使用大名鼎鼎的反向代理软件:Ngin,至于Nginx是什么,怎么安装配置,可以在我以前的文章查看或者度娘搜索。
简单的范例:
//nginx.conf
server {
listen 80; //监听的端口
server_name test.com; //监听的域名
proxy_set_header Cookie $http_cookie; //头信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://localhost:8080; //代理转发,所有到test.com 80端口访问的请求,都会转发到本地8080端口处理
}
}
------------------------------------------------------------- 重点 -------------------------------------------------------
域名结构:
http://www.sina.com.cn./
http://主机名.二级域. 顶级域。根域/
树状结构最顶层称为根域,用“."表示,相应服务器称为根服务器,整个域名空间解析权都归根服务器所有,但根服务器,无法承担庞大的负载,采用“委派"机制,在根域下设置了一些顶级域,然后将不同顶级域解析权分别委派给相应的顶级域服务器,如将com域的解析权委派给com域服务器,以后但凡根服务器收到以com结尾的域名解析请求,都会转发给com域服务器,同样道理,为了减轻顶级域的压力,又下设了若干二级域,二级域又下设三级域或主机。
问题:
当我们在浏览器输入一个 URL 地址时,浏览器要向这个 URL 的主机名对应的服务器发送请求,就得知道服务器的 IP,对于浏览器来说,DNS 的作用就是将主机名转换成 IP 地址。
DNS域名解析流程
DNS 域名解析,简单地说就是把域名翻译成 IP 地址。例如:把 www.baidu.com 这个域名翻译成对应 IP 220.181.38.251,这里只是举个例子
域名解析流程:(以Chrome浏览器为例)
① Chrome浏览器 会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否有https://www.xxx.com 对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
注:我们怎么查看Chrome自身的缓存?可以使用 chrome://net-internals/#dns 来进行查看
② 如果浏览器自身的缓存里面没有找到对应的条目,那么Chrome会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束.
注:怎么查看操作系统自身的DNS缓存,以Windows系统为例,可以在命令行下使用 ipconfig /displaydns 来进行查看
③ 如果在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,如果有则解析成功。
④ 如果在hosts文件中也没有找到对应的条目。浏览器就会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器(一般是电信运营商提供的,也可以使用像Google提供的DNS服务器)发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址),运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。
如果没有找到对应的条目,则运营商的DNS代我们的浏览器发起迭代DNS解析请求,它首先是会找根域的DNS的IP地址(这个DNS服务器都内置13台根域的DNS的IP地址),找到根域的DNS地址,就会向其发起请求(请问www.xxx.com这个域名的IP地址是多少啊?),根域发现这是一个顶级域com域的一个域名,于是就告诉运营商的DNS我不知道这个域名的IP地址,但是我知道com域的IP地址,你去找它去,于是运营商的DNS就得到了com域的IP地址,又向com域的IP地址发起了请求(请问www.xxx.com这个域名的IP地址是多少?),com域这台服务器告诉运营商的DNS我不知道www.xxx.com这个域名的IP地址,但是我知道xxx.com这个域的DNS地址,你去找它去,于是运营商的DNS又向xxx.com这个域名的DNS地址(这个一般就是由域名注册商提供的,像万网,新网等)发起请求(请问www.xxx.com这个域名的IP地址是多少?),这个时候xxx.com域的DNS服务器一查,诶,果真在我这里,于是就把找到的结果发送给运营商的DNS服务器,这个时候运营商的DNS服务器就拿到了www.xxx.com这个域名对应的IP地址,并返回给Windows系统内核,内核又把结果返回给浏览器,终于浏览器拿到了www.xxx.com 对应的IP地址,该进行一步的动作了。
注:一般情况下是不会进行以下步骤的
如果经过以上的4个步骤,还没有解析成功,那么会进行如下步骤(以下是针对Windows操作系统):
⑤ 操作系统就会查找NetBIOS name Cache(NetBIOS名称缓存,就存在客户端电脑中的),那这个缓存有什么东西呢?凡是最近一段时间内和我成功通讯的计算机的计算机名和Ip地址,就都会存在这个缓存里面。什么情况下该步能解析成功呢?就是该名称正好是几分钟前和我成功通信过,那么这一步就可以成功解析。
⑥ 如果第⑤步也没有成功,那会查询WINS 服务器(是NETBIOS名称和IP地址对应的服务器)
⑦ 如果第⑥步也没有查询成功,那么客户端就要进行广播查找
⑧ 如果第⑦步也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下,写法也一样)
如果第八步还没有解析成功,那么就宣告这次解析失败,那就无法跟目标计算机进行通信。只要这八步中有一步可以解析成功,那就可以成功和目标计算机进行通信。
另外注意:
从代码层面,实现域名到ip解析的环节如下图: