Class 5-1:打开抖音互联网会发生什么 - TCP/IP, 计算机网络
课前准备:Linux操作系统、Wireshark软件(抓包)、Socket网络编程开发环境
打开抖音:
- 域名解析DNS
- 视频下载/HTTP
- 图片下载/HTTP
- 评论API/HTTP
刷抖音网络是怎么交互的
网络接入-互联网
手机接入互联网:终端 - 有线网络/路由器 - 运营商网络(移动/电信/联通)- 抖音服务器/美国网络(光缆)
网络接入 - 路由
同网段接入:中转设备 - 交换机
SDN: 软件虚拟化
跨网段配置路由:网关,两种方式,to 10.0.1.1/24 via 10.0.0.254或者default via 10.0.0.254
路由不一定是对称的
路由是工作在哪一层协议:IP层,但也可能涉及其他层,例如传输层
路由是改的IP地址吗?不是,改的是mac地址,找到发包口
先找路由 - 修改mac地址(dst_mac & 原mac)- 发包
void send_one_pkt()
{
rt = find_rt(dst) //包含主机出口网口&Nexthop
...
l2->dst_mac = rt->next_hop->mac //怎么获取路由的mac?
p = append(p, l2)
...
send(p, rt->port) //发包需要指定网卡,port指网卡的port
}
找到下一跳:ARP协议
- 逻辑同网段才能发送ARP
- ARP请求广播,ARP应答单播
- 免费ARP:提前判定是否有冲突
- ARP代理:有一个代理,抢先应答
IP协议:
- 唯一标识,互联网通用
- MAC地址不能代替IP地址吗?不能,MAC为基于以太网的二层协议,有时候有些二层协议不支持以太网。向下兼容问题,将所有二层协议向上封装,统一用IP地址标识。
- IPv4不够用,如何解决?IPv6扩充/NAT
NAT: 内部用户通过NAT设备,例如路由,有一个内部IP地址,但是向互联网连接的外部地址是唯一的,可以节约IP地址
NAT改变了IP+端口
class5-2:网络传输
网络传输-数据包:分层
获取数据,并按层封装
-
先请求DNS(域名):递归迭代,先请求根 客户端发送www.douyin.com: .com - douyin.com - www.douyin.com
-
DNS传输协议:UDP
UDP的问题:如何保证协议可靠:发包量,怎么避免分片,如何知道没有丢包?如何权衡传输效率和质量
- TCP传输三次握手
即使没有网线,连接在判活之前是不会断的,即系统默认还和对方保持连接,直到某一次发包测试,没有获得包反馈,连接断开
TCP的OPTION: 在三次握手有交互
方法:Tcpdump(抓包) + Wireshark(包分析)
- TCP传输
sequence number:发送方package的数据部分第一位应该在整个data stream中所在的位置
acknowledge number:期望的接收方下一次sequence number
SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq加1,而ACK传输不会让下一次传输的packet加1
eg. 第一次握手:Seq = 0,Ack = 0
第二次握手:Seq = 0, Ack = 1 // 期望值+1
第三次握手:Seq = 1, Ack = 1 // 实际值+1
数据传输:Seq = 1, Ack = 1
数据传输:Seq = 1, Ack = 726 //数据传输一次,Ack+1
Timewait:timewait recycle/timewait reuse
滑动窗口/流量控制:滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。
滑动窗口概念不仅存在于数据链路层,也存在于传输层,两者有不同的协议,但基本原理是相近的。其中一个重要区别是,一个是针对于帧的传送,另一个是字节数据的传送。
HTTP/HTTP1.1: 基于TCP的特定语言,多加了一层规矩
HTTPS: SSL/TLS握手:加密传输,解密后仍是HTTP。对称加密/非对称加密,通过第三方CA认证非对称加密(公钥/证书)。
class5-3:刷抖音为什么又快又稳(网络提速/网络稳定)
网络提速 - HTTP2.0
多路复用/stream:多图并发下载场景
问题:队头阻塞
网络提速 - QUIC/HTTP3.0
基于UDP,方便推广/兼容性高
基于Userspace实现:方便推广
0 RTT:天然支持HTTPS协议,降低SLL握手
弱网传输优势:解决网络环境较差时丢包导致的队头阻塞问题
网络路径优化:数据中心分布:同运营商访问
核心机房/汇聚机房-POP接入(和外网/运营商交互的小型机房)/边缘机房(靠近用户)
网络提速:
- 静态资源(图片视频)路径优化(CDN)
边缘机房:缓存
- 动态API(播放/评论接口)路径优化(DSA)
网络延时探测,得到遍历表,找到最优路径
class5-4:网络稳定
容灾:故障发生/故障感知/自动切换/服务恢复
- 容灾案例1:除了专线连接外,预留外网路线容灾
- 容灾案例2:调度容灾 - 全局容灾系统,假设A机房不可用,全局统筹资源(探测故障,探测B机房足够承载流量,切换A到B),解析到B机房,但需要保持B机房有足够容量,避免雪崩
- 容灾案例3:SDK云到端,通过云控,假设端口有问题,自动切换到云端,弊端1:云端权限等需要用户授权,弊端2:web中可能没有SDK,不支持云端
- 容灾案例4:CDN缓存,针对静态资源,做降级,前置兜底逻辑/cache文件,假设此时网络不佳,则展现上次缓存过的内容,降级显示
故障排查
- 故障明确:沟通,具体业务,接口故障,故障导致的问题,特例还是普遍,是否是修改导致的异常
- 故障止损:先止损再排查,用户体验第一,止损方法:组件容灾/系统容灾/降级
- 分段排查:客户端排查(客户端访问其他服务/其他客户端访问目标服务),服务端排查(服务端监控/指标/手动访问/分组件排查),中间链路排查(中间网络设备,包括交换机,路由器,网关LB,旁路DNS是否有问题)
网络故障排查常用命令
- dig查询DNS问题
- 网络接口排查:ping/telnet/nmap查询三层/四层连通性
- 中间链路:Traceroute排查
- 客户端:iptables,例如被防火墙挡掉
- 抓包:tcpdump,客户端和服务端各抓包,对比
网络故障排查案例
- 中间节点误判:客户端异常 -> 服务的自测正常 -> 网关转发异常 -> 健康检查异常
- 客户端问题:客户端个例报障,大多是客户端问题,例如用户防火墙
- 批量用户问题,物理隔断:安徽电信报障某app无法使用 -> 后端无问题,但安徽电信流量突降 -> 安徽电信客户端ping不通目标服务 -> 电缆被挖断
- debug抓包:某app故障 -> 后端服务器反馈服务正常 -> 网络转发设备异常 -> 抓包 -> 路由不对称 快速发包默认路由是对称的,但实际不对称,导致丢包
故障预防
- 监控报警
- 故障演练/预案
- 故障降级/止损