这是我参与「第三届青训营-后端场」笔记创作活动的第8篇笔记。
0.课前准备
linux系统:用的ubuntu20.04。
tcpdump: 使用sudo apt-get install tcpdump安装,使用tcpdump -h检验。
wireshark:sudo add-apt-repository ppa:wireshark-dev/stable添加源路经,sudo apt-get update更新路径,sudo apt-get install wireshark -y安装。
1.抖音网络如何交互
抖音刷出视频与互联网有哪些交互? DNS、udp、HTTP、IP、ARP、以太网等。
单独从应用层来看:域名解析:DNS;视频图片下载以及动态评论的API:HTTP(这里指范HTTP,HTTP1.1、HTTP2、HTTP3、quic)。
网络接入
网络终端(手机、PC、ipad等)通过WIFI、4G、5G等使用无线网接入有线网。通过有线网接入不同运营商(移动、电信、联通)的网络。移动运营商的网络与抖音的服务器(公司机房)接通。运营商的网络接入世界网。
一般网络问题都出现在”最后一公里“(用户接入的部分)。骨干网如果出问题将出现大事故。
以上为物理上的联通方式,接下来是逻辑上的联通。
根据子网掩码将网络划分为不同网段。通过SDN(软件定义网络)进行网络虚拟化,同一网段的设备不一定物理相连。
overlay和underlay:underlay网络就是物理连接网络,overlay网络就是建立在underlay网络上的逻辑网络。
同网段消息发送:通过ARP查到目标ip的MAC地址,然后即可通信。逻辑上的同网段才能发送ARP,ARP解析超越子网的ip会返回错误。ARP请求是广播,广播不能跨网段。ARP应答是单播。
不同网段消息发送:用过ARP寻找下一跳(不同网段之间由路由器连接),然后由下一跳传输。路由不是对称的,往返的路径可能不同。路由器转发时只改MAC地址(源MAC和目标MAC都改),不改IP地址。
免费ARP:新接入网络的主机通过免费ARP向其它主机通知自己的地址,同时防止ip冲突。
ARP代理:劫持ARP请求,同时实现其他服务。很多虚拟网络都是通过ARP代理进行的。
IP协议:
- 唯一标识,互联网通用。
- Mac地址不能代替IP地址:MAC是扁平的,全部使用MAC则需要大量的空间存储地址(因为需要存储所有的地址),同时广播对网络中所有用户发送。电话等设备不支持MAC地址但能接入IP。
- IPv4不够用怎么办:IPv6、NAT。
网络协议
| TCP/IP四层模型 | OSI七层网络模型 | 对应网络协议 |
|---|---|---|
| 应用层 | 应用层 | HTTP,TFTP,FTP,NFS,WAIS,SMTP |
| 应用层 | 表示层 | Telnet,Rlogin,SNMP,Gopher |
| 应用层 | 会话层 | SMTP,DNS |
| 传输层 | 传输层 | TCP,UDP |
| 网络层 | 网络层 | IP,ICMP,ARP,RARP,AKP,UUCP |
| 数据链路层 | 数据链路层 | FDDI,Ethernet,Arpanet,PDN,SLIP,PPP |
| 数据链路层 | 物理层 | IEEE 802.1A,IEEE 802.2到IEEE 802.11 |
UDP
UDP每次发包发多少?不大于网络的最大传输单元(MTU)。
为什么避免分片?长度大于MTU则需要分片,分片需要额外资源。
无法知道是否丢包,难以权衡传输效率和质量。
TCP
什么是tcp连接?双方保持一个连接状态。网线断开本身和状态无关,具体要看下一次消息传输或TCP有探活(定期发送心跳包确认连接)。
TCP三次握手:
- 协商双方的序列号
- 确保对方已经连接
- 防止复用历史连接
三次握手时会确认option字段。如MSS(最大分段大小)。
Seq为本数据的序列号,Ack为期望下一次获得的序列号。
为什么TCP有限状态机要做Timewait?每个状态等待2个msl(Maximum Segment Lifetime,报文最大生存时间),确保报文丢失而不是堵塞。如果timewait时间太长可能会导致服务器所有端口都处于等待状态,因此有些设计会直接关闭或复用端口。
HTTP
为什么用HTTP而不是TCP:分层,TCP更偏向于传输,HTTP更关注于业务。
HTTP1.1优化:长连接、部分传输、HOST、缓存......
信息安全:SSL/TLS握手,通过非对称加密传输后续对称加密的密钥。
2.网络框架如何给抖音提质
网络提速
HTTP2.0网络提速,支持多图并发下载,支持tcp多路复用。一个tcp传输多个http。
实际上串行发送内部的stream。
队头阻塞(第一个包丢失):可能全部重传。选择重传(SR)中用SACK(选择-ACK)标明哪些包已经确认收到,确认收到的包不再重传,即发生队头阻塞只重传第一个包。
QUIC/HTTP3.0:TCP协议本身比较完善且是不可插拔的,写在操作系统中。如果QUIC使用TCP则只有新安装的系统可以使用QUIC。因此QUIC使用了UDP。同理,kernal态程序推广复杂,因此QUIC运行在用户态。
优势:0RTT传输、弱网传输(解决了队头阻塞的问题,所以在弱网上性能良好)。
除了协议优化,可不可以进行路径优化?
路径优化:CDN、A*、DSA、蚁群算法等。
数据中心分布:核心机房(数据库)--> POP接入(访问数据库)--> internet <--边缘机房(靠近用户,相当于缓存)
同运营商访问:移动网络账号接入移动服务器、电信网络账号接入电信服务器。如何做到:解析账号ip。原因:不同运营商之间连通性差,用户出了问题能找到责任方。
静态资源(图片、视频)路径优化(CDN)。服务器进行缓存,用户访问查询:边缘机房->汇聚机房->核心机房。
动态API(播放/评论接口)路径优化(DSA)。计算最优路径。
网络稳定
容灾:故障发生、故障感知(系统发现故障发生)、自动切换(把有问题的节点去掉)、服务恢复。
- 主备切换:公司一般走内网专线,容灾可走internet。
- 调度容灾:控制机房,正常服务可走AB两条路径,A不可用时切断A只走B。加入A是因为负载过高而不可用,切换为B则可能发生巨大崩溃。所以系统不应该只做切换,而也要探测B的容量。
- 云控制终端,主动降级:通过SDK不让用户访问崩溃节点,缺陷:用户用浏览器打开无法控制用户访问。
- CDN缓存:Bug导致app全crash,系统发现路径不通时返回用户上次缓存的文件。
如果容灾系统没有自动解决问题,我们该怎么做?
- 故障明确
通过沟通明确故障体现在哪里,分析的成因。
- 故障止损
一定要先止损再排查,止损指采用一些方法来替代故障部分,保证用户体验、保证公司收入。方式常有容灾或降级。
- 分段排查
- 客户端排查:客户端能否访问其它服务器,其他客户能否访问此服务器。
- 服务端排查:服务端监控/指标是否正常,自己手动访问一下服务端是否正常,分组件排查。
- 中间链路排查:服务端跟客户端都确保没有问题,中间网络设备(交换机/路由器/网管LB)是否有问题,旁路的DNS是否有问题。
网络故障排查常用命令
- dig查询DNS问题
- ping/telnet/nmap查询三层、四层连通性
- Traceroute排查中间链路(丢包等)
- iptabels(客户端防火墙)
- tcpdump(抓包)
案例
- 健康检查异常:健康检查能检测是否有故障的服务器,有则摘掉此节点。若健康检查程序故障,则可能摘掉正常服务器。中间设备的无判断导致正常设备开始异常。
- 客户端个例故障,用户的环境不同可能导致问题,例如防火墙等。
- 区域发现问题,逐步缩小并确定问题范围,可能是电缆出现异常。
- APP故障--->后端服务器反馈服务正常--->网络转发设备异常--->抓包--->使用了快速发包(默认回包路径相同)--->路由不对称
故障预防
- 监控报警
- 故障演练/预案
- 故障降级/止损
3.课后作业
1. UDP socket实现ack,感知丢包重传
提示:
- 学会UDPsocket编程。
- 先从简单的ack学习,客户端等待ack再发包。
- 什么时候客户端认为是丢包?
- 重传怎么考虑效率?
- 能不能不阻塞只传丢掉的中间的段?
2. 三台同网段的服务器,模拟实现一个路由器
方法1:Linux操作系统配置法
提示:
- 了解Linux的路由配置方式。
- 确保是同网段直连可达的环境。在三台机器上另外配置IP网段和路由。
- 三台机器代表客户端、路由器、服务端。
- 客户端配置到达服务器的下一跳指向路由器,路由器上配置到达服务端的路由。
方法2:用户态socket编程实现简易route软件
提示:
- 收到指定的包后做转发。
- 修改MAC而不是修改IP。
- 实现一个对称路由,这样可以实现TCP交互。
- 可以通过ping来验证。
- 可以支持traceroute吗?