连接管理
TCP连接
HTTP 通信由 TCP/IP 承载。
TCP的可靠数据管道
TCP 为 HTTP 提供了一条可靠的比特传输管道。TCP 会按序、无差错的承载 HTTP 数据。
一次 HTTP 请求过程:
TCP流是分段的、由IP分组传送
HTTP 发送一条报文时,会以流的形式将报文数据的内容通过一条打开的 TCP 连接按序传输。TCP 收到数据流以后,将数据流分成段,并将段封装在 IP分组(IP数据报) 中,通过因特网传输。
每个 TCP 段都由 IP 分组承载,从一个 IP地址发往另一个 IP地址。每个 IP分组中包括:
- 一个 IP 分组首部(通常20字节)
- 一个 TCP 段首部(通常20字节)
- 一个 TCP 数据块(0 或多个字节)
保持TCP连接持续不断的运行
TCP 通过端口号来保持连接持续不断的运行。
TCP连接是通过 4 个值来识别的:< 源 IP 地址、源端口号、目的 IP 地址、目的端口号 >
这 4 个值共同定义了一条连接。
一个 IP 分组:
用TCP套接字编程
OS 提供了操作 TCP 连接的 API。该 API 向 HTTP 隐藏了所有 TCP 和 IP 的细节。
TCP 套接字通信过程:
TCP性能
HTTP事务的时延
主要原因:
- 客户端根据 URL 确定服务器的 IP 和端口号,即DNS解析时间。
- 客户端向服务器发送一条 TCP 连接请求,并等待服务器返回一个接收应答。即建立 TCP连接的时间。
- 客户端通过已建立的 TCP 管道发送 HTTP 请求,即 HTTP 报文的传输和处理时间。
- 服务器返回 HTTP 响应,即 HTTP 报文传输时间。
性能聚焦区域
- TCP 连接建立握手
- TCP 慢启动拥塞控制
- 数据聚集的 Ngale 算法
- 用于捎带 ACK 的 TCP 延迟确认算法
- TIME_WAIT 时延和端口耗尽
HTTP连接的处理
常被误解的Connection首部
Connection 首部承载 3 种不同类型的标签:
- HTTP 首部字段名,列出只与此连接有关的首部;
- 任意标签值,用于描述此连接的非标准选项;
- 值 close,说明操作完成之后需关闭这条持久连接。
串行事务处理时延
一个页面包含多个元素需要加载时,如果每个事务都要(串行的建立)一条新的连接,那么连接时延和慢启动时延就会叠加起来。
一些提供 HTTP 连接性能的方法:
- 并行连接:通过多条 TCP 连接发起并发的 HTTP 请求。
- 每个事物打开/关闭新的连接,耗费时间和带宽
- TCP 慢启动的特性导致每条新连接的性能下降
- 受内存与带宽限制,可打开的并行连接数有限
- 持久连接:重用 TCP 连接,以消除连接及关闭延时。
- 管理多个持久连接的操作复杂度
- HTTP/1.0+ Keep-Alive
- HTTP/1.1 默认开启持久连接
- 管道化连接:通过共享的 TCP 连接发起并发的 HTTP 请求。将多条请求放入队列,当第一条请求发出后,队列中的请求就可以发送了。
- 复用的连接:交替传送请求和响应报文。
关闭连接
- 完全关闭与半关闭:套接字调用
close()
会将 TCP 连接的输入输出信道都关闭,称为完全关闭。调用shutdown()
单独关闭输入或输出信道,称为半关闭。 - TCP 关闭及重置错误
- 正常关闭:首先关闭输出信道,然后等待另一端关闭输出信道,当两端都确认不再发送任何数据之后,连接被完全关闭。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.