这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记。
1. 概述
本节课程主要以刷抖音时的底层互联网交互作为切入点,带大家回顾了计算机网络的相关知识,并结合实际生产环境去理解网络的优化方向和稳定性建设。课程主要分为四个方面:
- 网络接入协议
- 网络传输协议
- 网络优化
- 网络稳定
2.课前
2.1 网络接入协议/概念
- MAC地址
- 路由协议
- ARP协议
- IP协议
- NAT?
2.2 网络传输协议
- DNS
- UDP
- TCP
- HTTP
- HTTPS
- HTTP2.0?
- QUIC?
2.3 课程涉及软件/环境安装搭建
-
linux操作系统
-
抓包软件
- 建议在Linux安装tcpdump软件(apt/yum命令安装,参考相关博客。如无法安装,可以下载源码安装www.tcpdump.org/)
- 安装wireshark(根据你的主机选择安装版本www.wireshark.org/,如果是Linux主机…
2.4 课前思考题
- 按照 TCP/IP 的模型示意图,能否画出数据包的拆包/封包?
- TCP 的拥塞算法有哪些?
- 建议熟练掌握 socket 编程。
- 建议阅读 golang/java 等高级编程下的 net 相关库的源码。
- 了解 Linux kernel 的网络包从收到包到用户态,从用户态发包到网卡整个流程
3. 课中
3.1 引言
思考:为了让抖音工作,网络需要哪些交互?
刷抖音:域名解析DNS、图片下载/HTTP、视频下载/HTTP、评论API/HTTP。
3.2 网络接入
3.2.1 互联网的接入:网络拓扑的整体认知
3.2.2 路由发包原理
-
同网段:配置网段即可默认添加静态路由。获取对端MAC直接发包
-
跨网段:配置网关路由。获取网关MAC地址发包
-
动态路由:BGP/OSPF等,路由表在动态变化
-
路由是网状的,不一定是对称的
-
ARP协议
- ARP广播/应答:协议原理
- 免费ARP:主动广播告知MAC地址
- ARP代理:虚拟网络/伪造MAC地址
-
IP协议
- IPv4:互联网终端节点的唯一标识
- IPv6:不仅仅是IP地址长度的增加
-
NAT
- NAT上网:家用路由器
- NAT出网:机房内网主机上外网
- NAT原理:不仅仅是源地址变换,源端口/校验和/SEQ等都会变化
3.3 网络传输
3.3.1 数据包
本质上是一段内存,里面存储的内存是有序的,一般是按照TCP/IP的多层协议去封装。拆包/封包都是按照协议去写内存/读内存。
3.3.2 DNS递归与DNS迭代
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
- 多路复用:依然有对头阻塞
3.4.2 QUIC
-
QUIC的产生背景和背后思考:
- 为什么在用户态实现?内核的更新迭代频率较低,不好推广
- 为什么用UDP?TCP的队头阻塞问题不好解决,推到重来&复用所有操作系统基本都支持的底层协议
3.4.3 数据中心建设
- 多运营商接入:同运营商内部访问,避免跨运营商的流量
- 有边缘机房/汇聚机房/中心机房
3.4.5 CDN静态缓存系统
边缘机房的建设,优先访问边缘机房,缓存命中视频/图片等静态内容
3.4.6 DSA动态加速系统
分四层/七层动态加速。核心在于利用可控节点做路径探测和规划
3.5 网络稳定
3.5.1 对容灾的理解
3.5.2 网络容灾的具体案例
- 机房专线故障:环路容灾,避免某条专线故障导致机房孤岛问题(专线是连接各个机房的网络物理路径)
- 单机房接入节点故障:DNS容灾,摘除故障的节点-字节GTM系统
- 云控容灾:云端交互,服务器/云上下发命令到终端-字节TNC系统
- cache容灾:源站不可用,降级到之前的缓存内容-字节TLB/ByteCDN等系统的容灾建设
3.6故障排查
- 加强故障沟通-明确故障
- 故障止损要在第一时间做(灾备预案的建设)
- 熟悉常用的故障排查命令
3.6.1 故障排查的具体案例
- 服务端配置的异常(健康检查异常)
- 客户端某个例异常(客户端自己配置错误)
- 外部运营商故障
- 复杂故障的排查:需要抓包,具体问题具体分析
4. 课后
4.1 课后作业1:UDP socket 实现 ack,感知丢包重传
- 学会 UDP socket 编程
- 先从简单的 ack 学习,客户端等待 ack 再发包
- 什么时候客户端认为是丢包?
- 重传怎么考虑效率?
- 能不能不阻塞只穿丢掉的中间的段?
4.2 课后作业2:三台同网段内的服务器,模拟实现一个路由器
4.2.1 方法一
- 了解Linux的路由配置方式
- 确保是同网段直连可达的环境。在三台机器上另外配置IP网段和路由
- 一台机器做客户端,一台机器做路由器,一台机器做服务端
- 客户端配置到达服务器的下一跳指向路由器,路由器上配置到达服务端的路由
4.2.2 方法二
- 收到指定的包后,做转发
- 注意是修改报文的 MAC ,不是修改 IP
- 实现一个对称路由。这样可以实现 TCP 交互
- 可以通过 ping 来验证
- 可以支持 traceroute 吗?
5. 文献推荐
- <TCP/IP 详解》-计算机网络指导手册
- 《Linux Kernel develepment》-初步窥探内核实现
- 《深入理解 Linux 网络技术内幕》-TCP/IP 底层编码