#前言
本篇文章根据High Performance Browser Networking(opens new window)进行相关总结
#延迟和带宽
影响网络最主要的两个因素是延迟(latency)和带宽(bandwidth)
#延迟
关于延迟的组成部分:传播延迟(Propagation delay)、传输延迟(Transmission delay)、处理延迟(Processing delay)和排队延迟(Queuing delay)
- 传播延迟:客户端到服务器的传输信息时长,与距离和信号传播速度有关
- 传输延迟:把比特推入数据链路时长,与分组长度和数据比率有关
- 处理延迟:处理分组头部、检查错误和决定分组目的等处理时长
- 排队延迟:分组(packet)在队列中等待处理时长
往返时间RTT(round-trip time)
减少传播延迟的措施:
- CDN(Content delivery network),能够有效的减少传播距离
延迟是大多数网站的性能瓶颈
#带宽
- 光纤链路的总带宽是每个通道的速率*多路复用通道数倍数
- 波分复用WDM(wavelength-division multiplexing),使用不同波长的光来传输数据来达到复用光纤的目的
#HTTP
超文本传输协议HTTP(The Hypertext Transfer Protocol)
#背景历史
0.9: 非官方的称谓
包括的功能:
- 客户端-服务器、请求-响应协议
- ASCII协议,基于TCP/IP
- 设计用于传输HTML
- 在每次请求之后服务器和客户端都会断开连接
1.0:参考性的RFC,不是标准
包括的功能:
- 请求包含多条首部字段
- 响应对象前面添加了一个响应状态行
- 响应对象有自定义首部字段
- 响应对象不局限于超文本
- 在每次请求之后服务器和客户端都会断开连接
- 由http1.1反向移植了Connection: Keep-Alive
请求和响应头部还是用ASCII编码,但是响应对象有HTML文件、文本文件、图片等,除媒体类型协商之外,还记录了内容编码、字符集支持、多部分类型(multi-part types)、认证、缓存、代理行为、日期格式化等
1.1:互联网标准
厘清了协议歧义的地方,加入了很多性能优化,持久连接、分块编码传输、字节范围请求、增强的缓存机制、传输编码和请求管道
相对于1.0来说新增的重要特性:
- 持久化连接以支持连接重用
- 分块传输编码以支持流式响应
- 请求管道支持并行请求处理
- 改进更好的缓存机制
2.0
目的:改进传输性能,实现低延迟和高吞吐量,首部、值和使用场景不变
#比较
HTTP1.0采用了Last-Modified
和If-Modified-Since
和Expires
作为缓存判断标准,而HTTP1.1则新增了Cache-Control
和ETag
、If-None-Match
Expires
: 1.0规范,是服务端返回的资源到期时间,该时间是由服务端产生的,因此和客户端的时间存在误差,这个是一个绝对时间,可能由于客户端时间与服务器时间不一致造成缓存一直存在或失效Last-Modified
: 1.0规范,为一个GMT格式的时间浏览器第一次访问这个资源时,在响应头的header加上If-Modified-Since
: 当再次返回该资源时,客户端请求头需要包含这个值,这个值与服务器的值对比,如果资源未改变,则返回304Cache-Control
: 1.1规范,private
-只允许终端用户缓存,public
-所有用户都可以缓存,包括终端用户和CDNEtag
: 1.1规范,etag的标识符由服务器规则生成的字符,不是时间If-None-Match
: 客户端请求头上标记,与If-Modified-Since
功能类似强缓存的优先级比协商缓存高
强缓存不和服务器确认,因此状态码是200 OK(from dist/memory cache),缓存内容存在内存或硬盘中,先内存再硬盘
浏览器与服务器确认了一次缓存的有效性,因此返回的是304
是否缓存是通过浏览器判断的
HTTP1.1 新增了请求方式PUT、DELETE、OPTIONS(请求查询服务器的性能或查询与资源相关的选项和需求)
HTTP1.1 默认使用长连接,而HTTP1.0需要指定Connection: Keep-Alive
HTTP2.0与HTTP1.x的区别
HTTP3基于UDP,在上层协议(应用层)保证可靠性
TIPS:cookie的有效时间设置为0时,一般是浏览器关闭(而不是tab页)时清除
#TCP组成
核心的两个协议:IP和TCP
IP: 提供主机到主机的路由和寻址
TCP: 提供在不可靠通道上运行的可靠网络的有效抽象
#三次握手(Three-Way Handshake)
所有的TCP连接都是以三次握手开始
为什么需要三次握手呢?因为在数据交换之前,必须就开始数据包序列号以及双方的连接特定变量达成一致
SYN:包含随机序列号x、TCP标志和选项的SYN数据包
SYN ACK: 回复SYN-ACK并指定rwnd
ACK: 确认SYN-ACK,指定其rwnd大小并发送HTTP GET请求
为避免拥塞奔溃,TCP多种机制来控制双向发送数据的速率,流量控制、拥塞控制和拥塞避免
#流量控制
通告它自己的接收窗口(rwnd),接收窗口在RFC 1323协议中从2^16(65535)字节提高到1GB
#拥塞控制
慢启动
由于一开始发送发和接收方都不知道新连接开始时的可用带宽,因此需要一个机制来使它们的速度适应网络的变化
拥塞窗口大小(cwnd),针对的是TCP与下层协议之间的最大可用带宽
初始拥塞窗口为10段(10*1460byte)≈14kb
慢启动限制了可用带宽的吞吐量,对于小型传输的性能产生了不利的影响
慢启动重启:在连接空闲一段时间后重置连接的拥塞窗口
#拥塞避免
慢启动在初始化连接后每次往返传输数据量加倍,直到超过接收器的流量控制窗口或系统配置的拥塞阈值或数据包丢失,此时使用拥塞避免算法接管
PRR为RFC 6937规定的新的拥塞避免算法
#带宽延迟积(BandWidth-Delay Product)
往返时间和目标数据速率的函数
#队首阻塞(Head-of-Line Blocking)
在尝试从套接字读取数据时看到了传递延迟,这种效应称为TCP队首阻塞
#UDP组成
用户数据报协议UDP(User Datagram Protocol),又称为空协议(null protocol),经常用于引导其他传输协议
数据报:通常用来描述那些通过不可靠的服务传输的分组,既不保证送达,也不发送失败通知。UDP数据报必须封装在IP分组中,应用程序必须读取完整的消息,故数据报不能分片
分组:指代任何格式化的数据块
UDP应用:DNS(Domain Name System)、WebRTC(Web实时通信)
IP层的主要任务是按照地址从源主机向目标主机发送数据报
UDP协议会用自己的分组结构封装用户消息,只增加了4个字段,源端口、目标端口、分组长度和校验和
UDP无服务的含义:
- 不保证消息交付,不确认、不重传、无超时
- 不保证交付顺序,不设置序号、不重排、不发生队首阻塞
- 不跟踪连接状态,不必建立连接或重启状态机
- 不需要拥塞控制,不内置客户端或网络反馈机制
网络地址转换器(Network Address Translators),解决IPv4地址即将耗尽的一个方案,每个NAT设备负责维护一个表,表中包含本地IP和端口到全球唯一IP和端口的映射
#TLS
安全套接字层协议SSL(Secure Sockets Layer)
传输层安全TLS(Transport Layer Security),在标准化SSL中改名为TLS,是SSL3.0的升级版
TLS协议的目标是在它之上的应用提供三个基本服务:加密、身份验证和数据完整性
在TCP握手基础上最多还需要两次额外的往返,这些都会增加实际交互数据之前的等待时间
#应用层协议协商ALPN(Application Layer Protocol Negotiation)
TLS拓展,能在TLS握手的同时协商应用协议,从而省掉了HTTP的upgrade机制所需的额外往返时间
#服务器名称指示SNI(Server Name Indication)
一个IP地址为多个站点提供服务,每个站点都有自己的TLS证书
#会话标识符(Session Identifier)
节省一次往返,省掉用于协商共享加密密钥的公钥加密计算,重用之前的会话数据
#会话记录单(Session Tickets)
客户端保存服务器返回的会话记录信息
#TLS记录协议(TLS Record Protocol)
负责识别不同的消息类型(握手、警告或数据)以及每条消息的安全和完整性
TLS记录最大为16KB,接收到的数据会被切分为块