한양과학기술고등학교

에듀테크 프로젝트 대시보드

NTP — 네트워크 시간 동기화

내 컴퓨터는 시각을 어떻게 정확히 맞출까?

컴퓨터 내부 시계(쿼츠 발진자)는 조금씩 어긋난다. HTTPS 인증서 유효기간 검사, 로그 타임스탬프 비교, 분산 시스템의 이벤트 순서 판단 — 이 모든 게 시계가 맞아야 의미가 있다. NTP(Network Time Protocol)는 패킷 왕복 시간을 거꾸로 이용해 네트워크 지연 속에서도 오차를 추정해낸다.

💻
클라이언트
00:00:00.000
보정 전
🛰️
NTP 서버 (Stratum 1)
00:00:00.000
원자시계 기준 · 정확
t0 (요청 송신)
–
t1 (서버 수신)
–
t2 (서버 송신)
–
t3 (응답 수신)
–

⏱️ 왕복 지연(delay) 추정

delay = (t3 − t0) − (t2 − t1)
–

🎯 시계 오프셋(offset) 추정

offset = ((t1 − t0) + (t2 − t3)) / 2
–

📡 Stratum 계층 구조

STRATUM 0
원자시계 / GPS
기준 시각 원천
→
STRATUM 1
1차 타임서버
Stratum 0에 직결
→
STRATUM 2
2차 타임서버
Stratum 1과 동기화
→
STRATUM 3+
일반 PC/서버
내 컴퓨터가 여기

단계가 내려갈수록(숫자가 커질수록) 원천 시계와 한 다리씩 멀어지며 오차가 조금씩 누적된다. 그래서 NTP 클라이언트는 한 번이 아니라 주기적으로 반복 동기화하며, 여러 서버의 응답을 비교해 이상값(outlier)을 걸러낸다.

🐍 오프셋 계산 코드

def ntp_offset(t0, t1, t2, t3): # t0: 클라이언트가 요청 보낸 시각 (클라이언트 시계) # t1: 서버가 요청 받은 시각 (서버 시계, 정확) # t2: 서버가 응답 보낸 시각 (서버 시계, 정확) # t3: 클라이언트가 응답 받은 시각 (클라이언트 시계) delay = (t3 - t0) - (t2 - t1) offset = ((t1 - t0) + (t2 - t3)) / 2 return offset, delay # 클라이언트 시계 보정: 이제부터는 아래 값을 더해서 사용 corrected_time = local_clock() - offset
💡 왜 왕복 지연이 "왔다 갔다 똑같다"고 가정할까?

offset 공식은 요청 경로와 응답 경로의 지연이 대칭적(같음)이라고 가정하고 유도된다. 위 데모에서 "왕복 경로 비대칭" 토글을 켜면 실제 오차(drift)와 추정된 offset이 살짝 어긋나는 걸 볼 수 있다. 실제 인터넷에서는 경로가 완전히 대칭이 아니기 때문에, 이 비대칭이 NTP의 근본적인 오차 원인이 된다.

💡 그냥 서버 시각(t1, t2)만 그대로 복사하면 안 될까?

네트워크를 지나는 데 걸리는 시간(지연)을 무시하게 되어, 지연이 클수록 오차가 커진다. NTP는 지연 시간의 절반만큼 시간이 이미 흘렀다고 보정해 이 문제를 줄인다 — 그래서 delay와 offset을 같이 계산하는 것이다.