文章目录
在浏览器中输入URL后,到浏览器呈现给用户的全过程分析:
1)域名解析
比如用户在浏览器输入www.xxx.com后:
通常我们输入一个网址,它包含了域名和端口,可以指定唯一的IP地址,而域名查找IP地址的过程就是dns解析。
比如:www.dnscache.com (域名) - DNS解析 -> 11.222.33.444 (IP地址)
1.1 浏览器检查本地的DNS缓存
浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个域名解析过程就将结束。
*浏览器自身的DNS缓存
DNS解析过程会对网络请求带来一定的损耗,所以浏览器在第一次获取到IP地址后,会将其缓存起来。下次相同域名再次发起请求时,浏览器会先查找本地缓存,如果缓存有效,则会直接返回该IP地址,否则会继续开始寻址之旅。
- 浏览器缓存域名也是有限制的:不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几小时不等,域名被缓存的时间限制可以通过TTL属性来设置。
- 如果缓存时间太长,一旦域名被解析到的IP有变化,会导致被客户端缓存的域名无法解析到变化后的IP地址,以致该域名不能正常解析,这段时间内有可能会有一部分用户无法访问网站。
- 如果时间设置太短,会导致用户每次访问网站都要重新解析一次域名。
1.1.1 Chrome浏览器DNS缓存
为了加快访问速度,Google Chrome浏览器采用了预提DNS记录,在本地建立DNS缓存的方法,加快网站的连接速度。
- chrome://net-internals/#dns 这里可以看各域名的DNS 缓存时间。
- chrome对每个域名会默认缓存60s。
- 在url地址栏输入chrome://chrome-urls/可以看到chrome所有的配置界面,选择chrome://dns或者chrome://net-internals/#dns可以查看chrome浏览器的dns缓存信息。
- 点击“Clear host cache”+然后选择"clear cache"和 " flush socket",可以清空chrome的dns缓存。
1.1.2 Firefox浏览器DNS缓存
相关的配置可在about:config中找到:
- network.dnsCacheEntries:缓存的数量
- network.dnsCacheExpiration:dns缓存的时间
- network.dnsCacheExpirationGracePeriod:dns缓存的时间,设置为0表示不缓存
*如果一个域名的DNS解析结果会有多个的话,浏览器如何处理?
Chrome浏览器会优先向第一个IP发起HTTP请求,如果不通,再向后面的IP发起HTTP请求。
1.2 浏览器查找操作系统中的DNS缓存
如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。
1.2.1 在Windows中:
可以通过C:\Windows\System32\drivers\etc\hosts文件来设置,可以将任何域名解析到任何能够访问的IP地址。如果在这里指定了一个域名对应的IP地址,那么浏览器会第二优先使用这个IP地址。
- 例如,我们在测试时可以将一个域名解析到一台测试服务器上,这样不用修改任何代码就能测试到单独服务器上的代码的业务逻辑是否正确。
- 正是因为有这种本地DNS解析的规程,所以黑客就有可能通过修改你的域名解析来把特定的域名解析到它指定的IP地址上,导致这些域名被劫持。这导致早期的Windows版本中出现过很严重的问题,而且对于一般没有太多电脑知识的用户来说,出现问题后很难发现,即使发现也很难自己解决,所以Windows
7中将hosts文件设置成了只读的,防止这个文件被轻易修改。
1.2.2 在Linux中:
在Linux中这个配置文件是etc/hosts文件,修改这个文件可以达到同样的目的,当解析到这个配置文件中的某个域名时,操作系统会在缓存中缓存这个解析结果,缓存的时间同样是受这个域名的失效时间和缓存的空间大小控制的。
- 注意:/etc/hosts文件中有多个重复的时候,前面的优先级高,后面添加了也是白加,要删除前面的或者添加到/etc/hosts的第一行。
- 要清除浏览器的dns缓存:ubuntu linux上直接重启网络即可sudo service network-manager restart
1.3 请求域名服务器来解析域名
前面这两个步骤都是在本机完成的,如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。
1.3.1 操作系统将域名发送至本地域名服务器(递归查询方式)
在我们的网络配置中都会有"DNS服务器地址"这一项,操作系统会把这个域名发送给这里设置的LDNS(Local DNS Server),即本地区的域名服务器。这个DNS通常都提供给你本地互联网接入的一个DNS解析服务。
例如你是在学校接入互联网,那么你的DNS服务器肯定在你的学校,如果你是在一个小区接入互联网的,那这个DNS就是提供给你接入互联网的应用提供商,即电信或者联通,也就是通常所说的SPA,那么这个DNS通常也会在你所在城市的某个角落,通常不会很远。
-
在Windows下:
在Windows下可以通过ipconfig查询这个地址。
-
在Linux下:
- 查看配置文件,输入命令cat /etc/resolv.conf。
- 修改DNS服务器配置,vim编辑配置文件/etc/solve.conf。
- 跟Windows系统一样,Linux系统也有主机表文件,同样可以通过设置主机表地址进行特定主机的解析,优先DNS服务器地址。配置文件在/etc/hosts。
这个专门的域名解析服务器性能都会很好,大约80%的域名解析都到这里就已经完成了,所以LDNS主要承担了域名的解析工作。
1.3.2 迭代查询方式
1、本地域名服务器向根域名服务器(Root Server)发起请求 。
如果本地域名服务器没有,则向根域名服务器(其虽然没有每个域名的具体信息,但存储了负责每个域,如com、net、org等的顶级域名服务器的地址)发起请求。此例中,根域名服务器返回com域的顶级域名服务器的地址。
2、本地域名服务器向顶级域名服务器(gTLD Server)发起请求
本地域名服务器 向com域的顶级域名服务器发起请求,返回xxx.com权限域名服务器(权限域名服务器,用来保存该区中的所有主机域名到IP地址的映射)地址。
- gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。
3、本地域名服务器向权限域名服务器(Name Server)发起请求
本地域名服务器 向xxx.com权限域名服务器发起请求,得到www.xxx.com的IP地址。
- Name Server域名服务器会查询存储的域名和IP的映射关系表,正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server域名服务器。
4、本地域名服务器将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来。
5、操作系统将 IP 地址返回给浏览器,同时自己也将IP地址缓存起来。
2)建立TCP连接
TCP 用于应用程序之间的通信。当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求,这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。
- HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
- 由于HTTP是基于TCP/IP通信协议来传递数据(HTML
文件、图片文件、查询结果等),因此在发送HTTP请求前,需要先建立TCP连接。- TCP协议对应于传输层,而HTTP协议对应于应用层
- TCP/IP 意味着 TCP 和 IP 在一起协同工作。
- TCP 负责应用软件(比如浏览器)和网络软件之间的通信。IP 负责计算机之间的通信。
- TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。IP 负