import os import re import sys from dataclasses import dataclass from datetime import datetime import matplotlib.pyplot as plt import numpy as np from matplotlib.colors import LogNorm
defanalyze_loss_event(responses:list[ResponseRecord])->tuple[float,float]: receive_loss_event = 0 loss_loss_event = 0 receive_receive_event = 0 loss_receive_event = 0 for i inrange(len(responses)): first = responses[i] second = responses[i+1] if i+1 < len(responses) elseNone if second: if second.seq != first.seq + 1: receive_loss_event += 1 else: receive_receive_event += 1 if second.seq != first.seq + 1: # detected a loss event loss_receive_event += 1 this_loss_loss_event = second.seq - first.seq - 2 if this_loss_loss_event > 0: loss_loss_event += this_loss_loss_event receive_loss_rate = receive_loss_event/(receive_loss_event + receive_receive_event) loss_loss_rate = loss_loss_event/(loss_loss_event + loss_receive_event) return receive_loss_rate, loss_loss_rate
defanalyze_rtt(responses:list[ResponseRecord])->tuple[int,int]: rtt_min = 1000000 rtt_max = -1 for response in responses: rtt_min = min(rtt_min, response.time) rtt_max = max(rtt_max, response.time) return rtt_min, rtt_max defplot_rtt_over_time(responses: list[ResponseRecord]): if os.path.exists('rtt_over_time.png'): return times = [response.timestamp for response in responses] rtts = [response.time for response in responses]
actual_times = [datetime.fromtimestamp(ts) for ts in times]
plt.figure(figsize=(10, 5)) plt.plot(actual_times, rtts, marker='o', linestyle='-') plt.xlabel('Time of Day') plt.ylabel('RTT (ms)') plt.title('RTT over Time') plt.grid(True) plt.xticks(rotation=45) plt.tight_layout() plt.savefig('rtt_over_time.png') plt.show()
defplot_rtt_distribution(responses: list[ResponseRecord]): if os.path.exists('rtt_distribution.png') and os.path.exists('rtt_cdf.png'): return rtts = [response.time for response in responses]
plt.figure(figsize=(10, 5)) sorted_rtts = np.sort(rtts) cdf = np.arange(len(sorted_rtts)) / float(len(sorted_rtts)) plt.plot(sorted_rtts, cdf, marker='.', linestyle='none') plt.xlabel('RTT (ms)') plt.ylabel('CDF') plt.title('Cumulative Distribution Function of RTT') plt.grid(True) plt.savefig('rtt_cdf.png') plt.show()
defplot_rtt_correlation(responses: list[ResponseRecord]): if os.path.exists('rtt_correlation.png'): return rtts = [response.time for response in responses]
iflen(rtts) < 2: print("Not enough data points to plot RTT correlation.") return
plt.figure(figsize=(10, 5)) plt.scatter(rtt_n, rtt_n_plus_1, alpha=0.5) plt.xlabel('RTT of ping #N (ms)') plt.ylabel('RTT of ping #N+1 (ms)') plt.title('Correlation between RTT of ping #N and RTT of ping #N+1') plt.grid(True) plt.savefig('rtt_correlation.png') plt.show()