前提:HTTP 是应用层协议,下层依靠 TCP 传输层,IP 网络层。
HTTP/1.0:非持续连接,每个对象新建一次 TCP 连接
HTTP/1.1:持续连接(默认开启) ,分两种:非流水线、流水线
TCP 本身:三次握手建立,慢开始、拥塞避免、快重传、快恢复拥塞控制。
完整步骤

- 用户操作:浏览器点击 www.baidu.com 但浏览器只知道域名,并不知道服务器 IP,第一步做DNS 域名解析。
(1)DNS 域名解析(应用层,UDP)
浏览器缓存 → 操作系统 hosts 文件 → 本地 DNS 服务器(递归查询)→ 根 DNS → 顶级域 DNS (.com) → 权威 DNS 服务器,最终拿到百度服务器 IP 地址,例如:180.101.49.11。(以迭代查询为例)

DNS 默认 UDP,超过 512 字节改用 TCP。解析完成,得到目标 IP。
(2)建立 TCP 连接(传输层,三次握手)
浏览器客户端(随机端口,比如 5200) ↔ 服务器 80 端口

TCP 连接建立阶段就已经启动拥塞控制:初始拥塞窗口 cwnd=1 MSS,慢开始开始。
(3)http协议
|------------------|--------------|-----------------------|
| 版本 | 连接类型 | 特点 |
| HTTP/1.0 | 非持续连接 | 每对象新建 TCP,传完就断 |
| HTTP/1.1 持续‑非流水线 | 持久 TCP,请求排队 | 收到完整响应才发下一个请求 |
| HTTP/1.1 持续‑流水线 | 持久 TCP,连续发请求 | 不用等响应,批量发请求;HTTP 队头阻塞 |
HTTP/1.0 【非持续连接】
特点:每获取一个网页对象,就要新建一套 TCP 连接,传输完立刻断开 TCP 网页举例:网页包含 1 个 HTML 主页 + 2 张图片(一共 3 个对象)
流程:
-
TCP 三次握手建立连接
-
客户端发送 HTTP 请求报文
GET /index.html HTTP/1.0 -
服务器返回 HTTP 响应,把 HTML 页面传回
-
TCP 四次挥手断开本次连接
现在要拿第一张图片:重新再来一遍三次握手 → 请求图片 → 响应 → 断开 第二张图片:再次三次握手 → 请求图片 → 响应 → 断开

缺点:每个对象都要付出三次握手 RTT 开销;大量对象时延爆炸。
HTTP/1.1 【持续连接,默认开启 Connection: keep‑alive】
同一个 TCP 连接,传输多个对象,传输完一段时间空闲才断开,不用传一个断一个。 持续连接分两种模式:非流水线、流水线
模式 A:持续连接 ------ 非流水线(HTTP/1.1 默认早期模式)
规则:客户端必须收到上一个对象完整响应之后,才发送下一个请求 同一个 TCP 连接,HTML + 两张图片:
-
TCP 三次握手建立连接
-
客户端:GET html → 等待完整 html 响应回来
-
收到 html 全部数据后,才发 GET pic1 → 等待 pic1 完整响应
-
收到 pic1 全部数据后,才发 GET pic2 → 等待 pic2 完整响应
-
全部对象传输完毕,空闲超时后 TCP 断开。
请求必须排队,不能并发发请求。

模式 B:持续连接 ------ 流水线(pipelining)HTTP/1.1
规则:客户端可以连续发送多个请求,不用等前一个确认响应回来,请求一股脑丢出去;服务器按请求顺序依次返回响应。
-
TCP 三次握手建立连接
-
客户端连续发送:GET html;GET pic1;GET pic2 (连续发出去,不等回复)
-
服务器按顺序返回 html → pic1 → pic2
-
全部接收完毕,空闲超时断开 TCP。

(4)HTTP 事务结束后断开 TCP 连接
HTTP/1.1 持续连接不会传输完立刻断开;一段时间没有新请求,服务器主动关闭 TCP(四次挥手)。 如果报文头部写 Connection: close,则传输完立刻断开,退化成类似 1.0 行为。
