打开抖音互联网会发生什么(计算机网络)|青训营笔记

360 阅读8分钟

这是我参与「第三届青训营-后端场」笔记创作活动的第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三次握手:

  1. 协商双方的序列号
  2. 确保对方已经连接
  3. 防止复用历史连接

三次握手时会确认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,系统发现路径不通时返回用户上次缓存的文件。

如果容灾系统没有自动解决问题,我们该怎么做?

  1. 故障明确

通过沟通明确故障体现在哪里,分析的成因。

  1. 故障止损

一定要先止损再排查,止损指采用一些方法来替代故障部分,保证用户体验、保证公司收入。方式常有容灾或降级。

  1. 分段排查
  • 客户端排查:客户端能否访问其它服务器,其他客户能否访问此服务器。
  • 服务端排查:服务端监控/指标是否正常,自己手动访问一下服务端是否正常,分组件排查。
  • 中间链路排查:服务端跟客户端都确保没有问题,中间网络设备(交换机/路由器/网管LB)是否有问题,旁路的DNS是否有问题。

网络故障排查常用命令

  • dig查询DNS问题
  • ping/telnet/nmap查询三层、四层连通性
  • Traceroute排查中间链路(丢包等)
  • iptabels(客户端防火墙)
  • tcpdump(抓包)

案例

  • 健康检查异常:健康检查能检测是否有故障的服务器,有则摘掉此节点。若健康检查程序故障,则可能摘掉正常服务器。中间设备的无判断导致正常设备开始异常。
  • 客户端个例故障,用户的环境不同可能导致问题,例如防火墙等。
  • 区域发现问题,逐步缩小并确定问题范围,可能是电缆出现异常。
  • APP故障--->后端服务器反馈服务正常--->网络转发设备异常--->抓包--->使用了快速发包(默认回包路径相同)--->路由不对称

故障预防

  • 监控报警
  • 故障演练/预案
  • 故障降级/止损

3.课后作业

1. UDP socket实现ack,感知丢包重传

提示:

  1. 学会UDPsocket编程。
  2. 先从简单的ack学习,客户端等待ack再发包。
  3. 什么时候客户端认为是丢包?
  4. 重传怎么考虑效率?
  5. 能不能不阻塞只传丢掉的中间的段?

2. 三台同网段的服务器,模拟实现一个路由器

方法1:Linux操作系统配置法

提示:

  1. 了解Linux的路由配置方式。
  2. 确保是同网段直连可达的环境。在三台机器上另外配置IP网段和路由。
  3. 三台机器代表客户端、路由器、服务端。
  4. 客户端配置到达服务器的下一跳指向路由器,路由器上配置到达服务端的路由。

方法2:用户态socket编程实现简易route软件

提示:

  1. 收到指定的包后做转发。
  2. 修改MAC而不是修改IP。
  3. 实现一个对称路由,这样可以实现TCP交互。
  4. 可以通过ping来验证。
  5. 可以支持traceroute吗?