(二)——经典的Web应用网络模型
最后更新于:2022-04-01 20:59:33
> 本文链接:[Web开发新人培训系列(二)——经典的Web应用网络模型](http://rapheal.sinaapp.com/2014/10/24/webdev-network-model/ "本文固定链接 http://rapheal.sinaapp.com/2014/10/24/webdev-network-model/")
> 来源:[拉风的博客](http://rapheal.sinaapp.com/)
## 前言
这篇文章要介绍的是一个常见Web应用基本的过程跟网络模型,当然,对于多数的Client/Server应用也是适用的。延续这个系列文章的风格,只管通俗不管严谨。
## 概览
总体模型概览图:
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-07_57cfde1c098aa.png)](http://rapheal-wordpress.stor.sinaapp.com/uploads/2014/10/%E6%A6%82%E8%A7%88.png)
## DNS
用户点开/输入一个链接http://www.qq.com/index.html之后,浏览器需要先找到www.qq.com这个域名对应的IP地址,因为计算机是通过IP作为门牌号的,而域名你可以认为是这个IP的别名,方便人类记忆使用。
一般来说,浏览器会先询问本地DNS缓存,如果没有记录过这个域名映射的IP,那就向本地的DNS网关询问,如果网关也不知道,就继续往上一层的DNS服务器询问,直到拿到这个IP地址。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-07_57cfde1c26f1e.png)](http://rapheal-wordpress.stor.sinaapp.com/uploads/2014/10/DNS.png)
一般来说,一台服务器处理的请求是有限的,因此大型的应用都会有多台proxy机器,我们可以让DNS服务器在第一个请求返回IP1,第二个请求返回IP2,……这样用户的请求就会均匀的落在这些机器上,这个就是DNS负载均衡。CDN就是通过智能DNS算出离用户最近的CDN节点的IP地址,这样用户可以访问一台离他最近的机器,大大节约连接时间。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-07_57cfde1c3e86f.png)](http://rapheal-wordpress.stor.sinaapp.com/uploads/2014/10/DNS%E8%B4%9F%E8%BD%BD.png)
## 代理与反向代理
一般来说,浏览器跟真正提供Web服务的机器是没有直接连接的,他们中间都会有代理跟反向代理。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-07_57cfde1c566e1.png)](http://rapheal-wordpress.stor.sinaapp.com/uploads/2014/10/%E4%BB%A3%E7%90%86%E4%B8%8E%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.png)
大部分的公司都会内部的计算机都配置了代理服务器,其作用是所有内部的网络请求都是通过代理去连接对方服务器,可以在代理服务器这里做恶意请求/响应的拦截,还可以缓存内部网络所需的公共资源。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-07_57cfde1c6ea9d.png)](http://rapheal-wordpress.stor.sinaapp.com/uploads/2014/10/%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86.png)
反向代理就是以代理服务器来接收网络连接请求,我们上下文称Proxy机器指的就是反向代理机器,Proxy机器收到请求后会经过一定的分析最后把请求内容转发给内网对应的Web服务器,Web服务器的HTTP响应包会先到Proxy机器,然后再到用户机器。
反向代理的好处是可以负载均衡,在它后边可以有多台工作的Web服务器,这样分层次之后,很多职责就明确很多了:Proxy机器负责负载均衡、拦截恶意请求、维持长连接,还可以屏蔽不工作的Web服务器;而Web服务器就只要关心自己处理的Web业务逻辑即可。
往往Proxy服务器跟用户机器保持长连接,这样可以节省用户每次跟服务器建立连接的消耗,而Proxy服务器跟Web服务器采用短连接的方式,这样可以有效节约Web服务器的资源。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-07_57cfde1c8b0bb.png)](http://rapheal-wordpress.stor.sinaapp.com/uploads/2014/10/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.png)
## Web server
Web server的职责就是根据用户的请求,返回其所需要的响应内容。往往Web server只涉及业务测逻辑的判断以及数据的组装,而真正的数据位于后端的存储Server(本文不涉及)。
对于一般应用来说,Web server返回的是动态产生的内容(每个用户都不一致的动态内容或者经常编辑变动的内容),如页面的HTML内容、JSON数据、XML数据等。而Javascript文件、CSS文件、图片这些静态资源(不根据用户而变动的资源)往往存放在CDN中。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-07_57cfde1ca72bd.png)](http://rapheal-wordpress.stor.sinaapp.com/uploads/2014/10/Web-server.png)
## 浏览器
从浏览器发起请求,经历以上讲述的步骤处理后,浏览器发起到从Web sever返回的HTTP包。一般来说这个响应是返回网页的HTML。
接着浏览器开始解析收到的HTML包,HTML里边一般会把样式CSS跟脚本Javascript作为外链请求。本文不涉及页面渲染内容,主要为了讨论整体应用的模型,因此这块留以后探讨写文章。
## CDN
从上边讨论知道,对于动态的内容,请求总是到Web server去动态计算获取内容,但是对于不随用户状态变化的内容我们把内容推送到CDN节点上。
静态资源的域名跟页面HTML的域名一般来说是不一样的,因为静态资源的请求需要解析到CDN节点去。我们假设主请求是:www.qq.com/index.html;CDN请求是cdn.qq.com/index.css。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-07_57cfde1cc071d.png)](http://rapheal-wordpress.stor.sinaapp.com/uploads/2014/10/CDN.png)
一般Web应用把静态内容推到CDN有两种模式,一种是在上线前主动将内容推送到CDN节点,一种是CDN发现本地没有该文件时,回源到Web server机器取内容,然后缓存在他本地。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-07_57cfde1ce2993.png)](http://rapheal-wordpress.stor.sinaapp.com/uploads/2014/10/CDN%E6%8E%A8%E9%80%81%E5%86%85%E5%AE%B9.png)
';