数据包在接收端局域网中的传输
本章是‘网络是怎么连接的--读后感’第五章
前言
本章是系列博客的第五章;第一章讲数据发送的场景;第二章主要讲叙消息是如何发送出去的;第三章主要阐述数据包在客户端局域网中的传输;第四章详细阐述数据在互联网中是如何传输的;本章讲接入端局域网中的通信。
实现需求
前面讲到了数据传输到互联网中;接下来本章将继续延续这个思路,对数据传输到接收端也就是服务器局域网中的通信进行阐述;主要讲如下几点:
- web服务器的部署
- 防火墙结构和原理
- 负载均衡--平均分配请求到多台服务器实现负载均衡
- 负载和代理服务器--利用缓存服务器来分担负载
- 通过内容分发服务商租用缓存服务器
正文
一、web服务器的部署
web服务器的部署有三种方式:
- 部署在公司内网,直接通过运营商提供的网络路由器或BAS路由器连接,从而接入互联网(数据包的发送和前面一样;这种方式现在已经被淘汰了)
- 同样是部署在公司内网在数据流入服务器之前,先经过防火墙程序检测(在路由器/服务器中均可有防火墙),防火墙屏蔽了不允许外部访问的程序,禁止不合法的数据包通过,可以降低一些风险.
- 部署在运营商的数据中心,也可以直接租用运营商数据中心的服务器,由于数据中心放置着运营商的NOC或IX,因此服务器通过高速线路可以直接连接NOC等核心节点;可以有效提升在互联网中的访问速度(如我以前所在的程序化广告项目就是购买了十几万太服务器组建的数据中心来处理海量数据)
如图所示:
二、防火墙结构和原理
前面讲了在部署服务器时,一般会在服务器前部署一个防火墙来保护服务器,拦截恶意程序;那么防火墙是如何实现保护的呢?
- 防火墙常用包过滤方式来限定;通过对发送端的IP地址端口和接收端的IP端口进行限定;只允许满足规则的包收发来实现对数据传输的控制;
示例如图,图中规则表是抽象出来的,实际防火墙规则并不是表的形式:
第一行规则防火墙允对数据发送端/互联网输入端的IP不做限制,任意设备发送过来的包都能通过;但会限定传过来的包的IP头部接收方地址必须是192.0.2.0/24,端口必须是80端口;如果不是则拦截包,不让数据通过。
第二行规则是对服务器访问互联网做的限制;发送发IP地址和端口是记录在发送包IP头部的信息,代表发送端服务器端的地址;如果TCP控制位为SYN=1,则代表这个数据包是TCP建立连接发送的第一个数据包,代表服务器发起对互联网的连接请求;由于状态是阻止,因此阻止服务器访问互联网。
第三行规则是防火墙允许通过从IP为192.0.2.0/24端口为80的设备发送的数据包,由图可知这是允许服务器的响应数据包通过。
同时防火墙还具有地址转换功能;在前面介绍了公司内网和互联网通信需要通过路由器进行地址转换,实际上防火墙的地址转换实现和它是一样的,也是通过设定规则来实现的,一旦发送端/接收端的IP和端口满足规则就进行地址转换。
注意:防火墙的包过滤技术并不是它独有的机制;实际上是在路由器包转发基础上发展起来的,路由器的包转发功能其实也具有包过滤的特点;如果判断规则不是特别复杂的话,通过路由器的命令可以维护这些规则,就无需使用专门的硬件和软件搭建防火墙来进行过滤。(包过滤式防火墙是通过起点和终点来过滤数据的,因此他并不能杜绝所有风险)
三、负载和代理服务器--利用缓存服务器来分担负载
在用户较多,访问量较大的网站仅靠一台服务器是无法满足需求的;因此一般需要多台服务器来分担线上的压力,称这种服务器架构方式为分布式架构;分布式架构有多种:
- 最简单:通过dns服务器实现,对同一个网址在dns服务器中保存多条IP记录;当多个用户请求该地址时,dns服务器对查询该地址的请求,依次循环返回不同的服务器IP;
- 常用的:通过负载均衡器来判断对请求的分配;原理是将负载均衡器的IP记录在dns表中和请求地址关联,当用户发起请求首先会根据域名解析到负载均衡器,负载均衡器在根据“设定的规则”来将请求分配给服务器;
- 通过负载均衡器分配请求的核心,是分配请求的规则;通常可根据定期采集的web服务器的cpu、内存使用率等、来判断服务器的负载从而分配请求;也可以根据事先设置的服务器的性能指数,按比例分配请求;
- 特殊请求:当操作跨多个页面时,此时则必须将请求发送到同一个web服务器;至于判断操作之间的关联性可以根据http协议消息头中的cookie来判断,同一会话就会发送给同一服务器处理;
负载均衡器工作示例如图:
除了上面说的分担负载的方式外;还能通过缓存服务器分担负载,缓存服务器是部署在客户端和服务器之间的中转服务器;反向缓存服务器实现负载均衡的方式和负载均衡器有点类似(负载均衡器是在缓存服务器基础上发展而来的)
- 首先还是需要将缓存服务器的IP记录在dns服务器上(只有反向缓存服务器需要);用户通过域名解析首先将请求发送到缓存服务器,缓存服务器收到请求后首先会查下本地有没有缓存数据;
- 如果没有缓存数据的话;会将收到的数据包中的http消息加一个via参数发给服务器(via参数用来表示数据经过了缓存服务器中转);
- 当存在多台服务器时;缓存服务器会根据http消息中的请求地址的目录来确定将请求发送给哪个服务器;(反向缓存服务器通过目录关联目的服务器)
- 缓存服务器发送数据的方式和客户端是一样的;服务器接收到请求消息后,返回响应的数据包;
- 响应的数据包也会先发送到缓存服务器上;缓存服务器会在数据包的消息中加入via参数后,将数据转发给客户端,同时会将数据保存一份在缓存服务器上;
- 如果缓存服务器有缓存数据;在收到客户端请求时,则会将在数据包的http消息中加入via参数和if-modified-since参数(缓存数据上次保存时间)并转发给服务器;(使用cds服务就无需这个操作)
- 服务器收到请求会在根据缓存数据保存时间,和请求数据更新时间来判断数据是否有变化;如无变化;则返回很短的响应消息告诉缓存服务器数据无变化;
- 然后缓存服务器就会将缓存的数据发给请求的客户端;
- 如果服务器收到请求后;根据缓存数据保存时间和服务器数据更新时间判断数据有变化;则会将更新的数据返回给缓存服务器(这和缓存服务器无缓存时的情况是一样的);
示例图如下:
上方使用的是在服务器的一端部署一个代理;同时还能在客户端的一侧部署代理服务器,用作缓存服务器;这种将代理服务器放置在客户端一侧的代理是正向代理;
正向代理常用来做缓存服务器;除了缓存功能外,一般还用来设定防火墙,原理如下:
客户端的请求和服务端的响应都会通过代理服务器;进入代理服务器后能对数据包传输的消息内容进行检测,因此就可以设计规则拦截某些访问(活脱脱就是个墙啊,vpn使用的就是这种技术,注意使用正向代理需要先在浏览器中配置代理)
补充:由于在浏览器输入地址时,输入的是完整地址,因此可以发送给任意服务器;这和服务器端的缓存服务器不同;他只能向事先设置好的目标转发,并且通过请求地址中目录名关联服务器,这种方式称为反向代理,能转发不包含完整网址的请求。
还有一种透明代理,无需在浏览器上配置代理;也不是和反向代理一样通过dns解析来实现代理;而是直接在包发送/接收的路径上拦截或过滤出数据包,从而实现转发。
四、缓存服务器的实现内容分发服务
缓存服务器常见有这三种部署方式,各有优缺点如图:
其中第三种方式是和内容分发服务运营商签约来选择租用合适的服务器作为缓存服务器;这种服务称为内容分发服务cds。
通过cds服务租用了大量的缓存服务器后,我们希望用户发起的请求会首先发给离他最近的缓存服务器;请求分配给最近的缓存服务器有两种方式如下图:
- 将所有缓存服务器的路由信息记录到服务器端的dns服务器上,客户端dns服务器发起的域名解析的请求,服务器端的dns服务器做出响应时需要通过路由转发,通过路由信息计算出最近的缓存服务器的转发路由即可将最近的缓存服务器确定下来;然后在请求地址时,将地址解析到该IP就能利用最近的缓存服务器实现代理了;
- 通过重定向的方式来使用最近的缓存服务器;最近的位置计算方式和上面一致;然后利用http消息中的重定向参数,将请求发送给重定向服务器该服务器在将请求转发到最近的缓存服务器;
补充:CDS服务提供的缓存服务器具有在目标服务器数据有更新时;直接将更新数据推送到CDS服务的缓存服务器的机制;这样能减少转发用户端的请求到目的服务器的操作;有效提升访问速度。