当我们访问www.baidu.com的时候,会发生什么?

答:“如果打开了,就说明网好着呢”

以谷歌浏览器为例,在浏览器中输入“www.baidu.com”,按下回车。而“www.baidu.com”只是一个域名,我们得知道域名对应的地址才行。就像要去小明家,必须先知道小明家的地址才可以,所以就要进行第一个步骤:DNS lookup(DNS:Domain Name System)。

DNS lookup

浏览器收到打开页面的命令,于是向网络中的DNS服务器问,www.baidu.com 的地址在哪里呀?

浏览器跟谁提问的?换句话说,DNS是怎样查找的?

DNS查找顺序为:浏览器缓存→系统缓存→路由器缓存→ISP DNS缓存→递归搜索

  • 浏览器DNS缓存:每次问别人多累啊,天天去小明家还能天天问别人不成,自己记住不就完了嘛。浏览器很聪明的,他会把DNS记录一段时间,自己记住的地址再次访问时候,就不用问别人了,快捷方便。浏览器会记住多长时间呢?不同的浏览器的设定是不同的,网上查到Chrome和Firefox的默认DNS缓存时间是一分钟,IE为30分钟,Safari为30秒。

    以Chrome为例查看DNS缓存,地址栏输入以下命令:

    chrome://net-internals/#dns

  • 系统DNS缓存:系统以及可能也会做一个DNS缓存,Windows中CMD下查看系统DNS缓存命令为

    ipconfig /displaydns

    在这不得不提到hosts这个东西,在互联网的早期,网络上的电脑数量特别少。于是只需要在每台电脑上记录域名到IP地址的映射,如:

    127.0.0.1 localhost
    255.255.255.255 broadcasthost
    220.255.2.153 www.google.com

    上面的hosts片段文件将IP和域名对应起来,只需要查找hosts就可以知道地址。我们的电脑中都有hosts文件,早期的视频网站去广告就可以通过修改hosts文件屏蔽广告视频服务器提供的广告。你也可以自己去试一下,不同系统的hosts文件路径为:

    Windows : C:\Windows\System32\drivers\etc\hosts
    Android : /system/etc/hosts
    Mac : /etc/hosts
    Linux : /etc/hosts

  • 路由器DNS缓存:如果你的电脑是通过路由器连接互联网的,那么路由器中也可能会有一部分域名的DNS缓存。

  • ISP DNS缓存(ISP:Internet Service Provider):一般情况下,在ISP的缓存中都能找到相应的缓存记录。

  • 各个DNS服务器递归查找:虽然一般都找不到这里,但是我们也需要明白递归和迭代查找的过程。

DNS是应用层协议,主要基于UDP运输层协议,为什么不基于于TCP呢? 因为TCP开销大啊。为什么只有十三个DNS根域名服务器? 对于目前使用的IPv4来说,因为十三个DNS根域名服务器的IP得保存在一个UDP数据报中,而单个UDP数据报只有512字节,再存不下多的啦。。对于IPv6来说,就没那么多限制了。

详细的可以看这篇文章中的介:

Why There Are Only 13 DNS Root Name Servers

关于DNS的了解,可以看这个文档,介绍的很不错:

DNS介绍

找到了IP地址后,接下来改做什么呢?

Socket Connect

浏览器向找到的地址发出请求,要求建立TCP连接。

关于TCP连接的建立,也就是大吉都熟悉的”三次握手“。其实就是这么回事:

”你瞅啥?“ ”瞅你咋地?“ ”来咱俩唠唠。“

TCP建立连接为什么要三次,两次不行?答案是不行的,谢老师版的《计算机网络》给出了解释:

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

也就是通过浏览器和服务器之间建立socket连接,连接建立后,就可以发送HTTP数据报了。

HTTP Request && HTTP Response

发送http请求,我们使用Chrome开发者工具捕捉请求过程,可以看到,对http://www.baidu.com/ 的请求返回了302重定向的状态(Status Code),重定向的地址为:https://www.baidu.com/ 。意味着浏览器需要继续使用HTTPS协议对主机进行一次请求。

第二次HTTPS请求,返回200 OK:

HTML文档浏览器解析

浏览器对于html的解析又是一个复杂的话题,我了解的少,不过可以学习winter大神的介绍。

渲染

浏览器首先创建DOM树,下载CSS文件,并对DOM数进行渲染,同时下载js文件,解析并执行JS。

底层

至于浏览器如何跟系统打交道,还有网络传输中数据链路层和物理层默默无闻的工作,支撑了整个过程顺利的进行,也要给它们点一个大大的赞。同时也正是这背后无数工程师多年的付出,换来了我们每一次简单访问的顺利运行。

思考:当我们访问www.google.com的时候,会发生什么?

0%