mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 18:20:43 +00:00
阶段3 管理页 - 清掉全部深色主题残留(地址框 #0b1220、按钮悬停 #262c36、 删除按钮 #2d1214 等 11 处),现在 0 处深色 - 接口全部正常:health / downloads / netcheck 阶段4 局域网诊断 - 查清楚"电脑不在同一网络"是怎么回事:被控端是**对的** (lan_ips() 报 ['192.168.2.64', '169.254.83.107'],真实地址排第一), 是手表当时真不在 192.168.2.x —— 可能连了 5G 频段的另一个路由器,或开着移动数据 - 所以改了手表的提示:不再只说"不在同一网络", 而是把**双方地址都打出来**,用户一眼能看出是网段不同还是连错 WiFi - 端到端验证局域网路径:认证 1 ms,功能列表 207 项 阶段1 结论修正(一天内推翻自己两次,如实记录) - 第一次判断"优选 IP 无用":错。半小时内确实能避开超时 IP - 第二次固定优选 IP:也错。那些实测 138ms 的 IP 半小时后全不通了 —— Cloudflare anycast 可达性随运营商路由变化,固定 IP 等于钉死到会失效的地址 - 最终:不固定,靠 GeoDNS + cloudflared 重试 + ha-connections 2 冗余 - 撤销后立即变好:连接稳定 2 条、超时告警 0 次、设备侧延迟 4.40s -> 1.66s - **真正的瓶颈**:分段实测发现本机到 Cloudflare 的**裸 RTT 就 1439 ms**, 比经隧道的请求(1215 ms)还慢。说明瓶颈是这条网络的 4G 上行本身, 不是设备的隧道。公网侧已无优化空间。 - 局域网 118 ms vs 公网 1215 ms,快 10 倍 —— 这才是该走的路 阶段5 验收 - 全量回归 29 项全通过 - 设备侧验收 38 项全通过 - 成品:setup exe 14.37 MB / server zip / watch apk,已同步到设备下载区
83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
# -*- coding: utf-8 -*-
|
||
r'''确认延迟瓶颈到底在哪一段。
|
||
|
||
对比三段:
|
||
1. 局域网直连(设备本机 -> relay 本机) 预期几十毫秒
|
||
2. 公网(本机 -> Cloudflare 边缘 -> 隧道 -> 设备)
|
||
3. 纯 Cloudflare 边缘 RTT(本机 -> 随便一个 CF 站点)
|
||
|
||
差值能告诉我们:
|
||
2 - 1 = 隧道 + 公网往返的开销
|
||
3 = 到边缘的裸 RTT
|
||
2 - 3 - 1 = 隧道那一段的开销(设备到边缘)
|
||
'''
|
||
from __future__ import annotations
|
||
|
||
import statistics
|
||
import sys
|
||
import time
|
||
import urllib.request
|
||
|
||
HEADERS = {"User-Agent": "LanRemote/1.4.0"}
|
||
|
||
|
||
def timed(url: str, rounds: int = 15) -> list:
|
||
out = []
|
||
for _ in range(rounds):
|
||
try:
|
||
start = time.perf_counter()
|
||
with urllib.request.urlopen(
|
||
urllib.request.Request(url, headers=HEADERS),
|
||
timeout=25) as resp:
|
||
resp.read()
|
||
if resp.status == 200:
|
||
out.append((time.perf_counter() - start) * 1000)
|
||
except Exception: # noqa: BLE001
|
||
pass
|
||
time.sleep(0.3)
|
||
return out
|
||
|
||
|
||
def show(label: str, values: list, rounds: int) -> float:
|
||
if not values:
|
||
print(" %-24s 全失败" % label)
|
||
return float("nan")
|
||
med = statistics.median(values)
|
||
print(" %-24s 可用 %2d/%d 中位 %7.0f ms 最快 %7.0f ms"
|
||
% (label, len(values), rounds, med, min(values)))
|
||
return med
|
||
|
||
|
||
def main() -> int:
|
||
print(" 分段测延迟(各 15 次取中位数)")
|
||
print()
|
||
|
||
lan = show("1. 局域网直连", timed("http://192.168.2.156:8080/v1/health"), 15)
|
||
pub = show("2. 公网(经隧道)",
|
||
timed("https://relay.xxmxxs.top/v1/health"), 15)
|
||
edge = show("3. Cloudflare 边缘裸 RTT",
|
||
timed("https://cloudflare.com/cdn-cgi/trace"), 15)
|
||
|
||
print()
|
||
print(" 分析:")
|
||
if lan == lan and pub == pub:
|
||
print(" 局域网 %.0f ms -> 公网 %.0f ms" % (lan, pub))
|
||
print(" 公网比局域网多 %.0f ms" % (pub - lan))
|
||
if edge == edge and pub == pub:
|
||
print()
|
||
print(" 到 Cloudflare 边缘的裸 RTT: %.0f ms" % edge)
|
||
print(" 公网请求 %.0f ms,其中边缘往返占 %.0f ms(%.0f%%)"
|
||
% (pub, edge, edge / pub * 100))
|
||
print(" 剩下的 %.0f ms 是:边缘 -> 设备(隧道)那一段 + 服务端处理"
|
||
% (pub - edge))
|
||
|
||
print()
|
||
print(" 结论:")
|
||
print(" 如果「边缘 -> 设备」那段占比大,说明瓶颈在设备的 4G 上行链路,")
|
||
print(" Cloudflare 这一侧没得优化了 —— 只能靠换网络或换中转位置。")
|
||
return 0
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|