计算机网络 - 5
服务器
数据经过路由器的转发,会到达运营商的路由器中,再层层转发,最终到达请求的服务器中。
防火墙

无论服务器部署在哪里,现在一般都会在前面部署一个防火墙,如果包无法通过防火墙,就无法到达服务器
包过滤方式
假设外网的服务器和公司内网分开部署,Web 服务器所在的网络可以从外网直接访问。现在我们希望允许从互联网访问 Web 服务器,但禁止 Web 服务器访问互联网。

- 通过接收方 IP 地址和发送方 IP 地址,包从互联网流向 Web 服务器,我们可以来设定规则,允许起点(发送方 IP 地址)为任意,终点(接收方 IP 地址)为 Web 服务器 IP 地址的包通过,这样一来,从互联网发往 Web 服务器的包就可以通过防火墙了。
- 再通过判断条件中加上 TCP 头部或者UDP 头部中的端口号。Web 服务器的端口号为 80。只允许访问80端口的web服务。
- 但是条件还没达到,因为还没有办法阻止 Web 服务器访问互联网。Web 使用的 TCP 协议是双向收发网络包的,因此如果单纯地阻止从 Web 服务器发往互联网的包,则从互联网访问 Web 服务器的操作也会受到影响而无法进行。这里就需要用到 TCP头部中的控制位。TCP 在执行连接操作时需要收发 3 个包,其中第一个包的 TCP 控制位中 SYN 为 1,而 ACK 为 0。其他的包中这些值都不同,因此只要按照这个规则就能够过滤到 TCP 连接的第一个包
同样的防火墙也具备地址转换功能。当使用地址转换时,默认状态下是无法从互联网访问公司内网的,因此我们不需要再设置一条包过滤规则来阻止从互联网访问公司内网。
所以能做到隔离公司内网和外网的就是防火墙的作用
防火墙也有无法抵御的攻击,比如隐藏在数据中的攻击,因为防火墙只能根据接收方 IP 地址、发送方 IP 地址、接收方端口号、发送方端口号、控制位等信息来判断是否允许某个包通过,没办法看到数据。会攻击服务器程序的bug漏洞
负载均衡
当服务器的访问量上升时,对性能是个极大考验,所以会使用多台服务器来分担负载。这种架构统称为分布式架构。
负载均衡器
假设有一个域名,我们将这个域名对应的 IP 地址设置为负载均衡器的 IP 地址并注册到 DNS 服务器上,客户端会认为负载均衡器就是一台 Web服务器,然后由负载均衡器来判断将请求转发给哪台 Web 服务器。负载均衡器可以定期采集 Web 服务器的 CPU、内存使用率,并根据这些数据判断服务器的负载状况务器性能指数,按比例来分配请求,也可以根据事先设置的服务器性能指数,按比例来分配请求

缓存服务器
缓存服务器是一台通过代理机制对数据进行缓存的服务器。代理介于Web 服务器和客户端之间,具有对 Web 服务器访问进行中转的功能。当进行中转时,它可以将 Web 服务器返回的数据保存在磁盘中,并可以代替Web 服务器将磁盘中的数据返回给客户端。

缓存服务器可以在服务器端,这样是减轻服务端查询的压力,如果数据没有变化直接让缓存服务器返回结果即可。缓存服务器也有在客户端的。如果有命中的则直接返回数据。一个可以做查询缓存一个可以做数据缓存。

正向代理和反向代理
所谓正向代理就是顺着请求的方向进行的代理,即代理服务器他是由你配置为你服务,去请求目标服务器地址。放在客户端一侧的
比如我们要去访问谷歌网站,我们直接访问不通,那么我们就可以找一个代理服务器为我们服务,我们通过代理服务器请求到谷歌网站。对于谷歌而言他只知道有一个服务器访问了自己,并不知道这件事你是访问不了他,找了一个代理服务器访问自己
所谓反向代理正好与正向代理相反,代理服务器是为目标服务器服务的。放在服务端一侧的
比如我们请求服务器的一个对外域名,这个就是代理服务器,他会将我们的请求转发给内部具体的服务器节点。
服务器接收
经过了防火墙和缓存等然后就会进入服务器。
-
网卡
<1> 网卡接收到信号,然后将其还原成数字信息
<2> 根据包末尾的帧校验序列(FCS)来校验错误
还原后的数字信息被保存在网卡内部的缓冲区中。上面这些操作都是由网卡的MAC模块来完成的
<3> 这时网卡需要通过中断程序告诉CPU.
CPU响应之后会调用网卡驱动从网卡缓冲区中将接收到的包读取出来
<4> 检查MAC头部的以太类型字段判断协议的种类
调用负责处理该协议的软件。这里,以太类型的值以 IP 协议为例,因此会调用 TCP/IP 协议栈 -
IP模块
<1> IP模块首先会检查 IP 头部的格式是否符合规范.是不是发给自己的
当服务器启用类似路由器的包转发功能时,对于不是发给自己的包,会像路由器一样根据路由表对包进行转发
<2> 检查包有没有被分片
如果是分片的包,则将包暂时存放在内存中,等所有分片全部到达之后将分片组装起来还原成原始包;如果没有分片,则直接保留接收时的样子
<3> 检查 IP 头部的协议号字段
例如,如果协议号为 06(十六进制),则将包转交给 TCP 模块;如果是 11(十六进制),则转交给 UDP 模块 -
TCP模块
处理连接包
当 TCP 头部中的控制位 SYN 为 1 时,表示这是一个发起连接的包,接下来和客户端类似。
服务器端调用Socket库发起连接的操作如下:
(1)创建套接字(创建套接字阶段)
(2-1)将套接字设置为等待连接状态(等待连接阶段)
(2-2)接受连接(接受连接阶段)
(3)收发数据(收发阶段)
(4)断开管道并删除套接字(断开阶段)
先创建套接字,然后设置为等待连接并监听端口。如果客户端发起连接后,则接受连接。接下来客户端发出连接请求,协议栈会调用 accept 来接受连接。接下来就可以收发数据了

处理数据包
<1> 查找套接字
根据收到的包的发送方 IP 地址、发送方端口号、接收方 IP 地址、接收方端口号找到相对应的套接字
<2> 检查包序号是否一致
根据套接字中保存的上一个序号和数据长度计算下一个序号,并检查与收到的包的 TCP 头部中的序号是否一致,如果两者一致,就说明包正常到达了服务器,没有丢失。这时,TCP模块会从包中提出数据,并存放到接收缓冲区中,与上次收到的数据块连接起来。这样一来,数据就被还原成分包之前的状态了
<3> 发送确认消息给客户端
当收到的数据进入接收缓冲区后,TCP 模块就会生成确认应答的 TCP头部,并根据接收包的序号和数据长度计算出 ACK 号,然后委托 IP 模块发送给客户端
<4> 应用程序会调用 Socket 库的 read获取收到的数据
<5> 数据接收完毕后执行close断开操作