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:网关超时