(五)打开抖音会发生什么 | 青训营

159 阅读11分钟

课程收益

image-20230809203953050.png 有利于其他方向研发

课程目录

看一下刷抖音这里,这里客户端与服务端之间有哪些协议

15d00eb784da012e9c5f05e169ee1e4c.png 这里的http是泛http例如quic和http2等

image-20230809204138291.png

刷抖音网络是怎么交互的

1网络接入

image-20230809204508150.png

1.1网络接入-互联网

c17812b6-0a18-48f1-a6ae-b20acb5cb752.png 左边是终端设备,通过wifi或者双绞线接入到ISP运行商

1.2 网络接入-路由

aa788b96-496a-415a-bf1c-33aa106a9cfc.png

19131516-97b9-4d56-9a23-527820c88d5a.png

image-20230809205320834.png 同网段一般是通过一个交换机来实现,但这个交换机有可能不是物理上的交换机,也有可能是虚拟网络。

SDN:软件定义网络(Software Defined Network,SDN)是网络虚拟化的一种实现方式。其核心技术OpenFlow通过将网络设备的控制面与数据面分离开来,从而实现了网络流量的灵活控制,使网络作为管道变得更加智能,为核心网络及应用的创新提供了良好的平台。

往同网段如何发包? 只需要设置好目标IP和目标MAC地址就行。

image-20230809210314298.png

路由一定是对称的吗?例如A->H和H->A 不一定是对称的,每个节点的路由表不是对称的,根据不同的情况和算法。

路由可以说工作在网络层也就是IP层,但是动态路由协议(算法)是基于传输层实现的。例如BGP和OSPF。

路由该的是IP地址吗? 不是,路由修改的是下一跳的MAC地址。原Mac和目标Mac一直在变化,原IP和目标IP不变。

右下角伪代码:函数名发一个包,根据dst IP 找到下一跳的MAC和网卡的端口,然后发送。

MAC地址用于唯一表示一个网卡

右上角10.0.0.1/24要发包到10.0.1.1/24这个host。需要查路由表。路由表可能是这么表示的:to 10.0.1.1/24 via 10.0.0.254 或者 default via 10.0.0.254。

怎么找到下一跳的MAC?使用ARP协议

左边的终端先通过ARP协议找到交换机/路由器的MAC地址把包发过去 交换机/路由器再找到右边终端的MAC地址把包。

1.3网络接入-ARP

跨网段的

ARP代理:SDN的实现原理之一。 image-20230809212404134.png

例如A发的ARP报文都会经过交换机,当交换机检测到A是发给B的时候就转发到f。 image-20230809212744548.png

image-20230809213635512.png a要找到b的mac地址,直接再同网段内发送广播。b收到后应答单播。 免费ARP:当一个网段新增了一个机器,因为没有ARP缓存,所以大家访问他会比较慢,因此每次新增机器的时候搞一个免费ARP,让大家(同一个网段内的机器)更新一下MAC表,这样下次有人访问新机器的话就很快。

1.4网络接入-IP

image-20230809214153063.png Mac地址不能代替IP地址吗? 不能,因为涉及到向下兼容问题,MAC协议是二层以太网协议,二层以太网协议还有很多种,很多类似于拨号可能用的不是MAC协议,这样就没法上网了。。。所以不能代替。所以美国军方想了个法子,把二层网络封装一下,弄成了IP协议。 而且IP可以进行子网划分,有利于分治防止报文洪泛。

IPv4不够用,一般怎么解决? 第一,IPv6。那不支持IPv6的设备咋办?用NAT。

Network Address Translation : 将私网地址和公网地址形成映射

1.5 网络接入-NAT

家里的路由器就是一个NAT。

下面是NAT(NAPT)维护的映射结构举例(P:port)

使用IP+Port当作唯一标识(NAT的其中一种)

内网IP外网IP
192.168.1.55219.152.168.222:9200
192.168.1.56219.152.168.222:9201
192.168.1.57219.152.168.222:9202

2网络传输

数据包

image-777.png

wireshark抓包

0de01001-c98c-437c-a113-47c86878fd17.png

从上往下依次是物理层、数据链路层、网络层、传输层、应用层 bf5f6bd5-2b57-4d53-857d-4c7c4e6ba281.png 依次封装的伪代码

数据包的发送

