一次http请求之旅系列第3讲---DNS解析

你可能遇到过,或者你身边的朋友曾经遇到过这样诡异的事情,电脑无法上网,但是QQ是可以登录的。这种情况,是由于DNS解析异常导致的。

浏览器在底层本质上是一个socket客户端,当你想要在浏览器里打开百度首页时,你输入网址www.baidu.com并点击回车后,浏览器需要与百度服务器建立TCP连接,这就需要知道百度服务器的IP 和 端口号, 端口号默认是80, 但是IP是多少呢, 所谓DNS解析,就是根据网站域名找到IP。

1. 域名与IP

一个网站,可能会有多个域名,多个IP,在终端里执行下面的命令

ping coolpython.net

在我的电脑里得到下面的结果

PING coolpython.net (101.201.37.248): 56 data bytes
64 bytes from 101.201.37.248: icmp_seq=0 ttl=51 time=11.260 ms
64 bytes from 101.201.37.248: icmp_seq=1 ttl=51 time=11.138 ms
64 bytes from 101.201.37.248: icmp_seq=2 ttl=51 time=11.209 ms

在浏览器里直接输入ip,就打开了我的个人技术博客,我这只是一个小网站,只用一个域名就可以了,不需通过DNS做负载均衡,因此只需要一个ip就可以了。在网站域名coolpython.net 和 服务器IP 101.201.37.248之间存在一个映射关系,这个关系保存在DNS服务器中。我们人类的记忆更适合记录那些看起来有点意义的东西,记录一个域名要要比记录一个IP地址要容易的多。

2. DNS解析过程

当我们在浏览器里输入一个网站域名后,会现在本地查找这个域名所对应的IP,在hosts文件中,如果有这个域名的记录,那么就完成查找,这部分是系统缓存的数据。

如果在hosts文件中找不到,则向本地DNS服务器发起请求,请求解析这个域名的ip,所谓本地DNS服务器是指你的网络服务提供商,联通,电信。如果他们可以找到映射关系就会把对应的IP返回给你。

如果本地DNS服务器找不到,则向根域名服务器继续发请求,根域名服务器还是找不到,就继续向上,向A顶级域名服务器发送请求,直至找到为止。

那么会不会出现最终也找不到的情况呢? 如果找不到,可能是由于这个域名有问题了,服务商已经停止了对它的解析。平时所遇到的无法上网但是可以登录QQ的情况是由于你电脑里DNS服务器所配置的IP出问题了,百度一个可用的DNS服务器IP替换一下就好,QQ走的UDP,不是TCP,因此不受DNS解析的影响。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案