TCP UDP
TCP 的流量控制
所谓流量控制就是:让发送方的发送速率不要太快,要让接收方来得及接收。
TCP 是利用滑动窗口实现流量控制:
接收端维护一个接收缓冲区;
每接收到一段数据,缓存占用增加;
每被应用程序读取一部分数据,缓存占用减少;
每发送一个 ACK,都包含当前可用的窗口大小 rwnd。
特殊情况:如果 rwnd=0,发送端必须停止发送数据。此时发送端会定期发送零窗口探测包(仅携带 1 字节的数据)来查看窗口是否恢复。
TCP 的拥塞控制
核心思想是:根据网络反馈(ACK、丢包、超时),动态调整发送窗口 cwnd
的大小。
拥塞控制的四个阶段:
慢开始
初始时拥塞窗口大小
cwnd = 1
(单位通常是 MSS);每收到一个 ACK,拥塞窗口指数级增长(× 2);
当
cwnd >= ssthresh
(慢开始门限)时,进入 拥塞避免 阶段。
拥塞避免
拥塞窗口 cwnd 按照线性规律增长(每受到一个 ACK,+ 1);
避免增长过快引发拥塞。
超时重传
如果发生丢包,触发超时重传,说明网络环境更糟糕;
调整慢开始门限 ssthresh = cwnd / 2
拥塞窗口 cwnd = 1,重新进入慢开始。
快恢复
如果收到 3 个重复的 ACK,说明发生丢包但网络仍有一定传输能力。
调整慢开始门限 ssthresh = cwnd / 2
拥塞窗口 cwnd = ssthresh,进入拥塞避免阶段,这样可以减少性能损失。
UDP 与 TCP 的区别
HTTP
HTTPS 的加密流程
HTTP 的数据是明文传输,容易被窃听、篡改。HTTPS 使用 TLS 对数据进行加密,防止窃听、篡改和伪造。
使用 TLS 协议(传输加密协议)对数据进行对称加密。具体加密流程如如下:
首先是客户端与服务端进行 TCP 三次握手建立连接;
客户端发送:Client Hello 请求,包含客户端支持的 TLS 版本、支持的加密算法、随机数 client_random;
服务端返回:Server Hello 请求,从中选择合适的 TLS 版本、加密算法、随机数 server_random 以及网站的证书发送给客户端;
客户端收到证书后:
从操作系统中内置的 CA 公钥对证书进行验证,如果证书被篡改则中断连接;
验证成功,从证书中提取服务端的 Server 公钥,生成一个随机的 48 字节预主密钥(pre-master key),使用公钥加密,发送给服务端。
服务端收到加密后的数据,通过私钥解密得到预主密钥;
双方通过 预主密钥 + client_random + server_random 生成会话密钥。之后进行对称加密的数据传输。
HTTP 1.1、2.0、3.0
什么是 HTTP 1.1?
长链接:HTTP 从 1.1 版本开始默认使用长链接。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
什么是 HTTP 2.0?
头部压缩:HTTP报文的头部信息大量且重复:采用头部压缩,节省带宽
二级制编码:之前的消息体是文本格式,现在采用二级制编码,提高传输效率;
并发传输:通过 Stream 这个设计,多个 Stream 复用一条 TCP 连接,达到并发的效果;
主动推送:服务器支持主动推送资源;
HTTP 3.0 是什么?
HTTP2 已经很优秀了,但是美中不足的是:
队头阻塞:TCP 必须保证收到的数据是有序的,当前面的 TCP 报文丢失等待重传时,后面的数据即使受到了也无法交付给应用层;
TCP 和 TLS 的握手延迟:需要经过 TCP 三次握手和 TLS 四次握手(TLS 1.2)的过程;
网络迁移需要重新建立连接:一旦目标的 IP 或端口发生变化,就需要重新建立连接,不利于移动端的场景。
因此,HTTP 3.0 放弃了 TCP 协议,使用 UDP 作为传输层协议,并基于 UDP 实现类 QUIC 协议:
基于 UDP 实现可靠传输;
无队头阻塞;
建立连接速度快;
支持连接迁移,通过 ID 唯一标识会话。
有什么优缺点?
HTTP 1.1 的优点:相比 HTTP/1.0,大幅减少了连接建立和释放的开销。实现简单,兼容性好,至今仍是主流协议。确定就是队头阻塞、头部冗余。
而 HTTP 2.0 和 3.0 虽然解决了很多问题,但是他们都部署复杂,具有兼容性问题,并没有广泛应用。
常见的 HTTP 状态码
2xx 成功状态码
200:请求成功
201:Created,资源已创建
204:notContent,请求成功但是无返回内容
3xx 重定向状态码
304:资源未修改,使用本地缓存
4xx 客户端错误
400:请求格式错误
401:未授权
403:拒绝访问,无权限
404:请求的资源不存在
405:请求方法被禁止
429:请求过多被限流
5xx 服务端错误
500:服务器内部错误
502:网关错误
504:网关超时