第十一、十二节 TCP
-
TCP包结构
- TCP解决的问题:
- 顺序
- 丢包
- 连接维护,有始有终
- 流量控制,把握分寸,不撑死不饿死
- 拥塞控制,知进退
-
连接建立的三次握手:保证两端都一发一收,基本可靠;包起始序号随机生成。状态时序图:
- 连接断开的四次挥手
- MSL:max segment lifetime, 最大报文生存时间
- TTL:time to live, 网络包传输的最大跳数
-
RTT: round-trip time, 网络包来回时间
-
状态机
前面解决了连接维护问题,下面解决其他4个问题。
-
滑动窗口rwnd:解决顺序、丢包、流量控制问题
接收端会给发送端报一个窗口大小,叫Advertised window,可动态调整
-
确认与重发机制
- 超时重试:超时时间必须大于RTT,也不宜过长。自适应重传算法。每次超时重传,都会将下一次的超时时间double
- 快速重传算法:丢掉的包的前一个包的ack发三次
- SACK:ack地图
-
拥塞窗口cwnd:拥塞控制,尽量把水管灌满。通道容量 = 带宽 * RTT。
- 目的:避免包丢失和重传
- 面临的问题:丢包不代表通道满了,也可能本来就漏水;填满才控制也不对。
-
升级版: bbr算法
第十三节 socket(插槽,插座)
socket编程进行端到端的通信,只能设置端到端协议之上的网络层和传输层的协议,如ipv4还是ipv6,tcp还是udp。
-
TCP socket编程模型
- 内核中为每个socket维护两个队列:已连接队列established和还没完全连接队列syn_rcvd。
-
服务端监听socket和真正传输数据的socket是2个独立的。
-
socket就是一个文件,每个进程都有一个数据结构task_struct。缓存sk_buff里面是完整的包结构
-
UDP socket调用过程
-
最大连接数限制
- 文件描述符限制:socket是一个文件
- 内存限制: socket占用内存
C10K 就是 Client 10000 问题,即:在同时连接到服务器的客户端数量超过 10000 个的环境中,即便硬件性能足够, 依然无法正常提供服务
-
提高最大连接数的方式
-
多进程方式 下图为进程fork示意图,父进程的文件描述符会被子进程获得
-
多线程方式:文件描述符、进程空间还是共享的,只是多了个引用而已
- IO多路复用,轮询socket状态是否更新
-
IO多路复用,epoll注册callback,主动通知
-
第十四节 http协议
-
http请求报文格式
-
nginx做接入层,拦截静态请求
-
http返回报文格式
- http2.0 通过头压缩、分帧、二进制编码、多路复用等技术提升性能
- QUIC协议(google)
- 自定义连接机制:基于UDP
- 自定义重传机制
- 无阻塞多路复用
- 自定义流量控制
第十五节 https
- 两端各产生一个随机数,最后再发一个pre-master随机数,结合起来,生成对称密钥。
- 重放与篡改问题:timestamp&nonce解决
第十六节 流媒体协议
- 视频 = 快速播放一连串的图片。一张图片称为一帧, fps = frame per second。
- 视频压缩原理
- 空间冗余: 单张图片的相邻像素有相关性
- 时间冗余: 相邻图片之间内容相似
- 视觉冗余: 人类视觉系统对一些细节不敏感
- 编码冗余: 不同像素值出现概率不同
-
直播流程
- 服务端接流后进行转码,以适应各种客户端
- 编码
- I帧: 关键帧
- P帧:跟之前一个I帧的差别
- B帧:本帧和前后帧的差别,压缩率最高
-
时序编码, NALU(network abstraction layer unit)网络提取层单元。排序好的NALU,按照RTMP包的格式进行包装,RTMP的包会拆分成chunk传输
-
推流:RTMP协议,基于TCP,交换版本号、时间戳
-
分发网络
第十七节 p2p协议
- 解决http或ftp下载文件, 存在的单一服务器压力问题。资源并不集中存储在某些设备上,而是分散存储在多台设备。
- 种子文件:保存tracker url(中心化的调度服务器地址)和文件信息
- 去中心化网络:DHT(Distributed Hash Table)
第十八节 DNS协议
- 一般基于UDP
-
DNS服务器树状结构
- 根DNS:返回顶级域DNS服务器ip地址
- 顶级域DNS服务器:返回权威DNS服务器ip地址
- 权威DNS服务器:返回相应主机的ip地址
- 解析流程
- 先访问本地缓存,如/etc/hosts
- 访问本地dns服务器:如果用的是dhcp,由网络服务商(isp)自动分配,通常就在你的网络服务商的某个机房
- 上一步没有,则访问根dns服务器,全球仅13个,不直接做域名解析,但可以指明道路。
- 转向顶级域名服务器,再被导到权威域名服务器
- 在权威dns服务器处得到ip地址,本地dns服务器再将ip地址返回给客户端
- 负载均衡:一个域名多个ip地址
- 全局负载均衡:北京用户访问北京服务器,上海用户访问上海服务器
-
流程:GSLB(Global Server Load Balance)全局负载均衡器,是一个专门的设备或服务器,通过自定义策略实现负载均衡
- 第一层GSLB:区分运营商
- 第二层GSLB:区分地域,区分依据都是本地dns服务器所在地址或运营商
第十九节 httpdns
- 跨机房的负载均衡和容灾多使用DNS来实现
- httpdns就是基于http协议,自己搭建的dns服务器集群,分布在多个网点和运营商。使用httpdns需要绕过默认的dns路径,就不能使用默认的客户端。在手机上就是嵌入支持httpdns的客户端sdk。
- 解决的2大问题:
- 解析速度和更新速度的平衡问题
- 智能调度
- 缓存更新2大机制:同步&异步
第二十节 CDN
-
CDN分发系统架构
- 防盗链:时间戳加密
- 支持流媒体协议:流媒体数据量大,往往主动推、预处理(转码、分片等)
第二十一节 数据中心
-
三层网络结构
-
接入层:服务器连接到接入层
-
汇聚层:再然后是汇聚层
- 核心层:核心层外面是边界路由器和安全设备
-
-
大二层
三层设备通过等价路由,二层设备通过TRILL协议(强化版的ARP)
东西流量问题:叶脊网络(Spine/Leaf)