美文网首页饥人谷技术博客
从浏览器输入baidu.com到页面展示发生了什么?

从浏览器输入baidu.com到页面展示发生了什么?

作者: badf6fb32367 | 来源:发表于2018-08-24 02:27 被阅读0次

    1. 浏览器

    从输入baidu.com按下回车开始,浏览器会为你发起一个HTTP GET 请求(在浏览器地址栏输入的都是GET请求),这个请求的地址URL长这个样子

    https://www.baidu.com:443/

    来认识一下这个URL,首先它有一个正式的名字,叫做统一资源定位符,用来确定互联网上的资源。什么是资源?资源就是互联网上众多服务器的可访问的文件或者数据,它可以是一个html网页,也可以是一个图片、视频、音频或者其他格式的文件,还可以是一些二进制的数据,你用一个唯一的URL来标识它(严谨地说还要加上HTTP的请求方式),访问这个URL,你就能得到对应的资源。

    上面的URL有三个部分组成分别是 https://www.baidu.com:443,实际上你看不到这个 :443,但是它是默认存在的,表示HTTPS请求的默认端口。你也并没有输入 httpswww,但是浏览器都默认给你加上了。其中 https 是一种网络协议,www 是万维网,就是我们通常说的互联网。你发了一个https请求,你想访问百度的首页(得到一个html网页),但是浏览器怎么知道 baidu.com 需要转发给哪个服务器让它把百度的网页的这个资源返回给你呢?浏览器一开始并不知道,所以浏览器决定把这个问题转交给操作系统。

    2. 操作系统

    操作系统收到了浏览器的问题,它说我这里有一个https GET 请求,这是请求的地址

    https://www.baidu.com:443/

    我在这里等你,你帮我把对应的资源拿回来。操作系统知道这是一个https协议,也知道请求的域名是 baidu.com, 但是问题来了,操作系统也不知道这个域名对应的机器是哪个。我们知道每个计算机都有一个ip地址,根据ip地址我们可以确定在由好多好多计算机组成的网络中某个计算机的身份(谁是谁)。但是ip地址又简单分为两类,公网ip和内网ip,公网是处在互联网上的ip,我们平常说能上网一般指的就是公网,而内网ip是相对于公网ip来说的,有兴趣的同学可以去看ip地址的分类(我反正是讲不清楚的)。话说操作系统,它为什么不知道这个域名对应的机器是哪个?因为操作系统有一个小本本叫做hosts文件,里面记录了它知道的ip和域名的映射关系,比如我的电脑上这个小本本长这个样子:

    ##
    # Host Database
    #
    # localhost is used to configure the loopback interface
    # when the system is booting.  Do not change this entry.
    ##
    127.0.0.1   localhost
    255.255.255.255 broadcasthost
    ::1             localhost
    

    左边是ip,右边是域名。很明显没有baidu.com这样的东西,于是操作系统把https请求封装成一个信封,投递地址写上了这个域名,把这个信封交给了路由器,告诉他麻烦帮我投递到这个地址,我的地址是192.xx.xx.xx,麻烦你投递成功之后把内容给我捎回来。

    3. 路由器

    路由器收到了操作系统给它一个信封,它只关心把这个信封投递出去,并不关心里面是什么内容。当前路由器也不知道这个域名对应的ip到底是谁?于是路由器一路一路的问人,问谁呢?当然是问下个路由,让他找到了以后捎信回来给我,每个新的路由都把来源地址换成了自己的地址,交给下个继续投递。如果路由都不知道的话就接着问,终于来到了IPS服务提供商。

    4. IPS服务提供商

    我们知道中国的IPS服务提供商有联通、电信等,我们能上网需要有网线、有WIFI,根据这些服务我们能访问千里之外的服务器上的内容。因为网线、WIFI把我们的上网的需求转换成了信号一路一路的送到了千里之外的服务器上,到了这里再经过转换变成了可以理解的请求,然后根据请求作出响应,又把响应换成了信号一路一路的送回来我们这里,再经过转换变成可以理解的内容展示给我们。回到路由器的问题,它带着信封和目的地域名来到了IPS,问下一站要怎么走?IPS一看这个域名,去查自己的域名-ip映射小本本,发现也没有对应的。IPS说,你稍等,我看这个域名是.com结尾的,我去问一下DNS服务器。

    5. DNS

    DNS全称叫做 Domain Name Server, 域名解析服务器,提供把域名解析成ip的服务。比如IPS问baidu.com对应的ip是啥?DNS去查自己的小本本,baidu.com对应的ip是220.xx.xx.xx。IPS欢天喜地的拿到了这个ip之后,把它告诉了路由器,路由器一看,哈,这个ip还不在我认识的电脑里,我还得去问下个路由,于是一直问,终于来到了目的服务器,路由器找到了!于是它把信封打开,把里面的内容交给了目的服务器。

    6. 目的服务器

    目的服务器也是一台计算机,也有操作系统,它收到了来自路由器的内容。这是一个https请求,长这样

    https://www.baidu.com:443/

    操作系统去活跃的程序们中找,谁在监听443端口啊?这里有你的东西要查收。这个时候nginx抬头了,啊,是我,我在监听443(假设是nginx),我看看是什么东西。nginx发现这是https请求,请求的内容啥都没有,就是一个/根路径,于是nginx根据默认的设置,生成一个index.html页面。(根据约定,请求/基本等同于请求/index.html)这个页面转交给了操作系统,然后操作系统封装了这个响应的数据成为新的一个信封,把信封交给来源的路由。

    7. 路由回去

    来时路上的路由现在一个接一个收到了回复的信封,每个都按照信封上的来源地址一个接一个的往回投递,终于回到了最开始的路由器。最开始的路由器发现来源地址是192.xx.xx.xx的计算机,于是把信封拆开,内容交给操作系统。

    8. 操作系统

    操作系统把收到的响应转给浏览器(这里有个问题?它怎么知道要把响应给浏览器呢,而不是给别的应用,比如说office?)

    9. 浏览器

    浏览器终于拿到了https请求的响应,根据content-type,这是一个text/html页面,浏览器开始一行行的渲染网页。如果只是html标签,浏览器渲染的很快,但是浏览器很快发现有很多img标签,和script标签,img的src属性指向一个URL地址,于是浏览器又发起指向该URL地址的请求(就是上面1-9的步骤),去获取这个img图片,当遇到script标签的时候,浏览器就去执行javascript,等到所有的html标签渲染完成,并且请求都响应成功,js脚本也执行完毕之后,这个页面算是加载完成了。

    10. 关于我也说不太清楚的ps

    • 每次https请求都会去走一边完整的路由、ips、dns过程吗?
      应该不是。路由器会有自己的缓存,ips也会有。操作系统也会有,浏览器也都会有。也就是说一旦域名在任何一层缓存得到了解析ip,那么就会停止解析,直接根据那个ip去访问对应的机器(通常还是会有路由)。所以如果某一层的缓存没有得到及时的更新,或者是错误的,那么根据域名永远访问不到正确的ip,也就访问不到正确的服务。
    • DNS劫持
      我的理解是顾名思义,DNS发生了错误的解析。比如某个应用程序恶意修改了系统的hosts文件,总是使baidu.com指向127.0.0.1的话,那么你的浏览器打开网页总是会提示你服务拒绝访问(除非你本地有web 服务器提供服务)。同样的DNS劫持有可能会发生在IPS中,我们上网访问某些被和谐的网站或者随便敲击的域名的时候,可能会看到中国电信提醒您访问的页面不存在这种提示(虽然很有可能是被和谐了...)
    • 设置dns为8.8.8.8或者114.114.114.114是什么鬼
      这两个地址是谷歌提供的免费dns解析的服务器的地址,也就是说,当在浏览器输入域名的时候,会通过谷歌提供的dns解析到正确的ip,然后直接访问这个ip,可以很大程度上减少dns劫持的问题。(那么ip会不会被劫持呢?比如路由器明明要去8.8.8.8却被带到了8.8.8.4?)

    相关文章

      网友评论

        本文标题:从浏览器输入baidu.com到页面展示发生了什么?

        本文链接:https://www.haomeiwen.com/subject/csmviftx.html