노트

RTT와 연결 준비 비용

Round-Trip Time

프론트엔드#network#performance#http · 연결된 개념 7개

쉽게 말하면

새 서버에 처음 요청하는 건 처음 거는 전화와 비슷해요. 번호를 찾고, 신호가 가고, '여보세요'를 주고받은 뒤에야 본론을 꺼내죠. 이미 연결된 통화로 이어서 말하면 이 인사 과정을 건너뛰어요.

비유의 한계 전화와 달리 인사 한 번이 왕복 한 번이라, 거리가 멀면 인사 횟수만큼 늦어져요. 파일 크기와 상관없이 드는 시간이라 작은 파일일수록 연결 준비가 더 큰 비중을 차지해요.

RTT(Round-Trip Time)는 패킷을 보내고 그에 대한 응답이 돌아오기까지 걸리는 왕복 시간이다. ping으로 잴 수 있다. 브라우저가 새 서버에 요청하려면 데이터를 보내기 전에 왕복을 몇 번 거쳐야 하므로, 첫 요청의 시작 시점은 RTT 몇 배만큼 늦어진다.

첫 요청 전에 드는 왕복

DNS 조회           도메인 → IP (캐시에 없으면 왕복 발생)
TCP 핸드셰이크      SYN → SYN-ACK → ACK            ≈ 1 RTT
TLS 핸드셰이크      1.3은 1 RTT, 1.2는 2 RTT
HTTP 요청·응답      요청을 보내고 첫 바이트를 받기까지  ≈ 1 RTT + 서버 처리
  • DNS(Domain Name System) 조회, TCP(Transmission Control Protocol) 연결, TLS(Transport Layer Security) 암호화를 합친 연결 준비에는 최대 3번 정도의 왕복이 든다. 최적화되지 않은 환경에서는 더 든다
  • DNS 결과가 캐시돼 있고 RTT가 100ms라면 TLS 1.3 연결은 TCP 100ms + TLS 100ms를 쓴 뒤에야 요청을 보낸다. 첫 바이트는 서버 처리 시간을 빼고도 약 300ms 뒤에 온다. TLS 핸드셰이크 자체는 HTTP와 HTTPS를 본다
  • 이 시간은 파일 크기와 관계없다. 작은 파일일수록 다운로드보다 연결 준비가 차지하는 비중이 크다
  • 리다이렉트는 RTT 자체를 키우지 않는다. 대신 요청을 한 번 더 하게 만들어 왕복 횟수를 늘린다. 다른 호스트로 가면 연결 준비도 다시 한다

연결 재사용

연결 준비 비용은 연결을 다시 쓰면 한 번만 치른다.

  • HTTP/1.1은 지속 연결(persistent connection)이 기본이다. 한 연결로 여러 요청·응답을 주고받으므로 요청마다 TCP 핸드셰이크를 하지 않는다. keep-alive 연결이라고도 부른다
  • 쉬는 연결은 일정 시간 뒤 닫힌다. web.dev에 따르면 브라우저는 10초 안에 쓰지 않은 연결을 닫는다. 그래서 preconnect는 곧 쓸 서버에만 건다
  • TLS 1.3은 전에 연결한 서버에 다시 연결할 때, 이전 연결에서 받은 사전 공유 키(Pre-Shared Key, PSK)로 첫 핸드셰이크 메시지와 함께 데이터를 보내는 0-RTT 방식을 쓸 수 있다

같은 출처에 두면 빠른 이유

LCP(Largest Contentful Paint) 이미지처럼 중요한 리소스를 HTML 문서와 같은 출처에 두면, 이미 열린 연결을 그대로 써서 연결 준비를 건너뛴다. 이미지 CDN(CDN, Content Delivery Network)을 다른 도메인으로 쓰면 그 도메인에 새로 연결하는 비용이 붙는다. preconnect로 일부를 줄일 수 있지만, web.dev는 가능하면 같은 출처로 서빙하라고 권한다. 많은 CDN이 내 출처로 온 요청을 CDN으로 프록시하는 기능을 준다. 이 차이는 LCP 하위 구간에서 TTFB 이후 구간에 드러난다.

다만 출처(동일 출처 정책)는 보안 경계를 정하는 개념이고, 연결을 나누는 기준과 꼭 같지는 않다. HTTP/2는 다른 호스트 이름이라도 같은 서버가 그 호스트들에 대해 권한이 있으면 연결 하나를 같이 쓸 수 있다(connection coalescing). HTTPS라면 서버 인증서가 그 호스트들에 유효해야 하고, TLS 없는 TCP 연결이라면 호스트들이 같은 IP로 풀려야 한다.

연결을 하나로 모은 뒤에도 그 안에서 여러 요청이 대역폭을 나눠 쓰는 문제는 남는다 → HOL 블로킹과 HTTP/2 멀티플렉싱

명세: RFC 9112 §9.3 — Persistence · RFC 9113 §9.1.1 — Connection Reuse · RFC 8446 §2 — TLS 1.3 Protocol Overview 출처: MDN — Round Trip Time (RTT) · MDN — TCP handshake · MDN — Connection management in HTTP/1.x: Persistent connections · web.dev — Establish network connections early · web.dev — Optimize LCP: Reduce the distance the resource has to travel

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 커넥션 드레이닝과 무중단 재시작

    배포 중 서버를 재시작하는 몇 초 동안 로드밸런서가 그 서버로 요청을 보내면 502가 난다. 먼저 로드밸런서에서 빼고(드레이닝), 진행 중인 요청을 마친 뒤 재시작하고, 준비되면 다시 넣는다.

  • 요청 제한 (Throttling)

    요청 제한(rate limiting, throttling)은 일정 시간 동안 한 클라이언트가 보낼 수 있는 요청 수를 묶어 두는 장치다. 한도를 넘으면 429 Too Many Requests로 거절하고, 보통 Retry-After 헤더로 언제 다시 시도하면 되는지 알려 준다.

  • 무상태와 상태 유지

    무상태(stateless)는 서버가 이전 요청을 기억하지 않아도 요청 하나만 보고 처리할 수 있는 구조이고, 상태 유지(stateful)는 서버가 요청 사이에 클라이언트 상태를 저장해 두고 다음 요청을 처리할 때 그 상태를 찾아보는 구조다.

  • HTTP 쿠키

    서버가 브라우저에 저장시키는 작은 이름-값 데이터. 브라우저는 조건이 맞는 요청마다 쿠키를 자동으로 실어 보내므로, 상태가 없는 HTTP 위에서 로그인 같은 상태를 이어 가는 데 쓴다.

  • RPC

    RPC(Remote Procedure Call)는 다른 기계에서 실행되는 함수를 내 코드의 평범한 함수처럼 호출하게 하는 통신 방식이다. 엔드포인트 설계, 직렬화, 요청·응답 처리를 감추고 updateName(formData) 같은 함수 호출 한 줄로 보이게 한다.

보기 옵션