사전 왕복 시간
개념

왕복 시간

gabury1고친 사람 github-actions[bot]

왕복 시간은 무언가를 보내고 그 답을 받을 때까지 걸린 시간을 잽니다. 보내는 쪽이 자기 시계 하나만 보고 잽니다. 이 값으로 받는 쪽이 얼마나 멀리 있는지, 가는 길이 지금 얼마나 붐비는지를 가늠합니다.

쉽고 빠른 이해

왕복 시간은 보낸 것이 되돌아오기까지 걸린 시간입니다. [[ping]] 을 쳤을 때 줄마다 찍히는 그 시간이 왕복 시간입니다.

이 값이 없으면 받는 쪽이 지금 어떤 상태인지 알 방법이 없습니다. 받는 쪽 기계 안을 들여다볼 수는 없고, 한쪽 방향으로 걸린 시간을 재려면 양쪽 시계를 같은 시각에 맞춰 두어야 합니다. 왕복 시간은 그런 약속 없이도 한쪽에서 얻습니다.

이렇게 잽니다.

  1. 보내는 쪽이 내보낸 시각을 적어 둔다
  2. 받는 쪽이 받자마자 답을 되돌린다
  3. 답이 도착한 시각에서 내보낸 시각을 뺀다

대가도 있습니다. 가는 길과 오는 길을 합한 값 하나라서 어느 쪽에서 더 걸렸는지 못 가릅니다. 받는 쪽이 답을 늦게 되돌리면 그 시간까지 섞여 들어옵니다. 잴 때마다 값이 달라지므로 한 번 잰 값만 놓고 판단하면 어긋납니다.

상세

산에서 소리를 지르면 잠시 뒤 메아리가 돌아옵니다. 지른 순간부터 되돌아온 소리를 들은 순간까지 걸린 시간이 왕복 시간입니다. 소리가 얼마나 멀리 갔다 왔는지를 이 시간 하나로 짐작합니다.

왕복 시간은 한쪽에서 신호를 내보내고 그 응답이 같은 쪽으로 돌아올 때까지 걸린 시간입니다. 줄여서 RTT(Round-Trip Time)라고 부릅니다. 웹 요청 한 번, 데이터베이스 질의 한 번처럼 요청과 응답이 짝을 이루는 곳이면 어디서든 같은 이름으로 씁니다.

한 시계로 재는 값

한쪽에서 다른 쪽까지 가는 데 걸린 시간만 따로 재는 값도 있습니다. 이것을 단방향 지연이라고 합니다. 이 값을 얻으려면 떨어져 있는 두 기계의 시계가 같은 시각을 가리켜야 합니다.

그런데 기계마다 시계가 조금씩 어긋납니다. 어긋난 만큼이 잰 값에 그대로 얹혀서, 무엇이 길에서 걸린 시간이고 무엇이 시계 오차인지 갈라낼 방법이 없습니다.

왕복 시간은 재기 시작한 곳과 끝낸 곳이 같습니다. 시계 하나를 두 번 보면 값이 나옵니다. 받는 쪽과 시각을 맞추는 약속이 필요 없어서 처음 붙어 보는 기계에도 바로 씁니다.

sequenceDiagram
    participant 보내는쪽
    participant 받는쪽
    Note over 보내는쪽: 시계를 본다
    보내는쪽->>받는쪽: 요청을 내보낸다
    Note over 받는쪽: 받아서 답을 만든다
    받는쪽-->>보내는쪽: 응답을 되돌린다
    Note over 보내는쪽: 시계를 다시 본다 · 두 시각의 차이가 왕복 시간

시각을 읽는 두 순간이 모두 보내는 쪽에 있습니다. 그래서 이 값에는 받는 쪽이 답을 만드느라 붙들고 있던 시간까지 들어갑니다. 받는 쪽이 굼뜨면 길이 한산해도 왕복 시간은 커집니다.

이 시간을 채우는 네 가지

왕복 한 번에 걸린 시간은 한 가지 원인으로 생기지 않습니다. 성격이 다른 네 가지가 차례로 쌓여 값 하나가 됩니다.

