打开抖音互联网会发生什么 | 青训营笔记

208 阅读9分钟

打开抖音互联网会发生什么 | 青训营笔记

这是我参与「第三届青训营 -后端场」笔记创作活动的的第8篇笔记

概述

本节课程主要以刷抖音时的底层互联网交互作为切入点,带大家回顾了计算机网络的相关知识,并结合实际生产环境去理解网络的优化方向和稳定性建设。课程主要分为四个方面:

  1. 网络接入协议
  2. 网络传输协议
  3. 网络优化
  4. 网络稳定

课前部分主要罗列课程中涉及到的概念。对于不熟悉的概念,同学们可以提前查询预习;课中部分主要结合实际生产环境理解课本中的一些知识;课后部分是一些问题和参考博客,帮助同学们在课后梳理本课程的重点。

课前

TCP/IP官方标准上并没有网络接入/网络传输协议的区别,这里作者是为了方便大家做一些区分,自己定义了这两大块知识,希望学员不要将这两个概念固化,尽量有自己的理解。

课程涉及知识点预习

结合课本知识/网络博客复习相关的知识点,主要如下:

网络接入协议/概念

  • MAC地址
  • 路由协议
  • ARP协议
  • IP协议
  • NAT

网络传输协议

  • DNS
  • UDP
  • TCP
  • HTTP
  • HTTPS
  • HTTP2.0
  • QUIC

课程涉及软件/环境安装搭建

操作系统

由于当下互联网的服务端程序以及网络环境大多都是Linux操作系统。所以强烈建议学员有一套可正常运行的Linux环境,如果你没有这个环境,可以:

  • 参考一些互联网博客,将你的主机安装成Linux环境(需要安装界面版本,方便安装wireshark)
  • 参考一些互联网博客,在你的主机上搭建Linux虚拟机
  • 购买/试用一些云厂商的云主机服务(一半默认centos/debian等Linux内核的操作系统)

抓包软件

建议在Linux安装tcpdump软件(apt/yum命令安装,参考相关博客。如无法安装,可以下载源码安装www.tcpdump.org/)

