5G与2.4G网络下C/S模型时延测量的时间同步问题咨询
时钟同步问题解决思路
方案一:修改测量逻辑,从根源避免跨设备时钟依赖(优先推荐)
你当前的测量逻辑需要客户端和服务端时钟完全对齐才能得到准确值,改用时延往返测量方案无需时钟同步,实现更简单、精度更高:
- 客户端发送请求时记录本地时间戳
T1 - 服务端收到请求后无需额外处理,直接返回空响应即可
- 客户端收到服务端响应后记录本地时间戳
T2 - 单向上行时延可近似为
(T2-T1)/2,测量结果完全不受两台设备时钟差影响
修改后参考代码
服务端代码
from flask import Flask, request app = Flask(__name__) @app.route('/ping', methods = ['POST']) def pingHandler(): return 'OK' app.run(host = '0.0.0.0' , port = 8090)
客户端代码
from datetime import datetime import requests from time import sleep import csv sample_size = 1000 test = 1 file_name = f"2.4G_Time_Data_{test}.csv" # 初始化结果文件 with open(file_name, 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['Packet','Lag(uS)']) for i in range(sample_size): T1 = datetime.timestamp(datetime.now()) requests.post('http://myIP:8090/ping') T2 = datetime.timestamp(datetime.now()) # 计算单向上行时延,单位微秒 delta_time = (T2 - T1) * 10**6 / 2 # 写入结果 with open(file_name, 'a', newline='') as f: writer = csv.writer(f) writer.writerow([i+1, delta_time]) sleep(0.1)
方案二:系统层时钟同步(保留原测量逻辑时使用)
如果确实需要保留单向时间戳测量的逻辑,可以通过以下方式同步两台设备的时钟:
- NTP同步(毫秒级精度):两台设备都接入同一局域网,在其中一台设备上搭建本地NTP服务,另一台设备配置为该NTP服务的客户端,同步完成后时钟误差可控制在10ms以内,满足普通时延测量需求
- PTP精确时间同步(微秒级精度):如果需要匹配你测量用的微秒级精度,可使用PTP协议,局域网内部署后两台设备时钟差可控制在1微秒以内,完全避免负时延问题
- 临时手动同步:仅用于临时粗略测试,在两台设备上同时执行命令
date -s "年-月-日 时:分:秒"手动校准时间,精度较低不建议用于正式测量
原测量相关材料
组网拓扑
5G组网拓扑

2.4G组网拓扑

原测量代码
原服务端代码
#!/usr/bin/env python # coding: utf-8 from flask import Flask from flask import request from datetime import datetime import matplotlib.pyplot as plt import numpy as np import pandas as pd import csv import time from time import sleep from decimal import Decimal test = 1 #create csv. file to append data file_name = "2.4G_Time_Data_" + str(test) test = test + 1 print(file_name) with open(file_name+'.csv', 'w', newline='') as time_file: spamwriter = csv.writer(time_file, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) spamwriter.writerow(['Packet','Lag(uS)']) #start running a server, saves the in coming data in a csv file received_package = 0 app = Flask(__name__) @app.route('/postjson', methods = ['POST']) def postJsonHandler(): global received_package received_package = received_package + 1 print(request.is_json) content = request.get_json() print (content) now = datetime.now() time = content["time"] time_now = datetime.timestamp(now) print("Sent : " + str(time)) print("Received : " + str(time_now) ) delta_time = (time_now - time) * (10**6) # in micro seconds print("Packet Travel Time(s) : " + str(delta_time) ) with open(file_name+'.csv', 'a') as f: writer = csv.writer(f) writer.writerow([str(received_package), str(delta_time)]) return 'JSON Received' app.run(host = '0.0.0.0' , port = 8090)
原客户端代码
from datetime import datetime import requests import signal from time import sleep import time import os import sys import json sample_size = 1000 for i in range(sample_size) : now = datetime.now() time = now.strftime("%H:%M:%S") + ":" + str(now.microsecond) #time = str(now) timestamp = datetime.timestamp(now) requests.post('http://myIP:8090/postjson', json={'time': timestamp}) print ("Estimated size: " + str(sys.getsizeof(json) / 1024) + "KB") sleep(0.1)
2.4G测量结果

内容的提问来源于stack exchange,提问作者Emre Mutlu
相关产品推荐
相关产品推荐