flowchart TD
    subgraph G["가는 길"]
        A1["선 위로 밀어 넣는 시간"] --> A2["선을 타고 건너가는 시간"] --> A3["중간 장비에서 줄 선 시간"]
    end
    subgraph H["받는 쪽"]
        B1["답을 만드는 시간"]
    end
    subgraph R["오는 길"]
        C1["같은 세 가지가 한 번 더"]
    end
    G --> H --> R

가는 길에서 쌓인 세 가지는 오는 길에서 한 번 더 쌓입니다. 받는 쪽이 답을 만드는 시간만 그 사이에 한 번 들어갑니다. 회선이 한 번에 실어 나를 수 있는 양을 대역폭이라고 합니다. 첫 번째 시간이 이 값에 매여 있습니다.

네 가지는 손댈 수 있는 정도가 서로 다릅니다.

쌓이는 시간 무엇이 정하나 줄이려면
선 위로 밀어 넣는 시간 보낼 양과 회선의 굵기 회선을 굵게 하거나 보낼 양을 줄인다
선을 타고 건너가는 시간 두 지점 사이의 거리 못 줄인다. 가까이 옮기는 것뿐이다
중간 장비에서 줄 선 시간 그 순간 길이 붐비는 정도 흘려보내는 양을 줄이면 같이 준다
답을 만드는 시간 받는 쪽이 하는 일의 무게 받는 쪽 코드와 장비가 정한다

위에서부터 세 가지는 차례로 전송 지연 · 전파 지연 · 큐잉 지연이라고 부릅니다. 마지막 하나는 회선이 아니라 받는 쪽 기계가 쓰는 시간이라 이 셋과 갈라 셉니다.

중간 장비가 받은 것을 살펴 어느 길로 넘길지 정하는 시간에도 처리 지연이라는 이름이 있습니다. 앞의 셋에 견주면 대개 작습니다.

거리가 정하는 바닥값

네 가지 중 거리에서 오는 몫만은 장비를 바꿔도 줄지 않습니다. 신호가 선을 타고 지나가는 속도는 빛의 속도를 넘지 못합니다. 광섬유 안에서는 그보다 조금 처져서 갑니다.

서울 ↔ 미국 서부 · 광섬유 한 가닥

거리   10,000km 안팎
속도   광섬유 안에서 200,000km/s 안팎
편도   10,000 ÷ 200,000 = 0.05초
왕복   0.05 × 2 = 0.1초   // 이 값이 바닥

회선을 열 배 굵은 것으로 바꿔도 이 계산은 바뀌지 않습니다. 굵기는 한 번에 밀어 넣는 양을 바꿀 뿐 신호가 지나갈 거리를 줄이지 않습니다.

바닥을 낮추는 방법은 하나뿐입니다. 받는 쪽을 보내는 쪽 가까이 옮기는 것입니다. CDN(Content Delivery Network, 콘텐츠 전송 네트워크)처럼 사본을 사용자 가까이 흩어 두는 장치가 여기서 나왔습니다.

흔들리는 값을 다루는 법

같은 곳에 연달아 재도 값이 매번 달라집니다. 중간 장비에 줄이 서는 정도가 순간마다 바뀌기 때문입니다. 값이 흔들리는 폭에도 이름이 있습니다. 그 이름이 지터입니다.

그래서 한 번 잰 값을 그대로 쓰지 않습니다. 여러 번 재서 평균에 가까운 값 하나와 흔들리는 폭 하나를 같이 들고 다닙니다. 새로 잰 값이 들어올 때마다 두 값을 조금씩 옮겨 최근 상태를 따라가게 합니다.

이 두 값이 쓰이는 대표적인 곳이 재전송 타임아웃입니다. 답이 얼마나 안 오면 그 요청이 사라졌다고 볼지를 정해야 합니다. 평균만 보고 자르면 조금 늦게 오던 답까지 사라진 것으로 칩니다. 흔들리는 폭을 얹어 여유를 두는 까닭이 이것입니다.

오가는 횟수만큼 곱해지는 시간

왕복 시간이 크게 드러나는 대목은 한 번이 아니라 여러 번 오갈 때입니다. 일을 끝내기까지 필요한 왕복 횟수가 곧 곱하는 수입니다. 웹 요청 하나가 연결을 새로 세우고 첫 응답을 받기까지 몇 번 오가는지 세어 봅니다.

