ping是服务器往返时长还是请求发起到服务端接收的时长?JS如何计算ping
ping的定义澄清
标准ICMP协议的ping测量的是往返总时长(RTT,Round-Trip Time),即从客户端发出请求的瞬间,到客户端完整收到服务器响应的瞬间的总时长。单向时长需要客户端和服务端时钟高度同步(毫秒级误差以内),普通公网场景几乎无法实现,日常所说的ping值均指往返时延。
计算方式与代码修正
你当前的代码存在异步时序问题:没有等待response.json()异步操作完成就记录了afterRequest,且fetch的promise决议时机是响应头到达客户端,而非响应体完全接收,会导致时间统计不准,修正后的参考代码如下:
async function getResponseTimeOnce(){ const times = {}; times.beforeRequest = Date.now(); const response = await fetch("https://randobytes.yimmee.repl.co/ping"); // 假设接口返回格式为 {serverReceive: 服务端接收请求时间戳, serverSend: 服务端发送响应时间戳} const serverTime = await response.json(); times.serverReceive = serverTime.serverReceive; times.serverSend = serverTime.serverSend; // 响应体完全解析完成后再记录客户端结束时间 times.afterRequest = Date.now(); return times; }
你可以根据需求选择对应的计算逻辑:
- 如果你需要的是包含服务端处理耗时的HTTP层往返时延,直接用
times.afterRequest - times.beforeRequest即可,这个值是用户侧实际感知的接口响应耗时,最常用。 - 如果你需要更接近ICMP ping的纯网络传输往返时延,可以排除服务端处理的耗时,公式为:
(times.afterRequest - times.beforeRequest) - (times.serverSend - times.serverReceive)
小提示:用HTTP请求测的ping值会比系统原生ICMP ping值略高,因为包含了TCP握手、TLS握手、HTTP协议解析等额外开销。
内容的提问来源于stack exchange,提问作者TGP1cccul8r
相关产品推荐
相关产品推荐

