课程目标
- 系统的熟悉和学习到企业级网络接入核心组件及基本原理
- 了解从输入网页到内容加载出来
- 从零搭建自己的网站和博客
- 当访问服务出现问题时,可以针对性故障分析与解决
01.接入问题引入
1.1 输入www.toutiao.com到网页加载出来,都经历了什么?
- 域名解析
- TCP建立连接
- SSL握手
- ……
graph LR
DNS-->TCP-->TLS-->HTTP请求
1.2 字节接入框架
02.企业接入升级打怪之路
- 域名系统
- 自建DNS服务器
- HTTPS协议
- 接入全站加速
- 四层负载均衡
- 七层负载均衡
2.1 使用域名系统
2.1.1 HOST管理
- 公司维护 /etc/hosts主机表
- 随着规模增加,遇到如下问题:
- 流量和负载:用户增长、文件越来越大
- 名称冲突
- 时效性:分发靠人工上传,时效性太差
2.1.2 使用域名系统
使用域名系统替换hosts文件
关于域名空间:
- 结构为树型
- 通过划分zone的方式进行分层授权
- 全球公共域名空间仅对应一棵树
- 查询起点:根域名服务器
- 域名组成格式:[a-zA-Z0-9_-],以点划分label
2.1.3 域名购买与配置迁移
- 购买二级域名
- 域名备案
- 修改配置:
- 清空/etc/hosts
- 配置/etc/resolv.conf中的nameservers为公共DNS
- 迁移原配置,通过控制台添加解析记录即可
2.1.4 如何开放外部用户访问
方案:租赁一个外网ip,将公司主页解析到外网ip,将ip绑定到一台物理机上,并发布公网route,用于外部用户访问。
2.2 自建DNS服务器
2.2.1问题背景
- 内网域名的解析也得出公网去获取,效率低下
- 外部用户看得到内网ip,容易被攻击
- 云厂商DNS容易出故障,影响用户体验
- 持续扩大公司品牌技术影响力,使用自己的DNS系统
2.2.2 DNS查询过程
略
2.2.3 DNS记录类型
- A/AAAA:IP指向记录,用于指向IP,前者为ipv4、后者为ipv6
- CNAME:别名记录
- TXT:文本记录
- MX:邮件交换机路
- NS:解析服务器记录
- SOA:起始授权机构记录
2.2.4 权威DNS系统架构
思考:站在企业的角度思考,我们需要的是哪种DNS服务器?
答案:权威DNS、LocalDNS
常见开源DNS:bind、nsd、knot、coredns
bind:
- query
- response
- update
- notify
- XFR 拉取变更
2.2.5 权威DNS系统架构
- 用户向local DNS请求
- 用户向公司权威DNS服务器请求
- 访问到公司服务
2.3 接入https协议
问题背景
- 页面出现白页、奇怪的东西
- 返回了403
- 搜索不了东西
- 弹窗广告
- 搜索后被大数据了
原因:使用了http明文传输,内容被运营商篡改和获取
2.3.2 对称加密和非对称加密
常见加密算法:
- 对称加密:一份密钥
- 非对称加密:公钥和私钥
- RSA算法
2.3.3 SSL的通信过程
- client random
- server random
- premaster secret
- 加密算法协商
- 生成对称密钥 session key
2.3.4 证书链
-
server端发送是带签名的证书链
-
client收到后需要验证
- 是否可信机构颁布
- 域名与访问是否一致
- 数字签名是否一致
- 证书的有效期
- 证书撤回状态
-
查找证书链指纹(摘要信息)
-
加密指纹得到数字签名
-
服务器将上次CA公钥解密
2.3.5 使用https
略
2.4 接入全站加速
2.4.1问题背景
外网访问站点可能会出现什么问题?
- 源站容量低,可承载的并发请求数低,容易被打垮
- 报文经过的网络设备多,出问题概率大。如丢包、劫持、MTU
- 自主选网络链路长,时延高
2.4.2 解决问题
- 源站容量问题
- 增加后端机器
- 静态扩容,使用静态加速缓存
- 网络传输问题
- 动态加速DCDN
- 全站加速
- 静态加速
- 动态加速
2.4.3 静态加速CDN
针对静态文件传输,网络优化方式?
-
缓存
-
客户端连接cdn节点
-
智能调整DNS
优势:
- 解决服务器端的第一公里问题
- 缓解甚至消除了不同运营商之间的互联的瓶颈造成的影响
- 减轻了各省的出口带宽压力
- 优化了网上热点内容的分布
2.4.4 动态加速 DCDN
- 动态内容无法缓存
- 采用智能选路技术
2.4.5 DCDN原理
略
2.4.6 使用全站加速
- 注册抖音:动态
- 点开某个视频:静态加速
- 用户打开官网:动态加静态
2.5 四层负载均衡
2.5.1 运营商处租用的公网ip,如何使用最合理
- 现状:直接找一个物理机,将网卡配上这个ip,起server监听即可
- 多个应用起多个监听端口即可
- 使用多个ip
怎样尽可能充分利用和管理公网ip资源?
2.5.2 什么是4层负载均衡
基于IP+端口,利用某种算法将报文转发给某个后端服务器,实现负载均衡地落到后端服务器上。
三个主要功能:
- 解耦vip(虚拟ip,用户使用服务的入口)和rs(real server)
- NAT
- 防攻击: syn proxy
2.5.3 常见的调度算法原理
- RR轮询:平均分配每个真实RS
- 加权RR轮询:给每一个RS一个比例,按比例分配
- 最小连接:分配到连接数最小的服务器
- 五元组hash
- 缺点:某个服务器故障后,所有连接重新计算
- 一致性hash
- 只影响故障服务器上的连接session
2.5.4 常见的实现方法fullnat
提问:RS怎么知道真实的CIP
- 通过TCP option字段传递
- 再通过特殊的内核模块进行反解
2.5.5 4层负载均衡特点
- 大部分使用dpdk
- 纯用户态协议栈,kernel bypass,消除协议栈瓶颈
- 无缓存、零拷贝、大页内存,减少cache miss
- 仅针对4层数据包转发,小包转发可达到限速,可承受高cps(高并发)
2.5.6 使用4层负载均衡
略
2.6 7层负载均衡
2.6.1问题背景
提问:四层负载只能bind一个80端口,而有多个外部站点使用,如何解决?
有一些7层相关的配置需求,该如何做?
- SSL卸载
- 请求重定向
- 路由添加匹配策略
- header编辑
- 跨域支持
- 协议支持:websocket、grpc、quic
2.6.2 Nginx 简介
- 最灵活的高性能web server,应用最广的7层反向代理
- 模块化设计,易于扩展
- 基于master/worker架构设计
- 支持热部署,可在线升级
- 不停机更新配置文件、更换日志文件、更新服务器二进制
- 较低的内存消耗
- 事件驱动:异步非阻塞模型、支持aio、mmap(内存映射)
2.6.4 Nginx反向代理示意图
代理服务器功能
- keepalive
- 访问日志
- url rewrite
- 路径别名
- 基于ip的用户的访问控制
- 限速及并发连接数控制
- ……
2.6.5 Nginx内部架构
2.6.6 事件驱动模型
- 将各种网络事件当做独立的时间处理
2.6.7 异步非阻塞
- 传统服务器
- 一个进程处理一个连接、请求
- 阻塞模型
- 依赖OS实现并发
- Nginx
- 一个进程处理多个连接
- 异步非阻塞模型
- 减少OS进程切换
2.6.8 Nginx简单调优
-
优化内核网络参数
- timewait_reuse
- 增大filemax
- 减小keepalive
- 主动断连时间缩小
- ……
-
提升CPU使用效率
-
合适的worker进程数
- worker进程数=CPU核数
-
CPU亲和
- 每个worker绑定一个CPU核,提升缓存命中率
-
减少CPU开销
-
-
提高网络效率
-
连接复用
- 减少upstream
-
使用cache
- 超时时间对业务的影响
-
gzip压缩
- 会增加cpu开销,需平衡使用
-
开启proxy_buffering
-
谨慎设置proxy_buffer大小,促进磁盘IO读写
-
-
2.6.10 使用7层负载均衡
03.动手实践
3.1 DNS服务器搭建
略
3.2 四层负载均衡使用含
- LVS+keepalived
- Nginx stram
3.3 7层负载均衡实验
略