计算机网络应用部署知识与抖音App基础网络优化方案 | 青训营

185 阅读6分钟

在刷抖音时,通过流量监视器查看基本上都能达到6-7MB/s。每天都有那么多的人在近乎同时刷抖音,为什么还那么流畅稳定?翻阅了相关材料后,这里我们做一个探讨:)

前置知识(计网)

路由

在使用Zerotier(一种P2P虚拟局域网搭建工具)等工具或者在进行网络分析时,经常会看到一个IP后面跟着一个斜杠“/”,如下图:

image.png 这其实是子网掩码,比如****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在掩码以内,则一般是同网段接入。同网段之间也是有路由的。

Untitled

跨交换机之间,也是可以组建一个虚拟的同网段的。详见Software-Defined Networking,SDN**。**这就是Zerotier这款软件的原理之一。

Untitled

跨网段之间如何通信?

需要用到交换机来定义路由。

比如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

image.png

数据包

image.png

网络传输

DNS

  1. 客户端发送www.douyin.com,递归解析器:本地host->本地DNS解析器缓存->本地DNS服务器->根服务器->(如果还找不到,就返回负责该顶级域名解析的服务器ip给本地DNS服务器)负责该顶级域名解析的服务器1->负责该顶级域名解析的服务器2->......

UDP

  1. DNS通过UDP发送。

Untitled

TCP

  • Seq:包的数据部分的第一位在整个data straeam的位置
  • Ack:期望对方下一次Seq的值。

SYN/FIN的传输虽然没有data,但是会让下一次传输的Seq+1。ACK的传输不会。

Timewait

丢包怎么办

滑动窗口结合基础概念

流量控制/拥塞控制

SSL/TLS

对称/非对称;公钥私钥

抖音App针对网络的优化方案

HTTP2.0

Untitled

HTTP2.0实现了多路复用,能够比1.1效率更快。

Untitled

QUIC/HTTP3.0

弱网传输优势。在弱网时,丢包可能性更大,一旦丢包HTTP2.0的大多数优化就没用了。

同运营商访问

在中国,跨运营商访问效率会比较差(互联网交换中心的瓶颈),因此如果提速可以根据解析的IP地址所属的运营商为用户提供同运营商访问。

CDN

针对静态资源(图片、视频),使用CDN会大大加速网页加载速度。相当于一个静态缓存系统。

DCDN

动态加速。DCDN 是 CDN 技术的进一步发展,特别针对动态内容的分发进行优化。传统的 CDN 主要用于缓存静态内容,如图片、视频、CSS 和 JavaScript 文件等。而 DCDN 更加注重缓存和传递动态内容,例如个性化的网页、实时生成的内容和动态数据库查询结果等。

DSA

对于动态数据,比如抖音的评论点赞数据,用CDN行不通,可以使用DSA路径优化。SDA技术通常涉及对数据包的路由和流量控制进行智能优化,以最大程度地减少延迟和丢包。

Untitled

容灾

**外网容灾:**当多机房通信走的专线不可用时,会走外网

调度容灾:

Untitled

当机房A不可用时,动态解析会在表中剔除掉这个机房的地址。(前提是B中的承载容量足够,防止雪崩)

**云控:**这个很容易想到。APP内部可以放一个SDK用于云控,当灾难发生时,可以做到切换访问域名等操作。

**灾难Cache:**当服务所在的机房Crash时,可以有一个专用服务来返回上一次查询得到的结果并返回回去。(兜底)

**故障止损:**灾难来临时比如洪水,可以尝试先关掉体验类的服务,如推荐系统,保证服务器正常运行。

Untitled

Untitled

自建DNS服务器

A记录:用于指向IPv4

AAAA记录:用于指向IPv6

TXT: 购买证书使用

MX:邮件交换

NS:解析服务器记录,用于指定哪台服务器对于该剧名解析

TTL:多久失效。失效后会从权威服务器处获取

第三方DNS服务器的缺点:

  1. 内网域名的解析也得出公网去获取
  2. 外部用户看得到内网IP地址,容易被攻击

4层负载均衡

基于IP+端口,利用某种算法将报文转发给某个后端的服务器,实现负载均衡地落到后端服务器。

  • 解耦VIP和rs
  • NAT
  • 防止攻击,如syn

常见调度算法:

  1. RR轮询:将所有地请求平均分给每个真实服务器RS
  2. 加权RR:加权的RR。
  3. 最小连接数
  4. FULLNAT(常见)