소요시간 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""소요시간(latency) 계산 검증.
문서: 25.소요시간 (예시, 카드 C2·C3)
정의:
소요시간 = 전파 지연 + 전송 시간 + 큐잉 지연 [+ 스위칭(처리) 시간]
전파 지연 = 거리 / 신호 속도, 전송 시간 = 크기 / 대역폭
신호 속도: 진공 3.0e8, 케이블 2.3e8, 광케이블 2.0e8 m/s. 직접 링크에는 큐잉 지연이 없다.
단위: 시간은 ms, 1 Mbps = 10^6 bps.
"""
from fractions import Fraction as F
V = {"vacuum": 300_000_000, "cable": 230_000_000, "fiber": 200_000_000}
def prop_ms(distance_m, medium):
return F(distance_m * 1000, V[medium])
def trans_ms(bits, R_bps):
return F(bits * 1000, R_bps)
def main():
# 예시: 1,000 km
d = 1_000_000
assert round(float(prop_ms(d, "vacuum")), 2) == 3.33
assert round(float(prop_ms(d, "cable")), 2) == 4.35
assert prop_ms(d, "fiber") == 5
t = prop_ms(d, "fiber") + trans_ms(8_000, 10_000_000) + 0
assert t == F(58, 10)
assert 2 * t == F(116, 10)
print("[OK] 예시: 1,000 km -> 3.33 / 4.35 / 5 ms, 광케이블 직접 링크 5.8 ms, RTT 11.6 ms")
# 카드 C2: 1,250바이트, 2 Mbps, 케이블 4,600 km
L = 1_250 * 8
tr = trans_ms(L, 2_000_000)
pr = prop_ms(4_600_000, "cable")
assert tr == 5 and pr == 20 and tr + pr == 25 and 2 * (tr + pr) == 50
print("[OK] 카드 C2: 전송 5 ms + 전파 20 ms = 25 ms, RTT 50 ms")
# 카드 C3: 100바이트, 광케이블 4,000 km, 10 Mbps -> 100 Mbps
L = 100 * 8
p = prop_ms(4_000_000, "fiber")
a = p + trans_ms(L, 10_000_000)
b = p + trans_ms(L, 100_000_000)
assert p == 20 and a == F(2008, 100) and b == F(20008, 1000)
assert (a - b) / a < F(1, 200) # 0.4% 미만 감소
print(f"[OK] 카드 C3: {float(a)} ms -> {float(b)} ms (전송률 10배, 소요시간은 {float((a - b) / a):.2%} 감소)")
print("ALL CHECKS PASSED")
if __name__ == "__main__":
main()