课程收益
有利于其他方向研发
课程目录
看一下刷抖音这里,这里客户端与服务端之间有哪些协议
这里的http是泛http例如quic和http2等
刷抖音网络是怎么交互的
1网络接入
1.1网络接入-互联网
左边是终端设备,通过wifi或者双绞线接入到ISP运行商
1.2 网络接入-路由
同网段一般是通过一个交换机来实现,但这个交换机有可能不是物理上的交换机,也有可能是虚拟网络。
SDN:软件定义网络(Software Defined Network,SDN)是网络虚拟化的一种实现方式。其核心技术OpenFlow通过将网络设备的控制面与数据面分离开来,从而实现了网络流量的灵活控制,使网络作为管道变得更加智能,为核心网络及应用的创新提供了良好的平台。
往同网段如何发包? 只需要设置好目标IP和目标MAC地址就行。
路由一定是对称的吗?例如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的实现原理之一。
例如A发的ARP报文都会经过交换机,当交换机检测到A是发给B的时候就转发到f。
a要找到b的mac地址,直接再同网段内发送广播。b收到后应答单播。
免费ARP:当一个网段新增了一个机器,因为没有ARP缓存,所以大家访问他会比较慢,因此每次新增机器的时候搞一个免费ARP,让大家(同一个网段内的机器)更新一下MAC表,这样下次有人访问新机器的话就很快。
1.4网络接入-IP
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.55 | 219.152.168.222:9200 |
| 192.168.1.56 | 219.152.168.222:9201 |
| 192.168.1.57 | 219.152.168.222:9202 |
2网络传输
数据包
wireshark抓包
从上往下依次是物理层、数据链路层、网络层、传输层、应用层
依次封装的伪代码
数据包的发送
先请求DNS
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。
这个DNS的过程是逆解析的,流程如图中文字。
UDP
如何保证UDP可靠?自己基于UDP实现以下。
payload:有效载荷。
发包每次发多少?怎么避免分片? 每次发包要小于路径上每个路由器的MTU(什么是MTU,这里还介绍了分片的知识),这样可以避免分片。
怎么知道没丢包? 因为UDP不可靠,所以没法知道。
TCP三次握手
三次握手过程:
- 客户端——发送带有
SYN标志的数据包——服务端 一次握手 客户端进入syn_sent状态 - 服务端——发送带有
SYN/ACK标志的数据包——客户端 二次握手 服务端进入syn_rcvd - 客户端——发送带有
ACK标志的数据包——服务端 三次握手 连接就进入Established状态
拔了网线,连接会断吗? 理论上连接不会断开,这是一个虚拟的连接。A机器和B机器连接,说明A机器和B机器基于TCP协议维护了一种状态,和网络没有关系。实际工程中和探活机制有关。
TCP传输
MSS:是一个TCP option ,全称Maximum Segment Size
PSH表示有 DATA数据传输
为什么老问你Timewait?
一个web服务器最大的端口数量是65535个,如果这个服务器作为客户端不停的和服务端不停的创建短连接,就会导致有大量的TCP进入TIME_WAIT状态。
解决办法 :timewait recycle/reuse
丢包怎么办: 重传。
典型的tcp协议要求每一个数据段发送之后都要有一个ack回复,然后才能发送下一个数据段,虽然这样能保证数据的可靠传输,但是效率呢?由于tcp是全双工通信,在等待一个数据段的ack恢复之前网络将会闲置,因此效率将会受到极大影响,因此协议提出了滑动窗口子协议,专门负责数据的传输,滑动窗口子协议分为简单的停-等协议,后退N协议,以及选择重传协议三个子子协议,其实三个子子协议可以由一个例程表示,只是一个例程的三个不同情况,比如发送和接收窗口都为1时就是简单的停等协议。三个子子协议都很复杂,只有靠这种复杂的机制才换取了网络链路的高效利用。
HTTP/HTTP1.1
HTTP基于TCP实现
HTTPS
Certificate Authority: CA
HTTPS = HTTP + SSL/TSL
网络安全中ca是Certification Authority的缩写,一般是指CA证书,它是CA机构发行的一种电子文档,是一串能够表明网络用户身份信息的数字,它提供了一种在计算机网络上验证网络用户身份的方式。
总结
网络架构怎么给抖音提质
网络提速
HTTP2.0
多路复用,可以在TCP上同时跑多个stream。
怎么理解多路复用/stream?
http并行访问。本质上stream是并行的。
如果TCP丢包怎么办? 数据丢失会发生队头阻塞(解决办法:通过ACK标记重传位置,重传即可,但没解决本质问题)。
QUIC/HTTP3.0
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丢包情况优化很多。
除了协议优化,网络路径优化?
数据中心分布
核心机房:存储重要数据,例如用户敏感数据,mysql, mangodb。
POP接入:增加和互联网交互的接入口。
边缘机房:更更接近用户全国都有,不过越繁华的地段越多。例如在上海有上海电信、上海移动、上海联动的三套机房。
PoP(Point-of-Presence)的意思是入口点。 PoP点位于企业网络边缘之外,是访问企业网络内部的入口点。外界提供的服务通过PoP点进入。
同运营商访问
跨ISP访问,网络比较差。
怎么做:一般通过解析去做,读客户端IP,发现到IP是移动的,就接入到移动。
静态资源(图片视频)路径优化(CDN)
CDN主要是对静态资源做缓存,静态资源查找顺序:边缘机房-->汇聚机房-->核心机房
动态API(播放/评论接口)路径优化(DSA)
简单的优化算法:A探测B、D、E三个机房的实验并记录,B探测C、E、F的时延并探测,通过这些数据找到一条最优的路径。
网络稳定
刷得快,但是两三天挂掉,谁刷抖音?
容灾概念
故障感知:容灾系统感知到到故障。通过监控或者有关人员上报发现。
自动切换:怎么把故障的节点切换成完好的节点。最终实现服务恢复。
网络容灾的具体案例一
专线:没走外部的Internet,而是抖音自己内部的网线。 外网:走的外部的Internet。
在这个场景中即使专线挂了,外网的Internet也能保证正常的通信。
网络容灾的具体案例二
基于调度的容灾。 如上图当bytedance.com对应的A机房挂了之后,自动将域名解析B机房,整个过程是自动完成的。
- 检测故障A
- 探测B能承载这个流量,就把请求打给机房B(防止雪崩)
网络容灾的具体案例三
云控:从客户端的SDK控制,不去访问已经崩了的A机房。即通过软件内嵌的代码切换掉坏掉的节点,切换域名或者切换IP。
局限性:调用这个SDK可能需要用户授权,如果用户不给权限那可能就没办法了。 如果用户是通过web访问的,那也没有办法。
网络容灾的具体案例四
就是利用缓存,当访问Helloword失败,就去访问lb前置的缓存的helloword。 兜底:如果后面寄了,就用之前的缓存。
故障排查
故障明确
什么业务?是A业务还是B业务。
故障体现在哪里? 访问一个页面加载很慢还是加载不出来。
访问其他目标是否正常? 访问A业务有问题,看看访问相关的B、C业务是否有问题。如果所有的接口都不能访问,可能是用户机器的问题。
是否是修改导致的异常? 例如版本更新。百分之七十的故障都是上线导致的,解决办法版本回退。
故障止损
降级:例如抖音推荐接口有问题,导致刷不了视频。可以降级直接关闭推荐算法。
降级:服务能力降低
分段排查
服务端排查:必须有监控,没有监控不能上线。手动访问一下接口,看看正常不正常。
网络故障排查常用命令
网络故障排查案例一
中间节点异常
网络故障排查案例二
用户的防火墙把所有ip都禁了。
网络故障排查案例三
边缘机房出现问题,发现电缆被挖断
网络故障排查案例四
程序使用fast发包(路由对称的)目标mac和源mac默认掉转一下就完事了,但实际情况不一样。
解决办法,改代码,不要使用fast发包
故障预防很重要
总结回顾
课后作业
补充
有时间使用tcpdump + wiresharp 补充一下笔记?