打开抖音会发生什么 | 豆包MarsCode AI刷题
课程目录
- 网络交互之网络接入
- 网络交互之网络传输
- 网络架构如何给抖音提质之网络提速
- 网络提速的优化之路
网络交互之网络接入
课程依赖:
- Linux操作系统
- Wireshark软件,抓包用
- Socket网络编程开发环境
打开抖音互联网会发生什么?——带你探索计算机网络
课程收益:
- 从事其他方向研发
- 从事网络相关研发
- 简历更新(熟悉TCP?IP、计算机网络)
- 协议分析(自学)
- 互联网应用泛解
- 协议基础/为什么会产生这些协议
课程目录
- 刷抖音网络是怎么交互的
- 刷抖音为什么又快又稳?
- 总结回顾
刷抖音网络是怎么交互的
- 网络交互
- 网络传输
网络接入-互联网
先让我的手机能够访问抖音服务器:
终端接入互联网,然后通过一些有线的网络接入运营商,电信联通等
电信联通一般与服务器机房直接联通,国外的运营商也会与我国运营商光缆联通
网络接入-路由
集线器,交换机,做出同网段
同网段希望有若干服务器
SDN软件定义网络:网络虚拟化,将多个交换机连接在一起,但是用的是同一个网络,属于同一个子网。同网段不一定指的是物理逻辑上的同一个交换机
跨网段接入:中间有一段路由
路由一定是对称的吗:从主机A到主机B可能能存在若干条路由路线,而主机A到主机B的路线与主机B到主机A走的路线不一定相同
路由在传输层基于TCP/IP工作
路由就是改的IP地址吗?只能操作改MAC地址。路由最终的目标不会变,是找到对应的主机,通过修改Mac地址,切换不同的网关,不断对目标主机进行寻找
发包为什么要指定网卡?发包的时候是以网卡为单位
动态路由BGP/OSPF
网络接入-ARP协议
怎样知道下一条的MAC地址?
- 逻辑同网段才能发送ARP
- ARP请求广播,ARP应答单播
- 免费ARP?ARP代理?
ARP协议就是起到在IP地址到对应的硬件地址之间提供映射作用的
- 当主机A和主机B不在同一网段时,主机A就会先向网关发出ARP请求,ARP请求报文中的目标IP地址为网关的IP地址
- 当主机A从收到的响应报文中获得网关的MAC地址后,将报文封装并发给网关
- 如果网关没有主机B的ARP表项,网关会广播ARP请求,目标IP地址为主机B的IP地址
- 当网关从收到的响应报文中获得主机B的MAC地址后,就可以将报文发给主机B
- 如果网关已经有主机B的ARP表项,网关直接把报文发给主机B。
网络接入-IP协议
唯一标识,互联网通用。客户端和服务端都有自己的IP
Mac地址不能替代IP地址,IP地址用于划分网段便于查找
IPv4不够用:
-
网络地址转换(NAT)
- 通过NAT技术,多个设备可以共享一个公共IPv4地址。家庭和企业网络使用NAT将内部设备的私有IP地址转换为一个公共IP地址进行外部通信。这大大减少了对公共IPv4地址的需求。
-
私有IP地址
- RFC 1918定义了一些私有IP地址范围,这些地址不能在互联网上直接路由。企业和家庭网络可以使用这些私有地址,进一步减少对公共IPv4地址的需求。
-
地址回收
- 随着网络的不断发展,一些老旧或不再使用的IPv4地址可以被回收并重新分配给新用户或设备。
网络接入-NAT
家里路由器是怎样上网的?
终端设备-SNAT服务器-防火墙-外部网络
防火墙内称内网,墙外为外网
多个内网客户端访问同一个目标地址+端口,源端口恰好一样,会随机跳动端口
网络交互之网络传输
网络打通了,怎么下载视频呢?
网络传输-数据包
可以使用Wireshark软件,抓包用
数据包的传输依赖封装,数据包在填充了数据之后,按层去封装,一般来说封装个几层
网络传输-数据包发送
跟接受是对应关系,客户端与服务端的交互,一般是用socket去发,也称之为用户空间
然后是传输层,TCP/UDP
然后是网络层,IP。TCP/IP构成内核网络协议栈
然后是数据链路层,内核驱动。内核驱动与内核网络协议栈构成内核空间
最后就到物理层,硬件上从源及其发送到目的机器
网络传输-请求DNS
-
DNS服务器怎么会知道每个域名的IP地址呢?答案是分级查询,这就涉及到每个域名的层级
- 仔细观察可以发现,域名
bilibili.com表示为bilibili.com.,在所有域名的尾部,都有一个根域名。换句话说,bilibili.com真正的域名是bilibili.com.root,简写为bilibili.com。因为根域名.root实际上对所有的域名都是一样的,所以平时是省略的 - 根域名的下一级叫顶级域名
tld,一般是.com或.net之类的形式。再下一级叫次级域名sld,如.bilibili,这是用户可以注册的。再下一级就是主机名host,比如a.w.bilicdn1.com.的a.w,这是用户在自己域里面为服务器自行分配的 - 域名层级结构:
host.sld.tld.root
- 仔细观察可以发现,域名
-
DNS服务器根据域名的层级进行分级查询,每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器
- “根域名服务器"的NS记录和IP地址一般不会变化,所以内置在DNS服务器内
- 从"根域名服务器"查到"顶级域名服务器"的NS记录和A记录(IP地址)
- 从"顶级域名服务器"查到"次级域名服务器"的NS记录和A记录(IP地址)
- 从"次级域名服务器"查出"主机名"的IP地址
网络传输-DNS的传输协议UDP
UDP本身相对简单,用好很难
想发什么包,就分配一个UDP的头,把payload里面塞数据发出去就好
UDP用好很难:
- 发包每次发多少?怎样避免分片?
- 怎样知道没丢包?
- 怎么权衡传输效率和质量?
怎么保证协议可靠?
网络传输-TCP三次握手
进行三次握手的目的是为了确认双方的接收能力和发送能力是否正常。
- 最开始的时候客户端和服务器都是处于CLOSED关闭状态。主动打开连接的为客户端,被动打开连接的是服务器
- 第一次握手: 客户端向服务器端发送报文 证明客户端的发送能力正常
- 第二次握手:服务器端接收到报文并向客户端发送报文 证明服务器端的接收能力、发送能力正常
- 第三次握手:客户端向服务器发送报文 证明客户端的接收能力正常
- 第三次握手是为了保证,不会出现情况"来自客户端的已经失效的连接请求报文突然又抵达服务器"
建立TCP连接需要三次握手,终止TCP连接需要四次挥手
网络传输-TCP传输
拔了网线,连接也不会断开。TCP的本质是一种状态,双方保持连接就可以一直保持
- sequence number:表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data stream中所在的位置
- acknowledge number:表示的是期望的对方(接收方)的下一次sequence number的值是多少。
- SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq增加1,但是,ACK的传输,不会让下一次的传输packet加1
TCO有限状态机:
- Timewait?
- 丢包?
- 滑动窗口在结合基础概念去理解
- 流量控制/拥塞控制结合基础概念去理解
网络传输-HTTP/HTTP1.1
HTTP依然是TCP,只是HTTP多加了一层规矩,这个规矩让用户更清晰,更简洁
HTTP1.1优化:
- 长连接
- 部分传输
- HOST
- 缓存
网络传输-HTTPS
HTTPS解密出来依然是HTTP
SSL协议,双方共持解密
网络传输-SSL/TSL握手
对称加密和非对称加密
确保没有劫持,也确保私钥不泄密
网络架构如何给抖音提质
网络提速-HTTP2.0
同时请求,并行响应,极大节约时间,在一个TCP连接上跑多个HTTP
网络提速-怎么理解多路复用/stream
单个TCP链接传输
如果TCP丢包怎么办?
队头阻塞:如果我丢了一个包并一直保持重传,其他的包就卡住了,无法进行传输
网络提速-QUIC/HTTP3.0
TCP/UDP?
- 解决队头阻塞问题,如果针对TCP协议做优化,牵一发而动全身,直接改动所有的协议栈,写死在主机上的最好还是不改动,所以采用UDP方案
Kernel or Userspace
0 RTT
- QUIC协议天然支持HTTPS类似协议,它里面自带加密
- 类似session共享,后续不需要使用RTT去传输
弱网优势
- 弱网环境下原TCP容易丢包,直接造成队头阻塞
- 依赖弱网优势去解决
网络提速-数据中心分布
分布式存贮数据,在分布式服务器上提前把核心机房的数据下载下来,然后终端依赖路由直接在分布式服务器上请求数据,分布式服务器上没有再从核心机房下载
网络提速-同运营商访问
移动的运营商访问基于移动的机房,电信的访问电信的
跨运营商,网速大大降低,丢包概率大增
网络提速-静态组员(图片视频)路径优化(CDN)
核心机房-汇聚机房-边缘机房
换句话就是个静态缓存系统
但有时候可能存在动态数据问题
网络提速-动态API(播放/评论接口)路径优化(DSA)
有时候可能各个机房缓存的数据不同,用户看到的内容也不尽相同,这里就涉及多个机房之间的路径最优检索
针对每个机房进行探测,做成一张表,得到算法支撑
网络提速的优化之路
如何提升稳定性?
网络稳定-容灾概念
- 故障发生
- 故障感知
- 自动切换
- 服务恢复
网络容灾具体案例:
- 多个机房之间自有拉线连接,就不必规划机房之间的路由。同时,如果专线挂了,也可以直接走外网
- 全局容灾系统:如果机房不可用,原本的A记录自动解析到另一个机房,实现自动化跳转
- 云到端 -> 主动降级/容灾,如果有一个机房不可用了,自动通知到终端,不允许访问受灾机房
- 缓存:Bug导致全crash -> 前置兜底逻辑/cache文件
网络稳定-故障排查
如果没有容灾,怎样找到问题所在呢?
- 故障明确
- 故障止损
- 分段排查
网络稳定-故障明确
出现什么故障? -> 沟通是前提
- 什么业务?什么接口故障?
- 故障体现在哪里?
- 访问其他目标是否正常?
- 是否是修改导致的异常?
不要小问题酿成大问题
网络稳定-故障止损
先止损再排查:
- 用户体验第一
- 对公司收入的影响是按照分钟甚至秒来计算
如何止损:
- 组件没有容灾,但是系统有没有?
- 降级
网络稳定-分段排查
客户端排查:
- 客户端访问其他服务没问题吗?
- 其他客户端访问目标服务没问题吗?
服务端排查:
- 服务端监控/指标都正常吗?
- 手动访问一下正常吗?
- 分组件排查
中间链路排查:
- 服务端跟客户端确保都没问题
- 中间网络设备有没有问题?(交换机/路由器/网关LB)
- 旁路的DNS有没有问题?
网络稳定-网络故障排查常用命令
ping(检测网络连通性)
ipconfig(IP地址、子网掩码和缺省网关)
arp(根据IP地址获取MAC地址)
traceroute(显示数据包到达目的主机所经过的路径)
route(用来显示、人工添加和修改路由表项目)
nslookup(查询任何一台机器的IP地址和其对应的域名)
nbtstat(查看计算机上网络配置的一些信息,也可以查找出别人计算机上一些私人信息)
telnet(检测某个TCP端口是否可以访问)
netstat(显示活动的TCP连接、计算机侦听的端口、以太网统计信息、IP路由表、IPv4统计信息(对于IP、ICMP、TCP和UDP协议)以及IPv6统计信息(对于IPv6、ICMPv6、通过IPv6的TCP以及UDP协议))
net(可以在一个地方提供所有信息,并可以把结果重定向到打印机或一个标准的文本文件中)
netsh(网络参数的静态和动态配置)
nmap
tcpdump
网络故障排查案例
健康检查异常:客户端异常 -> 服务端自测正常 -> 网关转发异常 -> 健康检查异常
个别用户报故障:生产环境大多是客户端的问题
安徽电信报障某APP无法使用 -> 检测后端服务正常,安徽电信流量突降 -> 安徽电信客户端ping不通目标服务 -> 电缆被挖断
某APP故障 -> 后端服务器反馈服务正常 -> 网络转发设备异常 -> 抓包 -> 路由不对称
网络稳定-故障预防很重要
- 监控报警
- 故障演练/预案
- 故障降级/止损