브라우저가 웹 서버에 붙을 때 쓰는 연결은 TCP(Transmission Control Protocol, 전송 제어 프로토콜)입니다. 데이터를 싣기 전에 양쪽이 준비됐다는 신호를 주고받습니다. 그 인사에 한 왕복이 듭니다.

한 왕복에 걸리는 시간을 T 라고 하면

TCP 연결을 세우는 데   1 왕복
요청과 응답에          1 왕복
                    ───────
첫 응답을 받기까지     2 왕복   // 2 × T

오가는 횟수를 하나 줄이면 그만큼의 시간이 사라집니다. 연결을 미리 세워 두고 다시 쓰는 커넥션 풀, 첫 요청에 데이터를 함께 실어 보내는 TCP 빠른 열기가 모두 이 횟수를 겨냥합니다.

답을 기다리는 동안 회선이 노는 문제도 같은 뿌리입니다. 받는 쪽은 미처 처리하지 못한 것을 쌓아 둘 공간이 한정되어 있습니다. 그래서 보내는 쪽은 답을 받기 전까지 내보낼 양에 한도를 두고, 그 한도를 다 쓰면 답이 올 때까지 멈춥니다.

왕복 시간 동안 회선에 밀어 넣을 수 있는 양에도 이름이 있습니다. 대역폭 지연 곱이 그 양입니다. 한도가 대역폭 지연 곱만큼에 못 미치면 굵은 회선을 다 쓰지 못합니다.

비슷한 값과 가르는 선

네트워크에서 시간을 재는 값을 통틀어 지연이라고 합니다. 그 아래 이름이 비슷한 값이 여럿 있어서 무엇을 잰 것인지 먼저 못 박아야 합니다. 셋은 시작과 끝을 잡는 곳이 서로 다릅니다.

값 어디서 시작해 어디서 멈추나
단방향 지연 보내는 쪽에서 나가 받는 쪽에 닿을 때까지. 한 방향이다
왕복 시간 보내는 쪽에서 나가 되돌아올 때까지. 받는 쪽이 붙든 시간이 들어간다
응답 시간 요청한 쪽이 쓸 수 있는 답을 다 받을 때까지. 여러 왕복이 들어갈 수 있다

세 값은 같은 구간을 두고도 서로 다른 수를 냅니다. 어느 것을 쟀는지 밝히지 않은 시간 값은 비교에 쓸 수 없습니다.

그래서 왕복 시간을 써야 할 때가 따로 있습니다. 받는 쪽까지의 거리와 길의 혼잡을 한 값으로 보고 싶을 때, 그리고 양쪽 시계를 맞출 수 없을 때 이 값을 씁니다. 반대로 가는 길과 오는 길 중 어느 쪽이 처지는지 알아야 하면 이 값으로는 안 됩니다. 사용자가 답을 볼 때까지 얼마나 기다렸는지가 궁금할 때도 응답 시간을 봐야 합니다.

관련 항목

왕복 시간과 나란히 회선을 재는 지표

지연 · 대역폭 · 처리량 · 지터 · 패킷 손실률 · 꼬리 지연

한 번의 왕복을 채우는 구간별 시간

전파 지연 · 전송 지연 · 큐잉 지연 · 처리 지연 · 단방향 지연 · 네트워크 지연

왕복 시간을 재료로 삼는 제어 장치

재전송 타임아웃 · 혼잡 제어 · 흐름 제어 · 슬라이딩 윈도 · 느린 시작 · 대역폭 지연 곱

오가는 횟수를 줄이려고 만든 기법

0-RTT · QUIC · TCP 빠른 열기 · 커넥션 풀 · 킵얼라이브 · CDN · 엣지 컴퓨팅

왕복 시간을 재거나 들여다보는 도구

ping · traceroute · ICMP · NTP

왕복 시간이 길어졌을 때 드러나는 문제

헤드 오브 라인 블로킹 · 버퍼블로트 · 타임아웃 · 혼잡 · 재전송

왕복 시간과 헷갈리는 이웃 값

응답 시간 · 대기 시간 · 처리 시간 · 첫 바이트까지의 시간

다른 이름: RTT · Round-Trip Time · 라운드 트립 타임 · 왕복 지연