连接管理

TCP连接

HTTP 通信由 TCP/IP 承载。

TCP的可靠数据管道

TCP 为 HTTP 提供了一条可靠的比特传输管道。TCP 会按序、无差错的承载 HTTP 数据。

一次 HTTP 请求过程:

NAME

TCP流是分段的、由IP分组传送

HTTP 发送一条报文时,会以流的形式将报文数据的内容通过一条打开的 TCP 连接按序传输。TCP 收到数据流以后,将数据流分成段,并将段封装在 IP分组(IP数据报) 中,通过因特网传输。

每个 TCP 段都由 IP 分组承载,从一个 IP地址发往另一个 IP地址。每个 IP分组中包括:

  • 一个 IP 分组首部(通常20字节)
  • 一个 TCP 段首部(通常20字节)
  • 一个 TCP 数据块(0 或多个字节)
NAME

保持TCP连接持续不断的运行

TCP 通过端口号来保持连接持续不断的运行。

TCP连接是通过 4 个值来识别的:< 源 IP 地址、源端口号、目的 IP 地址、目的端口号 >

这 4 个值共同定义了一条连接。

一个 IP 分组:

NAME

用TCP套接字编程

OS 提供了操作 TCP 连接的 API。该 API 向 HTTP 隐藏了所有 TCP 和 IP 的细节。

TCP 套接字通信过程:

NAME

TCP性能

HTTP事务的时延

主要原因:

  1. 客户端根据 URL 确定服务器的 IP 和端口号,即DNS解析时间。
  2. 客户端向服务器发送一条 TCP 连接请求,并等待服务器返回一个接收应答。即建立 TCP连接的时间。
  3. 客户端通过已建立的 TCP 管道发送 HTTP 请求,即 HTTP 报文的传输和处理时间。
  4. 服务器返回 HTTP 响应,即 HTTP 报文传输时间。

性能聚焦区域

  1. TCP 连接建立握手
  2. TCP 慢启动拥塞控制
  3. 数据聚集的 Ngale 算法
  4. 用于捎带 ACK 的 TCP 延迟确认算法
  5. TIME_WAIT 时延和端口耗尽

HTTP连接的处理

常被误解的Connection首部

Connection 首部承载 3 种不同类型的标签:

  1. HTTP 首部字段名,列出只与此连接有关的首部;
  2. 任意标签值,用于描述此连接的非标准选项;
  3. 值 close,说明操作完成之后需关闭这条持久连接。

串行事务处理时延

一个页面包含多个元素需要加载时,如果每个事务都要(串行的建立)一条新的连接,那么连接时延和慢启动时延就会叠加起来。

一些提供 HTTP 连接性能的方法:

  1. 并行连接:通过多条 TCP 连接发起并发的 HTTP 请求。
    1. 每个事物打开/关闭新的连接,耗费时间和带宽
    2. TCP 慢启动的特性导致每条新连接的性能下降
    3. 受内存与带宽限制,可打开的并行连接数有限
  2. 持久连接:重用 TCP 连接,以消除连接及关闭延时。
    1. 管理多个持久连接的操作复杂度
    2. HTTP/1.0+ Keep-Alive
    3. HTTP/1.1 默认开启持久连接
  3. 管道化连接:通过共享的 TCP 连接发起并发的 HTTP 请求。将多条请求放入队列,当第一条请求发出后,队列中的请求就可以发送了。
  4. 复用的连接:交替传送请求和响应报文。

关闭连接

  1. 完全关闭与半关闭:套接字调用close()会将 TCP 连接的输入输出信道都关闭,称为完全关闭。调用shutdown()单独关闭输入或输出信道,称为半关闭。
  2. TCP 关闭及重置错误
  3. 正常关闭:首先关闭输出信道,然后等待另一端关闭输出信道,当两端都确认不再发送任何数据之后,连接被完全关闭。