ping 延迟、三次握手、 TLS/SSL 握手 延迟
计算机网络

ping 延迟、三次握手、 TLS/SSL 握手 延迟

JACIN··10 分钟阅读

  • Ping 显示的 time=44ms 就是一个 RTT(往返时间)。 它代表“去 + 回”的总时间。
  • 底层绝对没有除以 2。 操作系统显示的数字就是 {回来} - {出发}。

物理极限 与损耗#

光到底有多快?

image|690x378

image|690x317

结论:

如果你们之间拉了一条笔直的“完美光纤”,中间没有任何路由器阻拦,物理极限只需要 22ms 就能跑个来回!

既然理论极限是 22ms,你测出来是 44ms,说明你的网络并不快,甚至还有很大的损耗空间

多出来的时间花在了这三个地方:

  1. 路由转发(过路费)
  • 数据包从广州到北京,中间可能要经过 10~20 个骨干网路由器(Hops)。
  • 每个路由器都要拆包、看地址、转发,每个节点消耗 0.1ms~1ms 不等。
  1. 线路折返(走弯路)
  • 光纤不是两点连直线,可能要先绕到武汉,再绕到郑州,甚至有的线路配置不好会绕更远。
  1. 电光转换
  • 交换机和路由器处理的是电信号,光纤传的是光信号,中间频繁的“光变电、电变光”也会消耗微秒级的时间。

TCP 三次握手延迟#

三次握手只需要消耗 1 个 RTT 的时间成本,而不是 1.5 个或 3 个。

text
很多人以为三次握手要一来一回再一来,其实最后一步是“由于惯性”顺便带过去的。

0ms: 客户端发送 SYN (第一次握手)。

22ms: 服务器收到 SYN,发送 SYN-ACK (第二次握手)。

44ms: 客户端收到 SYN-ACK。

关键点来了! 此时客户端已经确认连接建立成功了。

客户端发送 ACK (第三次握手)。

注意:客户端不需要等这个 ACK 到达服务器,就可以立刻开始发下一个阶段(TLS握手)的数据包!

所以,在时间成本上,TCP 握手只卡了你 44ms。

TLS/SSL 握手 (HTTPS 必须项,消耗 1~2 RTT)#

text
你的 URL 是 https://,所以 TCP 建好后,还不能传 JSON,必须先协商加密。

44ms (紧接着刚才的 ACK): 客户端发送 Client Hello。

66ms: 服务器收到。服务器发送 Server Hello + 证书。

88ms: 客户端收到证书。

(如果是 TLS 1.3,通常 1 个 RTT 就搞定了;如果是老版本 TLS 1.2,可能还需要再来回一次,那就是 +44ms)

我们按最快情况(TLS 1.3)算,这里又消耗了 1 个 RTT (44ms)。

目前累计耗时:44ms (TCP) + 44ms (TLS) = 88ms。 (这就是纯建立连接的“过路费”)

TCP 协议捎带机制#

第三次握手(ACK)是不需要单独跑一趟空车的,它直接背着你的 HTTP 请求数据(Data)一起过去了。

  1. 为什么 TCP 握手只消耗 1 个 RTT?

假设你在广州,服务器在北京。单程跑一趟 22ms。

  • 0ms (你): 发送 SYN 包(第一次握手)。
    • (包在路上跑了 22ms...)
  • 22ms (服务器): 收到 SYN。服务器同意连接,发送 SYN-ACK 包(第二次握手)。
    • (包又跑了 22ms...)
  • 44ms (你): 收到 SYN-ACK。
    • 关键时刻! 此时你的操作系统内核(Kernel)已经认为**“连接通了”**。
    • 你的 aiohttp 库立刻把 ACK 包(第三次握手)HTTP 请求数据(你的 JSON) 打包在一起,发出去了!

关于断开连接(四次挥手)#

答案:不算在你这次请求的耗时里。

想象你去送外卖:

  1. 建立连接:你敲门(SYN),顾客开门(SYN-ACK)。耗时 1 RTT。
  2. 传输数据:你把外卖递给顾客,顾客接过去。
  3. 请求结束:顾客拿到外卖,说“谢谢”,关门。此时你的任务已经完成了,计时结束。
  4. 断开连接:你转身下楼、骑车离开(四次挥手)。

重点:你转身离开的时间(断开连接),并不影响顾客拿到外卖的时间。你的 Python 代码在拿到 response 的那一刻,业务逻辑就走完了。后面后台默默断开连接的动作,用户是感知不到延迟的。

HTTP 请求(不加密):是 2 个 RTT#

  • 第 1 个 RTT(搭桥)
    • :SYN
    • :SYN-ACK
    • 耗时:建立 TCP 连接。
  • 第 2 个 RTT(运货)
    • :ACK(第三次握手) + HTTP 请求数据(顺便带过去的)
    • :HTTP 响应数据
    • 耗时:数据传输。

总计:2 个 RTT。

HTTPS 请求(加密):是 3 个 RTT#

  • 第 1 个 RTT(搭桥)
    • TCP 握手(SYN <-> SYN-ACK)。
  • 第 2 个 RTT(对暗号 - 多出来的这一次)
    • :ACK + Client Hello(我要建立加密连接!)
    • Server Hello + 证书(这是我的证件和钥匙!)
    • 注:这是 TLS 1.3 的情况,如果是老版本可能要往返两趟。
  • 第 3 个 RTT(运货)
    • :发送加密的请求数据。
    • :收到加密的响应数据。

总计:3 个 RTT。

  • Ping (1 RTT) = 44ms
  • HTTP (2 RTT) = 88ms + 服务器处理
  • HTTPS (3 RTT) = 132ms + 服务器处理

评论

还没有评论,来发第一个吧