0%

浏览网页时,发生了什么

​ 之前一段时间,阅读了计算机网络,对于每个章节都做了一个相应的思维导图来描绘计算机网络的七层模型(或者说5层模型),现在写一篇简答的博文来来回答一个简单的问题:当我们浏览网页的过程中发生了什么?
一个典型的浏览的过程是什么呢?简单的感受就是,在浏览器的地址栏输入网址,比如www.imzy.vip ,然后呈现的出该网站的界面。当然访问每一个网页,抽象出来的过程都是一致的主要简单划分为以下几个过程。

网址和协议

​ 在浏览器界面上的地址栏输入的东西,比如http://www.imzy.vip,整个地址就叫做网址,网址的构成如下

1
协议://域名::端口号/资源地址

形如http的部分就是协议名称,http协议被称为超文本传输协议,对应的还有file协议,如果用浏览器打开本地计算机上的对应文件,html之类的就会用到file协议。另外一种常见的协议就是ftp协议,在http协议之前,ftp是网络时间上最常见的协议,用于文件的传输。

端口号是指::8080这种形式,其中http默认的端口号是80,这种默认的端口号可以不用填写。

之后用斜杠跟着的是资源位置,不再赘述。

DNS的解析

浏览器中输入的域名经过寻址,才能找到指定的服务器,但是服务器的地址是ip地址,形如xx.xx.xx.xx 这里的xx指的10进制的数字。这种是典型的ipv4地址。从域名www.imzy.vip 到xx.xx.xx.xx的转换就称之为域名的解析。域名的解析,简单来说就是需要域名解析服务来解析,根据网络建设的架构,全球分布着数台顶级域名解析器。需要注意的是,域名用点分发记录,越高级的域名排在最后。比如我的域名vip是顶级域名,常见的顶级域名还有 .cn .com .org .gov等。详细的知识可以参考谢希成的计算机网络一书,截止目前这本书已经发布了第七版。堪称与时俱进。

DNS的解析是按顺序的,不是所有的网络请求都直接去顶级域名服务器申请解析的,主要的解析按照以下顺序进行

  1. 浏览器缓存
  2. 系统(指计算机操作系统OS)的HOST
  3. 路由器(按照计算机网络一书,路由器也算是网络世界中的计算机,不过他承担的任务特殊罢了)
  4. ISP服务商,既提供给你网络服务的电信服务商的缓存,比如中国电信提供的DNS解析服务
  5. 根域名服务器

从上到下六个部分都可以进行域名的解析,哪一步能完成就到哪一步进行,域名和ip的转换就在那里进行,不去下一步。这样也减小了域名解析的压力。

由此产生了两个小问题如下

  1. 为什么不直接用ip,减少域名解析的步骤呢?
  2. DNS劫持指什么

关于两个问题的回答如下

其一,使用域名的解析是为了语义化,所谓的语义化,简单理解就是贴近自然语义,方便人的理解。比如我们访问百度,直接说访问百度,或者说访问www.baidu.com,如果没有域名,直接说访问202.108.22.5。 直接对比一下,那个好记录呢。可以说域名是人记忆力的妥协,毕竟对于人来说,词才是有意义的,数字并无直接意义。对于计算机来说,点分十进制和域名的记录都是一样的。工具为人服务,自然要向人妥协

其二,DNS劫持。DNS的解析就是拿到域名之后解析成为ip的过程,所谓劫持,就是扰乱这个过程,访问百度域名,给了你一个非百度的ip,用户这边看到地址栏还是百度的域名,背后发生了什么一无所知。DNS劫持是一种后果非常严重的不安全行为,假如你要访问淘宝买东西,但是你的DNS被劫持了,指向了非淘宝的地址。这个过程一想,就会造成非常严重的经济损失。当然,还有其他的损失。一般的DNS劫持都发生在路由器,当然ISP服务商也有可能会劫持DNS。之前闹的沸沸扬扬的小米路由器DNS劫持事件,也是一个非常热门的话题。

补充一点,我们平时填写的DNS服务器,8.8.8.8 或者 114.114.114.114以及最近比较火的1.1.1.1都是域名解析器的地址。

服务器

网络请求经过DNS解析,找到对应的服务器ip,通过路由器的层层转发,到达了服务器,算是真正进入了后端控制的部分了。一般把用于web服务的服务器都叫做 Web Server。后文把它简称为WS。WS简单来说就是安装了服务器软件的电脑,常见的Web服务器的操作系统主要是Linux和Windows Server。对应的服务器的软件有Apache,Nginx,IIS,Lighttpd等。这种OS+软件,就称之为WS。WS主要是为了接受请求,或者反向代理到其他的WS。一台WS上可能运行有不同的服务器程序(这个就是程序开发者自己写的),这些软件也负责吧不同的请求分发到对应的处理程序上去。

网站的处理流程

经过长时间的游荡,请求终于到了程序猿自己掌控的时间了。以常用的Ruby on rails为例。我也在之前的博文中写过,如何使用Actix-web来写一个web程序,之前也参考过Ruby on rails。典型的网路处理流程是MVC模式的。这里的Modle指数据部分。V指view,显示层简单来书哦就是html界面。C就是控制层,controller,用来粘合这两个层层面,直白的说就是根据不用的请求从model拿数据,交给view层渲染(view需要数据来渲染)。

更具体点的过程是这样的,一个请求过来,经过router,分配给对应的controller。controller处理对应的逻辑,从model拿数据,交给view层来生成界面。最后把生成好的界面交给用户。一个题外话,一个合理的架构中,处理逻辑的controller和处理数据的model,应该是独立的。也就是说Data Server应该独立于单独web服务之外。更多对于mvc的理解是基于编程理解的。也不是本文的主要讨论过程。有兴趣的可以去看我用rust写的Actix-web博客,麻雀虽小,但是整个框架是完整的。

浏览器解析

服务器处理之后,终于交给用户了。简单来说就是说吧html交给浏览器。浏览器就会解析html和css,生成我们看到的界面。