接上一篇:【网络面试必问(7)】聊聊集线器、交换机和路由器
作为一个程序员,其实很少去了解http请求消息在到达服务器之前,所经过的众多组件的,今天借着机会聊一聊标题中提到的正向代理、反向代理、缓存服务器、负载均衡和内容分发服务器等内容。
一般情况下,公司搭建的一些内部管理系统,仅供员工使用,会同时在公司机房里面部署WEB服务器,这样的方式最快,甚至可以在局域网中实现。有时候对于一些对外开放的网站,WEB服务器也可以部署在公司内部,但是这样会有些问题,第一个是要给所有的服务器机器分配公网的IP地址,现如今的IP地址已经很稀缺,资源不够,第二个是来自互联网中的请求有些是恶意的或者非法的攻击,直接对外暴露比较危险,通常情况会在WEB服务器的前面加上一层防火墙进行网络包的过滤。
除了直接部署在自己公司里面,还可以部署在数据中心,也就是IDC机房。想了解IDC机房是干啥的,可以参考这边知乎的介绍 关于“数据中心”的最强入门科普,简单来说,IDC机房就是运营商来管理的,直接连接到互联网的最核心的部分,所以讲WEB服务器部署在这里的最大优势就是访问速度更快,尤其是一些访问量大的网站就更有效果。
除此之外,IDC一般都具有强大的抗震能力、自主发电能力,好一些的机房还有附加服务,比如服务器的状态监控、防火墙、24小时值班等等,一些中小型公司完全可以租用这些服务降低自己的运营成本。
前面我们提到过,路由器的包过滤功能其实就是一道防火墙。今天我们来看看部署在WEB服务器前面的这个防火墙服务器,它的实现原理是怎样的。
防火墙的思路很简单,就是支允许发往特定服务器和特定应用程序的的网络包通过,其他的包一律丢弃。基于这种思路,有很多种方式可以实现,但是最常见的就是包过滤方式。我们都知道在网络包中包含很多控制网络通讯的头部信息,只要根据这些信息设置过滤规则就可以达到这一目的,所以最重要的就是根据不同的同步信息设置不同的过滤规则。
在MAC头部、IP头部、TCP头部都有很多信息可以过滤,这里我们只简单介绍原理,就来了解两种场景。对于WEB服务器来说,第一个是我们只允许访问部署在WEB服务器上的特定应用程序的包通过,第二个是禁止WEB服务器主动访问互联网。
首先确认了是互联网流向WEB服务器的包,我们可以根据WEB服务器的IP地址过滤那些目的IP地址不合法的包,其次,如果我们可以确认发送方的IP地址,或者只允许某些IP地址访问,也可以根据发送方的IP地址来过滤,这是根据IP地址的过滤规则。
通过了IP过滤规则网络包之后,我们还需要根据TCP或者UDP头部的目的地址端口号来过滤,只允许特定应用程序对应端口号的包通过,这样就可以限定到某个应用程序了。
通常情况下,我们是不允许WEB服务器有主动访问互联万的需求,所以我们可以过滤这部分主动访问互联网的包,但是不能单纯的根据流向来判断,因为来自客户端的请求在连接和发送阶段,需要收到服务器返回的ACK确认包。所以需要根据IP地址 + 控制位的判断。
对于起点是WEB服务器,发往互联网中的包,如果控制位ACK = 0的包就要过滤掉,这样在网络建立连接的阶段就结束了,后面自然就没有发送数据的过程。而对于来自客户端的网络请求,由于返回的数据ACK ≠ 1,所以不会被过滤,就不会收到影响。
基于上面介绍的规则,我们可以看下面这个图示:其中,192.0.2.0/24是WEB服务器的IP地址,80是WEB应用的程序端口
综上所述,包过滤方式的防火墙,可以根据接收方IP地址,发送方IP地址,接收方端口号,发送方端口号,控制位等信息来判断是否允许某个包通过。
负载均衡我们很熟悉,通过负载均衡可以把流量打在不同的WEB服务器的主机上,我们来看下负载均衡的实现原理。
一种方式是使用负载均衡的设备,替代WEB服务器的IP地址,注册到DNS服务器上,这样来自互联网的访问首先可以到达负载均衡的服务器,然后负载均衡服务来决定将请求转发给哪台主机。这里当然可以采用轮询的方式,但是弊端也比较大,如果某台服务器的性能不好,再接收新的请求可能会雪上加霜。如果某些登录操作涉及到跨页面,那么不同主机上的Session如果无法同步的话,也会造成登录失败等问题。
其实负载均衡是可以定期采集WEB服务器每台主机的CPU、内存使用率的,并根据这些数据判断当前主机的运行情况,动态的调整转发流量的分布,而且负载均衡也可以主动向WEB服务器发送测试包,根据测试包的响应时间来判断主机的负载情况。
而对于登录跨页面的情况,就需要使用HTTP头部的Cookie信息来判断了,将一些列请求直接发送到同一台服务器上,避免跨主机的情况。
负载均衡解决流量不均衡的问题,但是没有办法减少打在服务器上的流量,这里缓存服务器就可以通过减少请求的访问量降低降低服务器的负载。
缓存服务器是通过代理机制实现的对数据进行缓存的服务器,介于WEB服务器和客户端之间。它可以把WEB服务器的资源缓存在磁盘中,也可以对客户端发起的请求中转到WEB服务器。缓存服务器可以部署在WEB服务器一侧,也可以部署在客户端一侧,各有优缺点。比如部署在服务器端,可以减少对WEB服务器的负载,但是没有办法减少互联网的流量,部署在客户端的情况,WEB服务器无法知晓缓存服务器的情况,可能在增加大容量内容时造成缓存服务器内存或者磁盘容量不足的情况。
为了解决这个情况,一些专门从事缓存相关服务的厂商就出现了,他们抓们部署服务器来实现缓存功能,并租赁给WEB服务器运营人员,同时他们会和主要的运营商签约,部署很多台服务器,这就是内容分发服务,提供这种服务的厂商叫CDSP,即内容分发服务运营商。这样,用户访问的WEB服务器实际上访问的就是这些内容分发服务器,大大的降低了WEB服务器的运营压力,同时对于客户端来说也是无感的。
但是这里还有一个问题,第一个是如何保证用户能访问到距离自己最近的缓存服务器呢,另外是缓存的数据如何能保证和WEB服务器同步更新呢。解决第一个问题的办法,有注册DNS服务器和重定向等方式,需要把路由器的信息同步记录到DNS服务器上,然后计算哪个DNS服务器距离客户端最近。第二个问题的解决方式是,当WEB服务器的内容发生变化的时候,可以主动告知缓存服务器,对相关内容进行更新。
不管是正向代理还是反向代理,其实都是位于客户端和WEB服务器之间一个代理服务器,根据部署位置的不同和功能不同分为正向代理和反向代理,一般部署在客户端一侧的是正向代理,部署在服务端一侧的是反向代理。
正向代理部署在客户端一侧,可以代替客户端向服务端发送请求,当客户端需要从目标服务器获取资源时,就会向正向代理发送请求,在客户端看来,正向代理就是目标服务器。正向代理的一大好处就是可以作为缓存服务器资源,一定程度上减少网络请求的次数,降低网络压力,另外服务器端接收到请求的发送方IP地址始终是代理服务器的,也可以起到保护客户端隐私的作用。大家一定听说过软件,其实现原理其实就是正向代理的机制。
反向代理一般是部署在服务端一侧的,对于客户端来说,实际是将请求发给了代理服务器,反向代理服务器将请求转发给WEB服务器,在客户端看来,代理服务器就是WEB服务器。反向代理可以隐藏真实的服务器信息,增加服务器的安全,常见的反向代理一般用来做负载均衡、防火墙、缓存服务器等,其中作为缓存服务器的反向代理可以减轻服务器的访问压力,但是相对于正向代理的缓存服务器,没有办法减少客户端请求的次数。
综上来看,正向代理和反向代理都可以实现请求转发和代理的功能,但是他们的位置和用途不同,正向代理主要位于客户端一侧,可以用于缓存和代理;而反向代理主要位于服务端一侧,可以隐藏服务器的真实信息,增强安全性并能提高网站的性能。
下一遍链接:【网络面试必问(9)】Web服务器处理Http请求消息及与客户端交互的原理