我们在浏览器输入http://www.baidu.com想要进入百度首页,但是这是个域名,没法准确定位到服务器的位置,所以需要通过域名解析,把域名解析成对应的ip地址,然后通过ip地址查找目的主机。整个访问过程可以概括为:
- 域名解析
- 发起TCP三次握手建立连接
- 建立连接后发起http请求
- 服务器响应请求,浏览器获取html源码
- 浏览器解析html代码,并请求相关css,js和图片资源
- 浏览器渲染页面
一、域名解析过程
在浏览器输入一串域名要访问某网站的时候,浏览器帮我们做了如下事情(以Chrome浏览器和windows系统为例):
- Chrome浏览器首先检查自己本地是缓存是否有对应的域名,有则直接使用。【查看Chrome浏览器dns缓存地址:chrome://net-internals/#dns】
- 如果浏览器缓存中没有,则查询系统DNS缓存中的域名表,有则直接使用。【windows查看域名表的命令:ipconfig /displaydns】
- 系统缓存中还是没有,则检查hosts文件中的映射表。【windows中hosts文件路径:C:\Windows\System32\drivers\etc】
- 本地实在找不到,则向DNS域名服务器发起请求查询。【DNS服务器IP是本地配置的首选服务器,一般常用的有114.114.114.114(电信运营商提供)和8.8.8.8(Google提供)】
-
-
- DNS服务器首先查找自身的缓存,有对应的域名ip则返回结果
- 如果缓存中查找不到,DNS服务器则发起迭代DNS请求,首先向根域服务器发起请求查询,假如本次请求的是www.baidu.com,根域服务器发现这是一个com的顶级域名,就把com域的ip地址返回给DNS服务器
- DNS服务器向com域ip地址发起请求,查询该域名的ip,此时该服务器返回了baidu.com的DNS地址。
- 最后DNS服务器又向baidu.com的DNS地址发起查询请求,最后找到了完整的ip路径返回给DNS服务器,DNS再把ip信息返回给windows内核,内核再返回给浏览器,于是浏览器就知道该域名对应的ip地址了,可以开始进一步请求了。
-
--------------------------------------------------------------------------------------------------------------------------
DNS请求原理:
每个域名用小数点分隔开变成多级,从右到左等级逐级递减,所以最右边的等级最高,每个域都有用一个域名服务器,管理则下属域名,分布如下图:
所以DNS发送查询请求的时候,先从根服务器获对应顶级域名的ip,然后再逐级从定义域名ip向下查找各个下属域服务的,找到完整的域名ip。这是一个迭代查询的过程。
--------------------------------------------------------------------------------------------------------------------------
总的来说:域名解析的过程就是一个由近及远的过程,采取就近原则,再自顶向下搜索。
【如果连DNS服务器也没解析成功,那么进行如下步骤:】
⑤ 操作系统就会查找NetBIOS name Cache(NetBIOS名称缓存,就存在客户端电脑中的),那这个缓存有什么东西呢?凡是最近一段时间内和我成功通讯的计算机的计算机名和Ip地址,就都会存在这个缓存里面。什么情况下该步能解析成功呢?就是该名称正好是几分钟前和我成功通信过,那么这一步就可以成功解析。
⑥ 如果第⑤步也没有成功,那会查询WINS 服务器(是NETBIOS名称和IP地址对应的服务器)
⑦ 如果第⑥步也没有查询成功,那么客户端就要进行广播查找
⑧ 如果第⑦步也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下,写法也一样)
如果第八步还没有解析成功,那么就宣告这次解析失败,那就无法跟目标计算机进行通信。只要这八步中有一步可以解析成功,那就可以成功和目标计算机进行通信。
二、建立TCP连接
第一次握手:客户端向服务器发送SYN报文,并发送客户端初始序列号Seq=X;等待服务器确认,
第二次握手:服务器接收客户端的SYN报文,然后向客户端返回一个包SYN+ACK响应报文,并发送初始序列号Seq=Y
第三次握手:客户端接受SYN+ACK报文,并向服务器发送一个ACK确认报文,至此连接建立
【建立连接的最重要目是让连接的双方交换初始序号(ISN, Initial Sequence Number),所以再响应的ACK报文中会包含序列号递增序列】