网络交互与接入 | 青训营

149 阅读15分钟

以刷抖音为例,分析网络交互与保证网络稳定的措施

网络交互打开抖音互联网会发生什么

刷抖音时网络如何交互

网络接入

  1. 大致过程

  1. 互联网
    1. 全球有13个根服务器,其他网络厂商都需要与根服务器连接才能连接网络
    2. 网络厂商如中国移动、中国电信等,其他个人/组织向网络厂商购买网络连接服务即可接入网络
  2. 路由(网络层传输,通过IP地址)
    1. 同网段接入(通过mac地址转发,无需路由)
      • 多个PC设备通过交换机/逻辑交换机连接
      • 使用SDN(网络软件化)技术,把两个交换机连接的网络虚拟成同一个网络
    2. 不同网段接入(使用路由,查找对应IP地址,进行转发)
    3. 路由在实际网络中通常是对称的,但是在复杂的连接网中是不对称的,比如当主机A向主机B发包的途径有很多时,A->B和B->A的路由就不对称了。
    4. 路由通常情况下认为工作在IP层/网络层
    5. 路由表的内容:目标IP地址 | 下一跳IP地址
  3. ARP协议——通过IP地址找到MAC地址(链路层寻址,通过MAC地址)
    1. 逻辑同网段才能发送ARP包
    2. 不同网段的查找需要通过中间路由,中间路由通过IP表不断查找最终找指定服务器IP地址,同网段中间路由发送ARP请求获取该服务器Mac,并将数据包发送给服务器
    3. ARP请求广播(目标MAC地址为255.255.255.255);ARP应答单播(目标MACA地址为请求的MAC地址)
    4. 免费ARP,比如一个局域网内新增一个主机,不用请求会直接告知所有主机,防止新增主机的MAC地址与已有的主机MAC地址重复,所以会重新为新增主机重新分配一个MAC地址
  4. IP协议
    1. 产生原因:存在二层设备没有MAC地址的情况,为了统一,向上封装了一个IP地址,用于转发
    2. IP地址是连接互联网的设备的唯一标识
    3. IPv4已经不够了,解决方案:1)扩展IPv6;2)NAT
  5. NAT
    1. IP地址不够了,NAT的本质是通过修改IP地址和源端口达到IP地址复用的效果
    2. 流程如下

网络传输

  1. 数据包

image.png

  1. DNS域名解析
    1. 迭代查询
    2. 递归查询

  1. UDP

UDP协议很简单,UDP的数据包内容如下
image.png
缺点:不能保证可靠传输(是否丢包/出错)

  1. TCP
    1. 三次握手

屏幕截图 2023-08-07 183858.png

  1. HTTP/HTTP1.1
    1. HTTP协议属于TCP通信的一种,只是细分出的一个更易懂(对于用户)的连接
    2. HTTP1.1相对于HTTP的优化:1)长连接;2)部分传输;3)HOST;4)缓存。。。。。。
  2. HTTPS
    1. HTTPS是HTTP的加密版本,HTTP传输容易被窃听,所以加了一层加密
  3. SSL/TSL握手
    1. SSL/TSL握手是HTTPS加密的主要手段,属于非对称加密
    2. 非对称加密通过第三方CA获取公钥,私钥解密
    3. 对称加密加解密的密钥相同

网络架构提质——刷抖音时又快又稳