dbe2f58c-af58-4770-9f61-5490e75f58da.jpg

先请求DNS

image-20230809232707002.png

域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。

这个DNS的过程是逆解析的,流程如图中文字。

UDP

image-20230809232854526.png

如何保证UDP可靠?自己基于UDP实现以下。

payload:有效载荷。

发包每次发多少?怎么避免分片? 每次发包要小于路径上每个路由器的MTU(什么是MTU,这里还介绍了分片的知识),这样可以避免分片。

怎么知道没丢包? 因为UDP不可靠,所以没法知道。

TCP三次握手

2351935-20220607140431633-223138215.png

三次握手过程:

  1. 客户端——发送带有SYN标志的数据包——服务端 一次握手 客户端进入syn_sent状态
  2. 服务端——发送带有SYN/ACK标志的数据包——客户端 二次握手 服务端进入syn_rcvd
  3. 客户端——发送带有ACK标志的数据包——服务端 三次握手 连接就进入Established状态

拔了网线,连接会断吗? 理论上连接不会断开,这是一个虚拟的连接。A机器和B机器连接,说明A机器和B机器基于TCP协议维护了一种状态,和网络没有关系。实际工程中和探活机制有关。

TCP传输

image-20230809234627606.png

MSS:是一个TCP option ,全称Maximum Segment Size

PSH表示有 DATA数据传输

544c751b-a2c6-42ff-9f06-50a0778301f3.png image-20230809235437594.png

为什么老问你Timewait? 一个web服务器最大的端口数量是65535个,如果这个服务器作为客户端不停的和服务端不停的创建短连接,就会导致有大量的TCP进入TIME_WAIT状态。

参考文章:blog.csdn.net/huxyc/artic…

解决办法 :timewait recycle/reuse

丢包怎么办: 重传。

典型的tcp协议要求每一个数据段发送之后都要有一个ack回复,然后才能发送下一个数据段,虽然这样能保证数据的可靠传输,但是效率呢?由于tcp是全双工通信,在等待一个数据段的ack恢复之前网络将会闲置,因此效率将会受到极大影响,因此协议提出了滑动窗口子协议,专门负责数据的传输,滑动窗口子协议分为简单的停-等协议,后退N协议,以及选择重传协议三个子子协议,其实三个子子协议可以由一个例程表示,只是一个例程的三个不同情况,比如发送和接收窗口都为1时就是简单的停等协议。三个子子协议都很复杂,只有靠这种复杂的机制才换取了网络链路的高效利用。

HTTP/HTTP1.1

HTTP基于TCP实现

HTTPS

image-20230810001720177.png

image-20230810001731959.png

Certificate Authority: CA

HTTPS = HTTP + SSL/TSL

网络安全中ca是Certification Authority的缩写,一般是指CA证书,它是CA机构发行的一种电子文档,是一串能够表明网络用户身份信息的数字,它提供了一种在计算机网络上验证网络用户身份的方式。

总结

image-20230810001548136.png

网络架构怎么给抖音提质

网络提速

HTTP2.0

image-20230810122645511.png

b809e5d1-47f2-44e6-bb9c-6a818daad2e0.png 多路复用,可以在TCP上同时跑多个stream。

怎么理解多路复用/stream?

2351935-20220607140426161-802079987.png

http并行访问。本质上stream是并行的。

如果TCP丢包怎么办? 数据丢失会发生队头阻塞(解决办法:通过ACK标记重传位置,重传即可,但没解决本质问题)。

QUIC/HTTP3.0

image-20230810124043439.png

2.0和3.0都是Google发展的。

用TCP实现或者使用UDP实现? TCP实现比较复杂,牵一发动全身,而且你优化了之后会有人来用吗,这是一个值得思考的问题。 TCP协议在linux上是不可以插拔的。

粗略理解: 内核态和用户态

内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序

使用Kernel or Userspace(内核态或者用户态)实现? Kernel实现:不同的操作系统都要去进行内核态的实现。最终决定在Userspace实现

TLS/SSL握手优化,只是在第一次握手比较浪费时间,做0 RTT(Round trip time)传输. 弱网优势:弱网情况下,Http3比HTTP2丢包情况优化很多。

除了协议优化,网络路径优化?

数据中心分布

