在刷抖音时,通过流量监视器查看基本上都能达到6-7MB/s。每天都有那么多的人在近乎同时刷抖音,为什么还那么流畅和稳定?翻阅了相关材料后,这里我们做一个探讨:)
前置知识(计网)
路由
在使用Zerotier(一种P2P虚拟局域网搭建工具)等工具或者在进行网络分析时,经常会看到一个IP后面跟着一个斜杠“/”,如下图:
这其实是子网掩码,比如****192.168.1.101/27,表示这个二进制掩码的前27位是1,后5位是0。本质上是192.168.1.101/255.255.255.224。****子网掩码(Subnet Mask)是用于划分IP地址的网络部分和主机部分的一个32位二进制数字。它与IP地址结合使用,用于确定IP地址的网络标识部分和主机标识部分。子网掩码的作用是告诉网络设备哪些位用于标识网络部分,哪些位用于标识主机部分。**在子网掩码中,用1表示网络部分,用0表示主机部分。计算机使用子网掩码与目标IP地址进行按位与&**运算,从而确定网络部分和主机部分。
e.g. 192.168.1.10和255.255.255.0
IP地址的二进制表示:11000000.10101000.00000001.00001010
子网掩码的二进制表示:11111111.11111111.11111111.00000000
按位与运算结果:11000000.10101000.00000001.00000000
这意味着"192.168.1.10"属于一个网络中的某个主机,该网络的网络地址是"192.168.1.0",而主机标识部分是"10"。
在大多数家用路由器中,我们经常会用192.168.1.1这个ip登入到路由器后台中,其实上面的结果可以解释为什么是这个ip。
跨网段是什么? "跨网段"(Cross-Subnet)是指在不同的子网之间进行通信或连接的情况。子网是将大型IP网络划分为更小、更易管理的网络段的方法。每个子网都有一个特定的IP地址范围。跨网段通信时,数据包必须通过路由器进行转发,以找到从源地址到目标地址的最佳路径。路由器根据其拥有的路由表,选择最适合的接口和下一跳来转发数据包,直到数据包到达目标子网,并被目标设备接收。
如何查看两个设备是否同网段?
用上面的方法。看按位与的结果是否相同,相同则为同网段。
如果IP在掩码以内,则一般是同网段接入。同网段之间也是有路由的。
跨交换机之间,也是可以组建一个虚拟的同网段的。详见Software-Defined Networking,SDN**。**这就是Zerotier这款软件的原理之一。
跨网段之间如何通信?
需要用到交换机来定义路由。
比如10.0.0.1/24发到10.0.1.1/24,中间需要用到路由。
to 10.0.0.1/24 via 10.0.0.254(网关)
// 或者配置默认路由
路由通过修改MAC地址来实现
ARP的本质上是查找下一跳的MAC,而不是IP地址。
NAT
数据包
网络传输
DNS
- 客户端发送www.douyin.com,递归解析器:本地host->本地DNS解析器缓存->本地DNS服务器->根服务器->(如果还找不到,就返回负责该顶级域名解析的服务器ip给本地DNS服务器)负责该顶级域名解析的服务器1->负责该顶级域名解析的服务器2->......
UDP
- DNS通过UDP发送。
TCP
- Seq:包的数据部分的第一位在整个data straeam的位置
- Ack:期望对方下一次Seq的值。
SYN/FIN的传输虽然没有data,但是会让下一次传输的Seq+1。ACK的传输不会。
Timewait
丢包怎么办
滑动窗口结合基础概念
流量控制/拥塞控制
SSL/TLS
对称/非对称;公钥私钥
抖音App针对网络的优化方案
HTTP2.0
HTTP2.0实现了多路复用,能够比1.1效率更快。
QUIC/HTTP3.0
弱网传输优势。在弱网时,丢包可能性更大,一旦丢包HTTP2.0的大多数优化就没用了。
同运营商访问
在中国,跨运营商访问效率会比较差(互联网交换中心的瓶颈),因此如果提速可以根据解析的IP地址所属的运营商为用户提供同运营商访问。
CDN
针对静态资源(图片、视频),使用CDN会大大加速网页加载速度。相当于一个静态缓存系统。
DCDN
动态加速。DCDN 是 CDN 技术的进一步发展,特别针对动态内容的分发进行优化。传统的 CDN 主要用于缓存静态内容,如图片、视频、CSS 和 JavaScript 文件等。而 DCDN 更加注重缓存和传递动态内容,例如个性化的网页、实时生成的内容和动态数据库查询结果等。
DSA
对于动态数据,比如抖音的评论点赞数据,用CDN行不通,可以使用DSA路径优化。SDA技术通常涉及对数据包的路由和流量控制进行智能优化,以最大程度地减少延迟和丢包。
容灾
**外网容灾:**当多机房通信走的专线不可用时,会走外网
调度容灾:
当机房A不可用时,动态解析会在表中剔除掉这个机房的地址。(前提是B中的承载容量足够,防止雪崩)
**云控:**这个很容易想到。APP内部可以放一个SDK用于云控,当灾难发生时,可以做到切换访问域名等操作。
**灾难Cache:**当服务所在的机房Crash时,可以有一个专用服务来返回上一次查询得到的结果并返回回去。(兜底)
**故障止损:**灾难来临时比如洪水,可以尝试先关掉体验类的服务,如推荐系统,保证服务器正常运行。
自建DNS服务器
A记录:用于指向IPv4
AAAA记录:用于指向IPv6
TXT: 购买证书使用
MX:邮件交换
NS:解析服务器记录,用于指定哪台服务器对于该剧名解析
TTL:多久失效。失效后会从权威服务器处获取
第三方DNS服务器的缺点:
- 内网域名的解析也得出公网去获取
- 外部用户看得到内网IP地址,容易被攻击
4层负载均衡
基于IP+端口,利用某种算法将报文转发给某个后端的服务器,实现负载均衡地落到后端服务器。
- 解耦VIP和rs
- NAT
- 防止攻击,如syn
常见调度算法:
- RR轮询:将所有地请求平均分给每个真实服务器RS
- 加权RR:加权的RR。
- 最小连接数
- FULLNAT(常见)