网络提速

  1. HTTP2.0的优化:采用多路复用,提高传输效率,一次请求,并行传输(实际上有先后,但是无需等待前一个数据的响应)
  2. 多路复用:
    1. 一个TCP连接中,数据流串行发送(一个发完另一个立马接上),即为多路复用,相比于一个数据发送后,等到收到响应后才发第二个数据(1个RTT)更快
    2. 存在问题:TCP丢包——队头阻塞(如果其中一个包在传输过程中丢了,后面的包就会阻塞等待该包重传接收,此时多路复用也不管用,而且会造成资源浪费)
  3. QUIC/HTTP3.0
    1. QUIC/HTTP3.0 是对队头阻塞问题的解决
    2. QUIC/HTTP3.0 是在UDP协议进行了拓展,从而达到目的,原因是UDP协议比较简单,而且使用广泛,而TCP协议较为复杂,牵一发而动全身,而且一旦修改,所有使用该协议的设备很难简单的换掉协议
    3. QUIC/HTTP3.0 在Userspace态实现该功能,因为Kernel层实现意味着需要考虑到各个版本的操作系统的不同,较为复杂,加上现在有较多正在开发的OS系统,日后可能也需要实现,太过麻烦
    4. QUIC/HTTP3.0 天然实现了HTTPS的功能,0RTT传输
    5. QUIC/HTTP3.0 弱网优势,在弱网环境下容易丢包,而QUIC/HTTP3.0 主要就是解决了队头阻塞的问题(TCP丢包)
  4. 数据中心
    1. 分布图如下(核心机房是提供服务的核心服务器所在;边缘机房是转接核心机房/提供简单服务的服务器所在;POP接入连接了核心机房与外部网络)

image.png

  1. 同运营商访问
    1. 移动的访问移动的边缘机房;电信的访问电信的边缘机房。。。
    2. 原因:跨运营商网络很差
    3. 过程:通过解析访问的IP所属的运营商,转接入对应的边缘机房
  2. 静态资源(图片/视频)路径优化(CDN)

过程:如果有请求静态资源,则先在边缘机房的缓存中查找,没有就向上访问汇聚机房,再没有就请求核心机房,拿到数据后,边缘机房会将静态资源进行缓存,下一次访问,就直接从边缘机房的缓存中取相关的静态资源

  1. 动态API(播放/评论接口)路径优化(DSA)

过程:通过网络探测确定各机房的传输花销,构成一张表,然后通过算法确定最佳路径

网络稳定

  1. 容灾概念
    • 故障发生
    • 故障感知
    • 自动切换
    • 服务恢复
  2. 故障排查(没有容灾)
    • 故障明确
    • 故障止损
      • 先止损再排查
      • 降级止损/启动容灾系统
    • 分段排查
      1. 客户端排查
      2. 服务端排查
      3. 中间链连排查
  3. 故障排查常用命令
    • dig——查询DNS问题
    • ping/talnet/nmap——查询三层/四层连通性
    • Traceroute——排查中间链路
    • iptables——IP表
    • tcpdump——tcp抓包
  4. 故障预防
    • 监控报警
    • 故障演练/预案
    • 故障降级/止损

网络接入与企业级优化

网络接入

  1. 问题引入
    1. 经典面试问题:在浏览器中输入网站域名到网页加载出来,显示页面,都经历了哪些过程?

答:简略导入——域名解析、TCP建立连接、SSL握手等

  1. 探究其过程的方法
    • 浏览器抓包(观察网络/network)
    • wireshark抓包(DNS->TCP->TLS->HTTP包)
  2. 字节接入框架

image.png

企业级接入

以example公司为例,从企业的发展观察网络接入的不断优化

域名系统

  1. 域名系统的引入

初始公司小,使用Hosts主机表管理公司的主机,主机表中记录了公司内所有主机名(服务)与IP地址的映射
公司规模扩大,主机增多引发一系列问题

  • 流量和负载:员工规模指数级增长,Host文件大小越来越大,所有的消息统一分发引起较大的网络流量和CPU负载(相当于部门的内部消息需要广播发出)
  • 名称冲突:主机数量非常多,无法保证主机名称的唯一性,同名主机添加会导致服务故障
  • 时效性:针对第一条我们可以知道,部门的内部消息需要广播发出显然是不合理的,但是如果要保证部门消息只发给本部门的员工,则需要靠人工上传,时效性极差

为了解决上述问题,引入了域名系统

  1. 域名系统介绍
    1. 域名系统是树状结构,每一级服务器都有各自的域名,每一级域名不能重名,不同级域名可重复,以 . 为分界,替代Host主机表存储
    2. 通常服务器主机名结构:(四级域名.)三级域名.二级域名权威域名.顶级域名,如www.baidu.comwww.juejin.cnwww.hdu.edu.cn
    3. 公共域名系统分级大致如下

