引子:刷抖音时都涉及到了哪些协议
- 域名解析 DNS
- 视频下载 HTTP
- 图片下载 HTTP
- 评论 API/HTTP
刷抖音网络时怎么交互的
- 网络接入
- 网络传输
1.1 网络接入-互联网
-
中国网络通过光缆连接美国网络
-
问题基本出现在 last mile
1.2网络接入-路由
-
同网段主机(子网掩码与网络号一致):早期通过集线器,现在通过交换机与逻辑交换机(ip层)连接
-
SDN:软件定义网络 ,使用两个交换机将两个局域网连接成一个局域网。
- Underlay:指的是物理网络,它由物理设备和物理链路组成。常见的物理设备有交换机、路由器、防火墙、负载均衡、入侵检测、行为管理等,这些设备通过特定的链路连接起来形成了一个传统的物理网络,这样的物理网络,我们称之为UnderLay网络。
- Overlay:是一种隧道技术,VXLAN,NVGRE及STT是典型的三种隧道技术,它们都是通过隧道技术实现大二层网络。将原生态的二层数据帧报文进行封装后在通过隧道进行传输。总之,通过OverLay技术,我们在对物理网络不做任何改造的情况下,通过隧道技术在现有的物理网络上创建了一个或多个逻辑网络即虚拟网络,有效解决了物理数据中心,尤其是云数据中心存在的诸多问题,实现了数据中心的自动化和智能化。
-
不同网段的主机:通过路由进行连接
- 采用最长前缀匹配,若找不到,则使用default指向网关
- 路由不一定是对称的,通讯可能选择不同的路径。
- 路由一般被认为工作在IP层(网络层),实际上路由协议如OSPF属于传输层的协议。
-
路由改的不是IP地址,改的是mac地址(源mac和目标mac都会改变),目标IP是不变的。实际上通过ARP查找下一条的mac。
-
发包需要指定网卡port:发包是以网卡为单位的。
-
动态路由BGP、OSPF
1.3 网络接入-ARP协议
- 逻辑同网段才能发送ARP(广播不能跨网段)
- ARP请求广播,ARP应答单播
- 免费ARP:不需要请求就进行ARP应答,如新加入网络的设备。
- 可以提高网络的效率
- 可以防止IP冲突
- ARP代理:存所有IP与MAC的地方,可以做中介设备,扩充边界。
- ARP本质是查找下一跳的MAC,不是找目标地址的MAC。
1.4 网络接入-IP协议
- 唯一标识,互联网通用
为什么MAC地址不能代替IP地址?
- MAC难记,且可重复
- MAC协议属于二层协议,而二层协议不仅仅只有MAC协议。为了联通不支持MAC协议的网络,便将不同的二层网络进行封装成IP。
1.5 网络接入-NAT
- 内部局域网内的多个主机,共用一个公网IP。
- NAT不仅改变了IP地址,还改变了端口。一个端口是内网主机的一个映射。
1.6 网络传输-数据包
-
可以通过wireshark进行抓包来研究
-
数据包是按网络层来进行封装的
-
大部分网络都在上图中间的小箭头处发生
1.7 网络传输-先请求DNS
- DNS请求是递归的
1.8 网络传输-DNS的传输协议UDP
-
想发什么包,就分配一个UDP的头,把payload里面塞数据发出去即可
-
为什么分片:因为MTU有限制
-
为什么避免分片:因为分片和重组需要消耗计算机资源
-
如何知道没有丢包:UDP无法知道是否丢包
-
UDP设计重点:如何权衡效率与可靠
1.9 网络传输-TCP三次握手
拔了网线,TCP连接会断吗?
不会,TCP连接本身和网络状态无关,除非设计了心跳包、心跳保活、keep alive等机制。
三次握手做了什么事情?
-
确认双方发送与接收的正常。
-
同步序列号
-
如何确认TCP分段传输正常? - 通过MSS字段::除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度 - MSS是通过三次握手确认的 - MTU = IP头部 + TCP头部 + MSS - 通过TCP中的option字段,选取双方最小的MSS。
-
sequence number:我方这个packet的数据部分再整个data stream中所在的位置
-
acknowledge number:期望对方的下一次sequence number 是多少
-
SYN/FIN的传输没有data,但会使得seq加一,但是ACK的传输不会让下一次的packet加一。
Timewait 是什么?
- 等待两倍报文段寿命
- 保证连接正常关闭,防止前一次的ack丢失
- 实际使用上会使用timewait reuse和recycle来减少timewait
丢包怎么办
ack机制,数据重传。
滑动窗口
略
流量控制/拥塞控制
略
1.10 网络传输-HTTP/HTTP1.1
为什么不直接使用TCP通信?
-
TCP负责的内容够多了
-
兼容传输层协议
-
其实HTTP只是多加了层规则,HTTP依然使用的是TCP,只是这个规则用户更清晰
HTTP1.1做了哪些优化?
- 长连接:不需要每次传输数据都进行一个新的连接
- 部分传输
- HOST
- 缓存
- ……
1.11网络传输-HTTPS
-
HTTPS解密出来依然是HTTP
-
HTTPS : HTTP over STL
-
STL:包含非对称加密与对称加密部分。
- 连接与传输密钥使用非对称加密算法
- 传输数据使用对称加密算法
-
流程:
-
客户端发送反问请求(包含第一个随机数)
-
服务端返回公钥(证书)(包含第二个随机数)
-
客户端向第三方CA认证公钥
-
进行传输(客户端使用第一个随机数与第二个随机数生成第三个随机数)
-
服务端通过三个随机数生成对称密钥
-
2.1 网络提速-HTTP2.0
- 支持多路复用:如网络相册同时下载多个相片
- 并行请求
- 并行响应
- 可以同时开启多个tcp
2.2网络提速-怎么理解多路复用/stream
-
采用单个TCP链接传输
-
如果tcp发生丢包会发生队头阻塞,无法进行多路复用。
-
优化多路复用:tcp的sack可以指定重发的包,但是本身解决不了丢包导致的阻塞问题。
-
在传输层上,stream也是串行的,因为速率很快,可在应用层视为串行。
2.3 网络提速-QUIC/HTTP3.0
-
可以解决队头阻塞问题
-
使用了UDP协议
-
为什么不能直接改TCP协议?
- 许多系统上TCP协议不可修改,需要考虑兼容
-
在userspace层面上实现,避免kernel层的兼容问题
-
0 RTT(时延)
-
弱网优势
2.4 网络提速-数据中心分布
-
路径优化算法: CDN 、P2P、蚁群算法、遗传算法、DSA动态加速……
-
同运营商访问:电信用户访问电信网络内的服务器,移动访问移动的。
-
静态资源(图片视频)路径优化(CDN),做缓存
-
动态API(播放/评论接口)路径优化(DSA),寻找最近的机房。
2.8 网络稳定-容灾概念
graph LR
故障发生-->故障感知-->自动切换-->服务恢复
2.8.1 网络容灾难实例一
- 专线:联通内部不同机房的专用网线
- 当专线挂了,切换到外网连接
2.8.2 网络容栽灾实例二
- 前提:拥有多个服务器,客户端url解析出多个ip
- 客户端自动去除不可达ip (GTM系统)
- A服务器挂掉时,B服务器接受其他用户前先检测是否可以容下A的所有流量与用户。防止雪崩
2.8.3 网络容栽灾实例三
- 使用云控:主动降级/容灾
- 弊端:云控本身宕机、用户不开放操作权限、web页面不好做容灾(如切换不了新域名)
2.8.4网络容栽灾实例四
- bug导致全部crash:前置兜底逻辑/cache文件
没有容灾怎么排查?
graph LR
故障明确-->故障止损-->分段排查
2.10网络稳定-故障明确
出现什么故障? -> 沟通是前提
- 什么业务?什么接口?(哪里出故障)
- 故障体现在哪里?(出了什么故障)
- 访问其他目标是否正常?(是否客户端本身故障)
- 是否是修改导致的异常?(是否新版本本身故障)
2.11网络稳定-故障止损
-
先止损在排查
- 用户体验第一
- 对公司收入的影响是按照分钟甚至秒来计算
-
如何止损
-
组件没有容灾,但是系统有没有
-
降级
-
2.12 网络稳定-分段排查
- 客户端排查
- 客户端访问其他服务有无问题
- 其他客户的访问目标服务有无问题
- 服务端排查
- 服务端监控、指标正常吗?
- 手动访问正常吗?
- 分组件排查
- 中间链路排查
- 服务端和客户端确保没问题
- 中间网络设备有无问题?
- 旁路DNS有无问题
2.13网络稳定-网络故障排查常用指令
-
dig查询DNS
-
ping/telnet/nmap查询三层、四层连通性
-
traceroute排查中间链路
-
iptables
-
tcpdump抓包
-
案例一:健康检测异常
graph LR
客户端异常-->服务端自测正常-->网关转发异常-->健康检测异常
-
案例二:典型单例客户端问题(经常发生)
- 用户防火墙设置问题
- 用户网络问题
-
案例三:某个运营商多个用户报故障(经常发生)
- 电缆被挖断
-
案例四:抓包排查故障
graph LR
某APP故障-->后端服务器反馈正常-->网络转发设备异常-->抓包-->路由不对称
2.14 网络稳定-故障预防很重要
- 监控报警
- 故障演练、预案
- 故障降级、止损
总结
- HTTP2提速
- QUIC、HTTP3提速
- 数据中心提速
- 路径提速
- 网络容灾
- 故障排查