#!/usr/bin/env bash # 量本机到 Bitget 端点的网络距离,输出 JSON。start.sh 会把它并进运行元数据。 # # 为什么要单独量:K 线到达延迟(lag_data_ms)是「交易所推送节奏 + 回源 + 网络」 # 三者之和,中位 506ms。其中只有最后一段随机房位置变化,而实测它只有 2ms # 往返——用到达延迟去比两个机房,等于用公斤秤称克。这个探测把可变的那一段 # 单独拿出来。 # # 还有一件事值得知道:ws.bitget.com 解析出来是 CloudFront(AWS 的 CDN 边缘), # 不是 Bitget 自己的机房。所以「离交易所近」实际是「离 CloudFront 边缘近」。 set -uo pipefail WS_HOST="${WS_HOST:-ws.bitget.com}" N="${N:-10}" resolved="$(getent hosts "$WS_HOST" 2>/dev/null | head -1 || true)" edge_ip="$(awk '{print $1}' <<<"$resolved")" cname="$(awk '{print $2}' <<<"$resolved")" icmp_min=null; icmp_avg=null if out="$(ping -c "$N" -q -W 2 "$WS_HOST" 2>/dev/null)"; then stats="$(grep -oE 'rtt min/avg/max/mdev = [0-9./]+' <<<"$out" | awk '{print $NF}')" if [[ -n "$stats" ]]; then icmp_min="$(cut -d/ -f1 <<<"$stats")" icmp_avg="$(cut -d/ -f2 <<<"$stats")" fi fi # TCP 握手是一个完整往返,比 ICMP 更能代表实际连接路径(有些网络对 ICMP 降级) tcp_min=null; tls_min=null; ttfb_min=null if command -v curl >/dev/null 2>&1; then vals="$(for _ in $(seq "$N"); do curl -s -o /dev/null --max-time 8 \ -w '%{time_connect} %{time_appconnect} %{time_starttransfer}\n' \ "https://$WS_HOST/v2/ws/public" 2>/dev/null done)" if [[ -n "$vals" ]]; then tcp_min="$(awk '{print $1*1000}' <<<"$vals" | sort -n | head -1)" tls_min="$(awk '{print $2*1000}' <<<"$vals" | sort -n | head -1)" ttfb_min="$(awk '{print $3*1000}' <<<"$vals" | sort -n | head -1)" fi fi org="unknown" if [[ -n "$edge_ip" ]]; then org="$(curl -s --max-time 6 "https://ipinfo.io/$edge_ip/json" 2>/dev/null \ | awk -F'"' '/"org"/{print $4}')" [[ -n "$org" ]] || org="unknown" fi self_org="$(curl -s --max-time 6 https://ipinfo.io/json 2>/dev/null \ | awk -F'"' '/"org"/{print $4}')" self_city="$(curl -s --max-time 6 https://ipinfo.io/json 2>/dev/null \ | awk -F'"' '/"city"/{print $4}')" cat <