下载.png转存失败,建议直接上传图片文件 核心机房:存储重要数据,例如用户敏感数据,mysql, mangodb。 POP接入:增加和互联网交互的接入口。 边缘机房:更更接近用户全国都有,不过越繁华的地段越多。例如在上海有上海电信、上海移动、上海联动的三套机房。

PoP(Point-of-Presence)的意思是入口点。 PoP点位于企业网络边缘之外,是访问企业网络内部的入口点。外界提供的服务通过PoP点进入。

同运营商访问

ae66b211-48a9-47f4-9f3b-09342fd89741.png 跨ISP访问,网络比较差。 怎么做:一般通过解析去做,读客户端IP,发现到IP是移动的,就接入到移动。

静态资源(图片视频)路径优化(CDN)

CDN主要是对静态资源做缓存,静态资源查找顺序:边缘机房-->汇聚机房-->核心机房

2351935-20220607140424308-1150254422.png

动态API(播放/评论接口)路径优化(DSA)

2351935-20220607140423751-352287708.png 简单的优化算法:A探测B、D、E三个机房的实验并记录,B探测C、E、F的时延并探测,通过这些数据找到一条最优的路径。

网络稳定

刷得快,但是两三天挂掉,谁刷抖音?

容灾概念

2351935-20220607140423349-983391402.png

故障感知:容灾系统感知到到故障。通过监控或者有关人员上报发现。

自动切换:怎么把故障的节点切换成完好的节点。最终实现服务恢复。

网络容灾的具体案例一

2351935-20220607140423015-1778938488.png

专线:没走外部的Internet,而是抖音自己内部的网线。 外网:走的外部的Internet。

在这个场景中即使专线挂了,外网的Internet也能保证正常的通信。

网络容灾的具体案例二

2351935-20220607140422588-1105129549.png

基于调度的容灾。 如上图当bytedance.com对应的A机房挂了之后,自动将域名解析B机房,整个过程是自动完成的。

  • 检测故障A
  • 探测B能承载这个流量,就把请求打给机房B(防止雪崩)

网络容灾的具体案例三

2351935-20220607140422184-1776434710.png

云控:从客户端的SDK控制,不去访问已经崩了的A机房。即通过软件内嵌的代码切换掉坏掉的节点,切换域名或者切换IP。

局限性:调用这个SDK可能需要用户授权,如果用户不给权限那可能就没办法了。 如果用户是通过web访问的,那也没有办法。

网络容灾的具体案例四

2351935-20220607140421763-309886994.png

就是利用缓存,当访问Helloword失败,就去访问lb前置的缓存的helloword。 兜底:如果后面寄了,就用之前的缓存。

故障排查

故障明确

image-20230810212200823.png

什么业务?是A业务还是B业务。

故障体现在哪里? 访问一个页面加载很慢还是加载不出来。

访问其他目标是否正常? 访问A业务有问题,看看访问相关的B、C业务是否有问题。如果所有的接口都不能访问,可能是用户机器的问题。

是否是修改导致的异常? 例如版本更新。百分之七十的故障都是上线导致的,解决办法版本回退。

故障止损

2351935-20220607140420584-755362516.png

降级:例如抖音推荐接口有问题,导致刷不了视频。可以降级直接关闭推荐算法。

降级:服务能力降低

分段排查

2351935-20220607140420233-1233757732.png 服务端排查:必须有监控,没有监控不能上线。手动访问一下接口,看看正常不正常。

网络故障排查常用命令

2351935-20220607140419889-36400752.png

网络故障排查案例一

2351935-20220607140419642-1950661573.png

中间节点异常

网络故障排查案例二

2351935-20220607140419309-2039116219.png

用户的防火墙把所有ip都禁了。

网络故障排查案例三

2351935-20220607140418943-1470185095.png

边缘机房出现问题,发现电缆被挖断

网络故障排查案例四

2351935-20220607140418607-162570075.png

程序使用fast发包(路由对称的)目标mac和源mac默认掉转一下就完事了,但实际情况不一样。

解决办法,改代码,不要使用fast发包

故障预防很重要

2351935-20220607140418325-1994743188.png

总结回顾

2351935-20220607140418019-624278985-16917442797553.png

课后作业

2351935-20220607140417692-1228113582.png

2351935-20220607140417088-1921670743.png

补充

有时间使用tcpdump + wiresharp 补充一下笔记?