第八节:打开抖音互联网会发生什么丨青训营笔记

231 阅读5分钟

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

1. 概述

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

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

2.课前

2.1 网络接入协议/概念

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

2.2 网络传输协议

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

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

2.4 课前思考题

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

3. 课中

3.1 引言

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

刷抖音:域名解析DNS、图片下载/HTTP、视频下载/HTTP、评论API/HTTP。

3.2 网络接入

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

image.png

3.2.2 路由发包原理

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

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

  • 动态路由:BGP/OSPF等,路由表在动态变化

  • 路由是网状的,不一定是对称的 image.png

  • ARP协议

    • ARP广播/应答:协议原理
    • 免费ARP:主动广播告知MAC地址
    • ARP代理:虚拟网络/伪造MAC地址
  • IP协议

    • IPv4:互联网终端节点的唯一标识
    • IPv6:不仅仅是IP地址长度的增加
  • NAT

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

3.3 网络传输

3.3.1 数据包

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

image.png

3.3.2 DNS递归与DNS迭代

image.png

3.3.3 UDP

  • 协议简单
  • 需要考虑可靠性的场景使用复杂

3.3.4 TCP

  • 三次握手:确认传输的序列号/MSS/Option字段,建立连接
  • TCP连接:是一个虚拟的概念,本质上两倍维持一段内存,记录连接状态,就是session
  • TCP传输:理解sequence number/acknowledge number
  • 丢包重传:理解丢包怎么感知并重传,理解快速重传发生在什么时候
  • 滑动窗口
  • 流量控制

3.3.5 HTTP

  • HTTP比TCP好在哪里:方便
  • HTTP1.1的优化:长链接是重点

3.3.6 HTTPs

  • HTTPs的产生背景:加密/可靠/放劫持
  • SSL/TLS握手:非对称加密/对称加密

3.4 网络提速

3.4.1 HTTP2.0

  • 多路复用:依然有对头阻塞 image.png

3.4.2 QUIC

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

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

image.png

3.4.3 数据中心建设

image.png

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

3.4.5 CDN静态缓存系统

边缘机房的建设,优先访问边缘机房,缓存命中视频/图片等静态内容

image.png

3.4.6 DSA动态加速系统

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

image.png

3.5 网络稳定

3.5.1 对容灾的理解

image.png

3.5.2 网络容灾的具体案例

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

image.png

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

image.png

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

image.png

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

image.png

3.6故障排查

- 加强故障沟通-明确故障
- 故障止损要在第一时间做(灾备预案的建设)
- 熟悉常用的故障排查命令

image.png

3.6.1 故障排查的具体案例

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

image.png

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

image.png

  • 外部运营商故障

image.png

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

image.png

4. 课后

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

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

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

4.2.1 方法一

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

4.2.2 方法二

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

5. 文献推荐

  • <TCP/IP 详解》-计算机网络指导手册
  • 《Linux Kernel develepment》-初步窥探内核实现
  • 《深入理解 Linux 网络技术内幕》-TCP/IP 底层编码