安装wireshark(根据你的主机选择安装版本www.wireshark.org/,如果是Linux主机…

课前思考题

时间有限,我们无法尽善尽美的给出整个计算机网络的知识和应用,比如下面的这些知识,建议带着这节课的内容再去思考。

  1. 按照 TCP/IP 的模型示意图,能否画出数据包的拆包/封包?
  2. TCP 的拥塞算法有哪些?课件建议熟练掌握。
  3. 建议熟练掌握 socket 编程。
  4. 建议阅读 golang/java 等高级编程下的 net 相关库的源码。
  5. 了解 Linux kernel 的网络包从收到包到用户态,从用户态发包到网卡整个流程?

课中

引言

思考:为了让抖音工作,网络需要哪些交互?

01 网络接入

1.1 互联网的接入:网络拓扑的整体认知

img

1.2 路由

  • 路由发包原理:

    • 同网段:配置网段即可默认添加静态路由。获取对端MAC直接发包

    img

    image-20220519122056217

    • 跨网段:配置网关路由。获取网关MAC地址发包

    img

    • 动态路由:BGP/OSPF等,路由表在动态变化
    • 路由是网状的,不一定是对称的

    img

1.3 ARP协议

  • ARP广播/应答:协议原理 (需要在逻辑同网段才能发送ARP) 广播不能跨网段 应答单播
  • 免费ARP:主动广播告知MAC地址 (用于新增服务器,新增ip(防止ip冲突))
  • ARP代理:虚拟网络/伪造MAC地址 (劫持ARP请求,发送其他地址)

1.4 IP协议

  • IPv4:互联网终端节点的唯一标识

  • Mac地址不能代替IP地址吗?

    • 二层协议有很多: IP协议要向下兼容
    • 难记
    • 表维护
  • IPv6:不仅仅是IP地址长度的增加

  • ipv4不够用:

    • ipv6

    • net

      image-20220519124517551

1.5 NAT

img

  • NAT上网:家用路由器
  • NAT出网:机房内网主机上外网
  • NAT原理:注意不仅仅是源地址变换,源端口/校验和/SEQ等都会变化

02. 网络传输

2.1 数据包

  • 数据包:本质上是一段内存,里面存储的内存是有序的,一般是按照TCP/IP的多层协议去封装。拆包/封包都是按照协议去写内存/读内存。

img

img

2.2 DNS递归迭代

  • 客户端发www.douyin.com的解析请求
  • 递归解析器去问”.”, com.去哪里解析
  • 递归解析器去问“com.”,douyin.com去哪里解析
  • douyin.com告诉递归解析器www.douyin.com解析到xxx

img

2.3 UDP

image-20220519125416499

  • 协议简单

  • 需要考虑可靠性的场景使用复杂

    • 避免分片: 传输有限制 拆包和重组消耗资源
    • 怎么知道没丢包
    • 怎么权衡传输效率和质量
  • 总结: 想发什么包,就分配一个UDP的头,把payload里面塞数据发出去就好

2.4 TCP :可靠

拔了网线,连接会断吗? 没关系(要考虑探活)

  • 三次握手:确认传输的序列号/MSS/Option字段,建立连接

    • 防止分片: MSS – TCPOption
  • TCP连接:是一个虚拟的概念,本质上两倍维持一段内存,记录连接状态,就是session

  • TCP传输:理解sequence number/acknowledge number

    • sequence number :表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data stream中所在的位置。
    • acknowledge number :表示的是期望的对方(接收方)的下一次sequence number是多少。 注意, SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq增加一.但是,ACK的传输,不会让下一次的传输packet加一。

    image-20220519131037650

    • timewait : 两面sml

      • 确保连接正常关闭
  • 丢包重传:理解丢包怎么感知并重传,理解快速重传发生在什么时候

  • 滑动窗口:课后自学

  • 流量控制:课后自学

2.5 HTTP

  • HTTP比TCP好在哪里:方便

    • 清晰, 简洁
    • 规矩, 原则
  • HTTP1.1的优化:

    • 长连接是重点
    • 部分传输
    • HOST
    • 缓存
  • HTTPS

    • HTTPS的产生背景:加密/可靠/防劫持

    • SSL/TLS握手:非对称加密/对称加密

      • 第三方CA 公钥/私钥/证书: 确保没有劫持, 也确保私钥不泄密

03. 网络提速

3.1 HTTP2.0

  • 多路复用:依然有队头阻塞(发包是串行的)

img

3.2 QUIC

  • QUIC的产生背景和背后思考:

    • 为什么在用户态实现?内核的更新迭代频率较低,不好推广
    • 为什么用UDP?TCP的队头阻塞问题不好解决,推倒重来&复用所有操作系统基本都支持的底层协议
    • 弱网优势
    • 0RTT

    img

3.3 数据中心建设

img

  • 核心机房: 核心
  • POP接入: 核心入口
  • 多运营商接入:同运营商内部访问,避免跨运营商的流量
  • 有边缘机房/汇聚机房/中心机房

3.4 静态资源路径优化(CDN)

  • CDN静态缓存系统:边缘机房的建设,优先访问边缘机房(别人访问过的),缓存命中视频/图片等静态内容

img

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

  • DSA动态加速系统:分四层/七层动态加速。核心在于利用可控节点做路径探测和规划。

img

04. 网络稳定

4.1 对容灾的理解

img

4.2 网络容灾的具体案例

  • 机房专线故障:环路容灾,避免某条专线故障导致机房孤岛问题(专线是连接各个机房的网络物理路径)
  • 专线 : 内部物理连接
  • 外网 : 内部专线以外的网络, 通过internet连接

img

  • 单机房接入节点故障:DNS容灾,摘除故障的节点-字节GTM系统

img

  • 云控容灾:云端交互,服务器/云上下发命令到终端-字节TNC系统

img

云到端 –> 主动降级/容灾

  • cache容灾:源站不可用,降级到之前的缓存内容-字节TLB/ByteCDN等系统的容灾建设

img

4.3 故障排查

img

  • 加强故障沟通-明确故障

  • 故障止损要在第一时间做(灾备预案的建设)

  • 熟悉常用的故障排查命令

  • 故障排查的具体案例

    • 服务端配置异常(健康检查异常)

      • 服务端监控/指标都正常吗?

      • 手动访问一下正常吗?

      客户端异常->服务端自测正常- >网关转发异常- >健康检查异常

    img

    • 客户端某个例异常(客户端自己配置错误)

      • 客户端访问其他服务没问题吗?

      • 其他客户端访问目标服务没问题吗?

    个别用户报故障,生产环境大多是客户端的问题

    img

    • 外部运营商故障

    安徽电信报障某APP无法使用- >检测后端服务正常,安徽电信流量突降- >安徽电信客户端ping不通目标服务->电缆被挖断

    img

    • 复杂故障的排查:需要抓包,具体问题具体分析

    • 分组组件排查

      • 中间链路排查

        • 服务端跟客户端确保都没问题

        • 中间网络设备有没有问题? (交换机/路由器/网关LB )

        • 旁路的DNS有没有问题?

    某APP故障->后端服务器反馈服务正常->网络转发设备异常->抓包->路由不对称

    img

课后

课后作业1- UDP socket 实现 ack,感知丢包重传

作业要求:

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

课后作业2- 三台同网段内的服务器,模拟实现一个路由器

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

提示:

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

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

提示:

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