对应章节:应用层 → HTTP;传输层 → TCP
核心:先画时间线,再数 RTT,别死背一个公式。
1. RTT 是什么
RTT:
Round Trip Time
往返时间
大白话:
一个消息从客户端到服务器,再有响应回来,大约经历一个 RTT。
HTTP 题经常忽略:
数据真正在线路上的发送时延
于是很多过程就可以按 RTT 来数。
二、最基本的两个 RTT
如果从"开始建立 TCP 连接"算起:
第1个RTT:
TCP建立连接
第2个RTT:
发送HTTP请求
服务器返回对象
所以:
建立一次TCP连接 + 获取一个小对象
≈ 2 RTT
注意:
如果题目说"从发出 HTTP 请求开始",通常就不再计算前面的 TCP 建连 RTT。
这是最容易漏的条件。
三、HTTP/1.0 非持久连接
非持久:
一个TCP连接只传一个对象
例如主页面引用 3 张图片:
HTML
图片1
图片2
图片3
如果不能并行建立 TCP:
每个对象:
1 RTT 建TCP
+
1 RTT 请求/响应
=
2 RTT
一共 4 个对象:
4 × 2 RTT
= 8 RTT
秒杀
HTTP/1.0
非持久
不能并行
N个引用对象
总对象数 = N+1
RTT = 2(N+1)
前提:
从TCP连接建立开始计时
且忽略对象传输时延
四、HTTP/1.1 持久非流水线
持久连接:
只建立一次TCP
后续对象继续使用同一连接
非流水线:
前一个请求响应完成
才能发下一个请求
例如:
主页面 + 3张图片
若从建立 TCP 开始:
1 RTT:建立TCP
1 RTT:拿HTML
1 RTT:拿图片1
1 RTT:拿图片2
1 RTT:拿图片3
总共:
5 RTT
秒杀
若有 N 个引用对象:
1 RTT 建连
+
1 RTT 主页面
+
N RTT 引用对象
= N+2 RTT
五、HTTP/1.1 持久流水线
流水线:
拿到主页面、知道所有引用对象后,可以连续发出多个请求,不必等前一个响应回来。
例如:
HTML引用3张小图片
时间:
1 RTT:建立TCP
1 RTT:获取HTML
1 RTT:连续请求3张图片并收到响应
总共:
3 RTT
所以理想情况下:
持久流水线
= 1 + 1 + 1
= 3 RTT
但是注意:
如果题目又给了 MSS、拥塞窗口、慢开始,就不能只套"3 RTT"。
还要看 TCP 一轮到底能发多少数据。
六、题型1:持久非流水线
题意:
HTTP/1.1
持续非流水线
主页面引用5张图片
一次请求-响应 = 1 RTT
从发出主页面HTTP请求开始计时
因为已经从 HTTP 请求开始,不算 TCP 建连。
过程:
1 RTT:主页面
5 RTT:5张图片依次请求
所以:
6 RTT
核心:
"从HTTP请求开始"
→ 不要额外加建连RTT
七、题型2:非持久连接
题意:
HTTP/1.0
非持久
不能并行TCP
1个主页面
7张图片
从建立TCP连接开始计时
忽略发送时延
一共:
8个对象
每个对象:
2 RTT
所以:
8 × 2 = 16 RTT
八、题型3:RTT + MSS + TCP慢开始
题意:
HTTP/1.1
主页面大小 = 1 MSS
图片大小 = 3 MSS
RTT = 10ms
从请求建立TCP连接开始
按408常用慢开始模型:
初始cwnd = 1 MSS
时间线:
第1 RTT:
建立TCP
第2 RTT:
发送1 MSS的HTML
确认回来后 cwnd:1 → 2 MSS
第3 RTT:
图片先发2 MSS
确认回来后窗口继续增大
第4 RTT:
发送图片剩余1 MSS
总计:
4 RTT
RTT = 10ms:
4 × 10ms = 40ms
关键:
一旦题目出现 MSS、cwnd、慢开始,就要把"每轮能发多少 MSS"画出来。
九、题型4:自己练
条件:
RTT = 5ms
HTTP/1.1
从建立TCP连接开始
HTML = 1 MSS
图片 = 7 MSS
初始cwnd = 1 MSS
忽略传输时延
过程:
第1 RTT:建连
第2 RTT:
HTML 1 MSS
cwnd → 2
第3 RTT:
图片发2 MSS
剩5 MSS
cwnd → 4
第4 RTT:
图片发4 MSS
剩1 MSS
cwnd → 8
第5 RTT:
图片发剩余1 MSS
总计:
5 RTT = 25ms
十、做 RTT 题的固定步骤
不要上来套公式,先写:
1. 从什么时刻开始计时?
2. TCP连接是否已经建立?
3. HTTP是持久还是非持久?
4. 是否流水线?
5. 有几个对象?
6. 是否给了MSS/cwnd/慢开始?
然后画:
RTT1:
RTT2:
RTT3:
...
基本不会错。
十一、秒杀口诀
非持久:
每个对象一般要重新建TCP
持久:
TCP只建一次
非流水:
一个请求回来再发下一个
流水:
多个请求可以连续发
出现MSS/cwnd:
别只数HTTP
还要数TCP发送轮次