測量兩台機器往返延遲(RTT)的經典方法:
T1T2 並發送時間 T3T4則 RTT = (T4 - T1) - (T3 - T2),時鐘偏移 offset = ((T2 - T1) + (T3 - T4)) / 2(假設去程回程對稱)。
本示例簡化為 16 位元組定長訊息:
struct Message { int64_t t1; int64_t t2; }; // 各 8 位元組,共 16 位元組
Client 以 200ms 間隔發送;Server 收到後立即回射(耗時微秒級,忽略不計)。因訊息固定長度,無需編解碼器,直接在 onMessage 中以 while (buf->readableBytes() >= 16) 解碼。
RTT = 150 us, clock offset = 850 us
表示 Server 時鐘比 Client 快 850 微秒。此偏移值可用於校正分散式系統中的單程延遲測量:若直接相減得到 -700us(顯然錯誤),加上 850us 校正後得 150us,符合實際。
RTT/2 作為單程延遲?(去程回程往往不對稱)TCP_NODELAY。while 改為 if,高併發下訊息會堆積導致處理延遲。雖然用戶態無法實現完美精確計時,但結合高精度 timerfd、固定長度協議、時鐘偏移校正,足以支撐分散式系統的延遲監控與時間同步需求。