这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
介绍网络的基本组件、各个组件的工作原理和运作方式以及常见的接入方式特点和使用的场景
经典问题:浏览器地址栏输入网页,到网页加载,经历了哪些过程?
- 域名解析
- TCP建连
- SSL握手
DNS -> TCP -> TLS -> HTTP请求
大厂有成熟的网络接入系统,帮助用户接入。
字节接入系统框架:
\
主要分为一下六个方面:
- 域名系统
- 自建DNS服务器
- HTTPS协议
- 接入全站加速
- 四层负载均衡
- 七层负载均衡
域名系统
Host模式 -> IP映射
原因:
- 流量和负载:用户规模越来越大,host文件大小也越来越大,文件分发会导致较大的网络流量与cpu负载
- 名称冲突:无法保证主机名称的唯一性,同名主机添加导致服务故障(需要人工判断域名是否唯一)
- 时效性:分发靠人工上传,时效性太差(本次修改还没有生效,下一次修改就已经触发了)
做法:
清空/etc/hosts
配置/etc/resolv.conf中nameservers为公共DNS迁移原配置,通过控制台添加解析记录
DNS
使用域名系统替换host文件
关于域名空间:
- 域名空间被组织成树形结构
- 域名空间通过划分zone的方式进行分层授权管理
- 全球公共域名空间仅对应一棵树
- 根域名服务器:查询起点
如何开放外部用户访问?
方案一:租赁一个外网ip,专用于外部用户访问网站,将www.example.com解析到此外网ip,再将该ip绑定到一台物理机上,并发布公网route,用户外部用户访问。
自建DNS服务器
为什么要自建DNS服务器?
- 内网域名解析也得出公网去获取,效率低下
- 外网能看到内网ip地址,容易被kacker攻击
- 云厂商权威DNS容易出故障,影响用户体验
- 扩大公司品牌技术影响力,使用自己的DNS系统
DNS查询过程:
客户端 -> 本地DNS服务器 -> DNS根服务器 -> 顶级域服务器 -> 权威服务器
linux命令查看DNS查询过程
dig ($domain) + trace
\
DNS记录类型
企业需要的是哪种DNS服务器?
权威DNS、(LocalDNS)可选
常见的开源DNS:bind、nsd、knot、coredns
以最常见的bind服务器为例:了解一下它的架构
用户向DNS发起DNS请求,服务器返回给用户Response。如果管理员发现有个记录需要进行更新,会给系统发送一个update指令,然后系统在更新后会把结果返回给控制器,也就是下发端,因为主从模式,master 更新后会主动notify,通知slave节点更新,slave节点发起请求,把更新信息拉取过来。
接入HTTPS协议
对称加密
相应的数据在传输的过程中是无意义的乱码,即使被第三方获取,在没有密钥的情况下也无法获得数据,保证了数据的安全性。
问题:密钥也需要传输过去,所以有可能密钥在传输过程被截获
解决方案:非对称加密:使用公钥和私钥
公钥是藏在证书里的,那么公钥确定就是可信的吗?会不会被劫持?
Client在收到Server发来的数字证书时会从浏览器或操作系统的CA证书来判断数字证书的真实性
\
接入全站加速
外网用户访问站点,一定是一帆风顺的吗?可能出现的问题有哪些?
- 源站容量低,可承载的并发请求数低,容易被打垮
- 报文经过的网络谁被越多,出问题的概率越大,丢包、劫持、mtu问题
- 自主选路网络链路长,时延高
用户反应:响应慢、卡顿!
解决方案:
源站容量问题:增加后端扩容;静态内容,使用静态加速缓存
网络传输问题:动态加速D CND
全站加速: 静态加速 + 动态加速
\
静态加速CND
针对静态文件传输,网络优化方式?
使用缓存,
通过将服务器上的静态内容,缓存到cdn节点上,无需再访问源站,达到加速效果,并减轻压力。
CDN,Content Delivery Network, 即内容分发网络。构建在现有网络基础上的「智能虚拟网络」,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络阻塞,提高用户的「访问响应速度」和「命中率」。
相关关键技术为「内容存储」和「分发技术」。
作用:
解决了服务端的“第一公里”的问题
缓解甚至消除了不同运营商之间互联的瓶颈造成的影响
减轻了各省的出口带宽压力
优化了网上热点内容的分布
动态加速DCND
针对POST等非静态请求等不能再用户边缘缓存的业务,基于「智能选路技术」,从众多回源线路中择优选择一条线路进行传输。
原理
越往中心,节点越少,算力越强,反之则反之。例子:卖水果
用户打开头条官网进行网页浏览是什么加速?
静态加速CDN + 动态加速DCDN
提交表格是动态加速,返回的html,css等用到了静态加速
4层负载均衡GW
在运营商处租用的100.1.2.3的公网IP,如何在企业内部使用最合理?
现状:直接找一个物理机,ifconfig将网卡配上这个ip,起server监听即可
问题:应用多,其多个server监听不同的端口即可
怎样尽可能充分利用和管理有限的公网ip资源
什么是4层负载均衡?
基于IP+端口,利用某种算法将报文转发给某个后端服务器,实现负载均衡地落到后端服务器上
三个主要功能:
- 解耦vip和rs (不再指向某一台物理机,而是灵活指向后端,使后端容量可以灵活扩缩容)
- NAT (不做请求的任何处理,而是把请求传递给后端,做一层流量代理)
- 防攻击:syn proxy (避免后端物理机暴露在公网)
常见的调度算法原理
RR轮询
加权RR轮询
最小连接
五元组hash
一致性hash
业界最常见的实现方式:FULLNAT
RS怎么知道真实的CIP
通过TCP option传输
特点:
大部分通过dpdk技术实现,技术成熟,大厂都在用
纯用户态协议栈,kernel bypass,消除协议栈瓶颈
无缓存,零拷贝,大页内存(减少cache miss)
仅针对4层数据包转发,小包转发可达到限速,可承受高cps
7层负载均衡 Nginx
提问:4层负载均衡对100.1.2.3只能bind一个80端口,而有多个外部站点需要使用,改如何解决?
换个文法:有一些7层负载均衡相关的需求配置,该怎么做?
SSL下载:业务侧使用http,用户需要用https访问
请求重定向:自动跳转toutiao.com -> www.toutiao.com
路由添加匹配策略:完全、前缀、正则
Header编辑
跨域支持
协议支持:websocket,quic,grpc
以上都要7层负载均衡实现
\
特点:
- 模块化设计,便于扩展和更好的可靠性
- 基于master/worker架构设计(master用于进程管理,进程退出重启,接受信号量/worker主要处理用户http报文的数据)
- 支持热部署;可在线升级
- 不停机更新配置文件
- 较低的内存消耗,1万个长连接模式下的非活动连接仅消耗2.5M内存
- 事件驱动:异步非阻塞模型、支持aio、mmap(内存映射)
内部架构(作为反向代理服务器)
应用层网关,有一个master进程和多个worker进程,每个worker进程可以响应多个用户请求。
Nginx为什么这么快,主要是引入了事件驱动模型。
事件驱动模型
每个消息有独立的处理模块
放网络编程中,就是异步非阻塞。
传统服务器:
一个进程/线程处理一个连接/请求(阻塞模型、依赖OS 实现并发)
Nginx:
一个进程/线程处理多个连接/请求(异步非阻塞模型,减少os进程切换)
Nginx简单调优
操作系统层面,优化内核网络参数
fs.filemax=99999 worker进程能打开的文件句柄数,开大一点并发文件数
net.ipv4.tcp_tw_reuse = 1允许timewait socket建立其他新的tcp连接,避免timewait连接数过多
net.ipv4.tcp_keepalive_time = 600 表示keepalive连接的时间调小一点,清理无效的tcp连接
net.ipv4.tcp_max_tw_buckets = 5000 tcp主动断连
服务开发前期,如何低成本让别人访问自己的服务?
Ngrok
用github账户授权登录即可使用