image.png

  1. 根域名服务器全球有13台,是域名解析查询起点,存储了所有顶级域名服务器的IP地址与域名的映射表
  2. 顶级域名通常为特定组织对应特定域名,如com——商业;gov——政府;edu——教育。。。,顶级域名服务器存储了所有向它购买/申请的二级域名服务器IP地址与域名的映射表(每个域名服务器各有一张表)
  3. 域名购买与配置迁移
    1. 域名购买:example公司属于商业机构,应该向公有云厂商处购买二级域名example.com,如阿里、火山引擎等,也可以购买其他特定主机对应域名
    2. 域名备案:防止在网上从事非法的网站经营活动,打击不良互联网信息的传播,一般在云厂商处即可进行实名认证并备案
    3. 修改配置:
      1. 清空原有的/etc/hosts 主机表
      2. 配置/etc/resolv.conf中nameservers为公共DNS,内部主机自划分域名级
      3. 迁移原配置,通过控制台添加解析记录即可
  4. 开放外部用户访问

公司内网主机域名系统配置完成,公司面向外网建设外部网站,方案?

  1. 租赁应该外网IP,并将其绑定到一台物理机上,专用于外部用户访问门户网站
  2. 将www.example.com解析到外网IP,并发布公网路由用于外部用户访问

自建DNS服务器

  1. 问题引入——自定义域名系统:
    • 域名系统非常好用,但是当公司内网的所有主机域名都向云厂商购买,那么每次解析也得去公网获取,效率低下
    • 外部用户可以看到公司内网IP地址,容易被hacker攻击
    • 云厂商权威DNS容易出故障,影响用户体验
    • 不妨公司内部自定义DNS,其架设可以仿照上述域名系统设定,以公司域名example.com为自定义DNS系统的根域名服务器,以子公司/部门为域名分级命名
  2. 域名解析流程(迭代查询)——自定义域名查询流程

image.png
自定义的DNS系统可以仿照上述流程设计域名解析

  1. DNS记录类型及示例

image.png
屏幕截图 2023-08-08 200828.png

  1. 企业选择自建DNS系统通常会选择 权威DNS
  2. 常见的开源DNS:bind、nsd、knot、coredns
  3. 常用DNS指令/请求
    • DNS Query——查询
    • DNS Response——响应
    • DNS Update——更新域名->ip
    • DNS Notify——通知(当有更新时)
    • DNS XFR——获取最新信息

HTTPS协议

  1. 问题产生(HTTP明文传输 易篡改带来的问题)
    • 页面出现百页/出现某些奇怪的东西
    • 返回了403的页面
    • 搜索不了东西
    • 页面弹窗广告
    • ······
  2. 常见加密
    • 对称加密:同一个秘钥加解密
    • 非对称加密:公钥加密,私钥解密,RSA

image.pngimage.png

  1. SSL通信过程

屏幕截图 2023-08-08 203309.png

  1. 证书链

针对Server端发送的证书链,Client端需要做以下验证

  • 是否是可信机构颁布
  • 域名是否与实际访问一致
  • 检查数字签名是否一致
  • 检查证书的有效期
  • 检查证书的撤回状态

Server端获取证书链时,会将证书摘要(指纹)用私钥进行加密获得签名,然后把加密后的签名连同公钥一起发给Client,Client使用公钥解密签名,正常解密说明传输没有问题(证书主要作用就是确保传输的公钥可信),然后再使用公钥加密预主密钥

接入全站加速

  1. 问题引入

外网用户访问站点(网站)可能会出现以下问题

  • 源站容量低,可承载的并发请求数低,容易被打垮
  • 报文经过的网络设备越多,出问题的概率越大,丢包、劫持、MTU问题
  • 自主选路网络链路长,时延高
  1. 全站加速=静态加速(CDN)+动态加速(DCDN)
    1. 源站容量问题——增加后端机器扩容;静态内容使用静态加速缓存
    2. 网络传输问题——动态加速
  2. 静态加速(CDN)
    1. 过程:Client通过DNS查询获得最近cdn节点IP地址,向其发起请求(静态资源),cdn节点若没有该缓存,则由cdn节点向源服务器发起请求,并将结果缓存,以便下一次使用;若有该缓存,则由cdn节点向Client发送数据
    2. 优点:
      • 解决了服务器端的“第一公里”问题(请求的响应尽可能优化在靠近Client的节点上,缩短网络传输链路)
      • 缓解甚至消除了不同运营商之间互联的瓶颈造成的影响(数据量较大时,在数据中心进行交换会很容易出问题?)
      • 减轻了各省的出口带宽压力(cdn节点通常离Client端很近,可以不用每次同样的请求都出省访问)
      • 优化了网上热点内容的分布
  3. 动态加速(DCDN)
    1. 内容:针对POST等非静态请求(不能再用户边缘缓存的业务),基于智能选路技术,从众多回源线路中择优选择一条线路进行传输
    2. 过程:
      • Client发起动态请求
      • 智能选择性能和稳定性最优路径(检测DCDN节点)
      • 动态请求通过最优路径快速回源
    3. 使用效果

image.png

四层负载均衡

  1. 问题引入

公司越做越大,提供的服务越来越多,用户越来越多,因此内部需要更多的后端服务器一起响应。
但是有两个问题,首先,公网IP地址有限,不可能一个后端服务器一个公网IP;其次,各服务器的负载有限,如何控制各个服务器处理的请求在负载能力内。
简单了解负载均衡

  1. 四层负载均衡——原理
    1. 基于IP+端口,实现扩展多个后端服务器(NAT)
    2. 利用某种算法将报文转发给某个后端服务器,实现负载均衡地落在后端服务器上
  2. 四层负载均衡——功能
    1. 解耦vip(虚拟服务IP——公网IP)和rs(实际服务器)(NAT复用内部IP地址)
    2. 负载均衡
    3. 防攻击:使用syn proxy 可以防止部分攻击
  3. 常见的调度算法(负载均衡)
    • RR(Round Robin)轮询:将所有的请求平均分配给每一个真实服务器RS
    • 加权RR(Round Robin)轮询:给每一个真实服务器RS一个权值比例,将请求按比例分配
    • 最小连接:把新的连接请求分配到当前连接数最小的服务器
    • 五元组hash:根据sip、sport、proto、dip、dport(两源+协议+两目的)对静态分配做散列取模,散列取模后,所有结果保存在hash环上面。缺点:当后端某个服务器故障后,所有的连接都重新计算,影响整个hash环。
    • 一致性hash:只影响故障服务器上的连接session,其余服务器上的连接不受影响

一致性hahs算法

  1. 四层负载均衡——常见实现方式FULLNAT
    1. 如下所示,用户、负载均衡器、真实服务器处于三个网段中,流程如下

屏幕截图 2023-08-09 162228.png

  1. 四层负载均衡特点
    • 大部分都是通过dpdk技术实现,该技术成熟,大厂都在用
    • 纯用户态协议栈,kernel bypass,消除了协议栈瓶颈
    • 无缓存,零拷贝,大页内存(减少了cache miss)
    • 仅针对四层数据包转发(TCP/IP模型),小包转发可达限速,可承受高cps

七层负载均衡

  1. 问题引入

涉及到7层网络架构的相关配置需求,需要使用七层负载均衡

  1. Nginx
    1. Nginx是最灵活的高性能Web Server,是应用最广泛的7层反向代理
    2. 并发连接场景下,Nginx的内存使用比Apache低很多,每秒请求数量是Apache的很多倍
    3. Nginx 采用模块化设计,有较好的扩展性和可靠性
    4. Nginx 基于master/worker架构设计
    5. Nginx 支持热部署,可在线升级
    6. Nginx 支持不停机更新配置文件、更换日志文件、更新服务器二进制
    7. Nginx 使用较低的内存:1万个keep-alive连接模式下的非活动连接仅消耗2.5M内存
    8. Nginx 事件驱动:异步非阻塞模型、支持aio、mmap(内存映射)
  2. Nginx 内部架构

image.png

  1. Nginx 反向代理示意

image.png

  1. 事件驱动模型

image.png

  1. 异步非阻塞
    1. 传统服务器:一个线程/进程处理一个请求/连接,属于阻塞模型,依赖OS实现并发
    2. Nginx:一个线程/进程处理多个请求/连接,是异步非阻塞模型,减少OS进程切换

image.png

  1. 简单调优

image.png