1. TCP vs UDP
연결 방식, 신뢰성, 순서 보장 등 기본 개념 비교
개요
- TCP: Transmission Control Protocol
- UDP: User Datagram Protocol
- TCP와 UDP 는 전송 계층 (Transport Layer) 에서 동작하는 대표적인 프로토콜
- 각각의 특징에 따라 신뢰성 vs 속도, 순차성 보장 vs 순서 무관 등 장단점이 뚜렷
주요 비교표
항목 |
TCP |
UDP |
연결 방식 |
연결 지향 (Connection-Oriented) |
비연결지향 (Connectionless) |
신뢰성 보장 |
O (packet 손실 시 재전송) |
X |
순서 보장 |
O |
X |
흐름 제어 |
O (수신자 상태 반영) |
X |
혼잡 제어 |
O (네트워크 상태 반영) |
X |
속도 |
느림 (오버헤드 큼) |
빠름 (경량 프로토콜) |
전송 단위 |
Segment |
Datagram |
Header 크기 |
최소 20 bytes |
8 bytes |
사용 예시 |
HTTP, SMTP, FTP 등 |
실시간 스트리밍, DNS, DHCP, VoIP 등 |
실전 예시: 어떤 상황에 어떤 프로토콜을 써야 하는가?
상황 |
적합한 프로토콜 |
이유 |
웹 페이지 접속, 파일 다운로드 |
TCP |
데이터 누락/중복 없이 전달 보장 필요 |
온라인 게임, 실시간 음성 토신 |
UDP |
지연이 치명적인 경우 |
DNS |
UDP (기본) |
매우 빠른 응답 요구. 손실 시 재질의 |
2. TCP vs HTTP Keep-Alive
TCP 연결 자체와 HTTP에서의 Keep-Alive 차이
항목 |
TCP 연결 |
HTTP Keep-Alive |
의미 |
OS 수준의 Transport Layer 연결 |
HTTP Protocol의 Application Layer Option |
대상 |
Server와 Client간 TCP Session |
HTTP Request/Response을 동일 TCP Session 위에 지속적으로 전송 |
목적 |
연결 자체를 구성하여 데이터를 주고 받음 |
매번 TCP 연결 생성/해제 비용을 줄이기 위해 TCP 연결을 재사용 |
기본 적용 |
HTTP/1.1부터 기본 활성 |
TCP 는 HTTP와 무관하게 항상 존재해야 통신 가능 |
- TCP는 전제 조건, HTTP Keep-Alive 는 그 TCP 연결을 얼마나 오래 쓸지에 대한 정책
Keep-Alive가 왜 필요한가?
- HTTP/1.0 에서는 요청 하나마다 TCP 연결 생성 & 종료 해야 했음 ➡️ 매 요청마다 3-Way Handshake + 4-Way Handshake ➡️ 매우 비효율적!
- 따라서 TCP 연결을 재사용하여
- 연결 오버헤드 감소 ⬇️ (Handshaking 비용 절감)
- 성능 ⬆️ (응답 속도 향상)
- 서버 부하 ⬇️ (자원 절약)
HTTP/1.1, HTTP/2, HTTP/3에서의 차이
HTTP ver |
Keep-Alive 방식 |
특징 |
HTTP/1.0 |
기본 비활성(활성화를 원한다면 Connection:keep-alive 명시 필요) |
명시하지 않으면 요청마다 TCP 연결 생성 & 종료 |
HTTP/1.1 |
기본 활성화 (Keep-Alive Default) |
Connection: close 명시 시에만 연결 종료 |
HTTP/2 |
TCP 연결 하나로 Multiplexing |
하나의 TCP 연결에서 동시 요청 처리 (Keep-Alive 보다 발전된 구조) |
HTTP/3 |
TCP 대신 QUIC(UDP 기반) 사용 |
연결 재사용은 계속되나 전송 계층 자체가 바뀜 |
예시 흐름
- HTTP/1.0 (Keep-alive 비활성)
- Request 1:
TCP 연결 ➡️ Request ➡️ Response ➡️ TCP 종료
- Request 2: 다시
TCP 연결 ➡️ Request ➡️ Response ➡️ TCP 종료
- HTTP/1.1 (Keep-alive 기본 적용)
- Request 1:
TCP 연결 ➡️ Request ➡️ Response
- Request 2 ~ n: 같은 TCP 연결 재사용
- 일정 시간 비활성 상태 지속 시, Server 또는 Client가
TCP 연결 종료
요약 정리
- TCP 연결: Data 송수신을 위한 Transport Layer의 기반 통신
- HTTP Keep-Alive: 같은 TCP 연결을 HTTP 요청 간 재사용하자는 Application Layer 기능
- HTTP/2, HTTP/3: Keep-Alive를 넘어선 진화 ➡️ 더 효율적인 병렬 요청 처리
3. HTTP Keep-Alive
작동 방식
- HTTP/1.0: 기본적으로 Request-Response 1회마다 TCP 연결 종료
- 각 요청마다
연결 설정(TCP 3-Way Handshake)
+ Data 전송
+ 연결 종료(TCP 4-Way Handshake)
- HTTP Keep-Alive 는 여러 HTTP 요청을 하나의 TCP 연결에서 처리하도록 지원
- 하나의 TCP 연결을 유지 (persistent connection) 하여 여러 요청을 처리
Connection: keep-alive vs close
HTTP header |
의미 |
Connection: keep-alive |
현재 TCP 연결을 유지하고, 다음 요청도 같은 연결로 처리하겠다는 요청 |
Connection: close |
이 요청을 끝으로 TCP 연결을 즉시 종료하라는 지시 |
- HTTP/1.0 에서는 Connection: keep-alive를 명시해야 지속 연결
- HTTP/1.1부터는 keep-alive가 default. 연결을 끊으려면 close로 명시해야 함
서버/클라이언트 설정 고려사항
- Server 측 고려사항
- Keep-Alive Timeout 설정
- 너무 짧으면 재연결 발생, 너무 길면 리소스 낭비 (Connection pool 고갈 위험)
- 최대 Keep-Alive 요청 수 제한 (Max-requests)
- 비정상 종료 대비한 Connection 정리 전략 필요
- Client 측 고려 사항
- 재사용 가능한 TCP 연결을 Connection Pool로 관리
- HTTP Proxy나 Load Balancer 존재 시, 연결 지속 여부 확인 필요
Connection Pool
- Connection pool: 동시에 처리할 수 있는 최대 connection 수
- Connection pool 고갈: 서버가 새 연결을 더 이상 받지 못해 장애 발생 (Timeout / Connection Refused)
- 왜 Keep-Alive timeout이 너무 길면 리소스가 낭비될까?
- TCP 연결 상태 유지 = Server가 Memory, CPU, 소켓 등을 점유한다는 뜻
- 즉, 연결이 유지된 상태에서 요청이 오지 않는다면?
실전 성능 최적화에서의 중요성
- 지연 감소: TCP 연결 재설정 비용 제거 (Handshake, TIME_WAIT)
- CPU/Memroy Resource 절약: 재연결보다 지속 연결 유지가 효율적
- 동시성 향상: Client 당 연결 수 제한 상황에서 효율적 자원 활용 가능
- 웹 성능 최적화의 기초: image, CSS, JS 등 다수 요청 처리에 핵심
- 많은 Web Server와 CDN 도 기본적으로 Keep-Alive 적극 활용
4. TCP Fast Open (TFO)
전통적인 TCP 3-Way Handshake vs TFO
- TFO: 전통적인 TCP 3-way Handshake의 RTT를 줄이는 방식
구분 |
전통적인 TCP |
TCP Fast Open (TFO) |
연결 과정 |
TCP 연결 설정(3-Way Handshake) 후 Data 전송 시작 |
SYN Packet에 Data를 포함시켜 보냄 (0-RTT 전송) |
최초 요청 시도 |
SYN ➡️ SYN-ACK ➡️ ACK ➡️ Data 전송 |
SYN(+Data 전송) ➡️ SYN-ACK ➡️ ACK(+Data 수신) |
속도 |
RTT 1회 후 데이터 전송 |
데이터 즉시 전송이 가능 (최대 1 RTT 단축) |
Fast Open의 원리 (쿠키 기반 0-RTT 연결 시도): TCP 연결 지연 최소화
- TFO는 Cookie 기반 신뢰 관계를 통해 data를 조기 전송
- 아는 사람(cookie)이라서 문 열자마자 바로 말하는 느낌
1. 초기 연결 시
- Client가 TFO 지원 Server에 접속
- Server는 응답에 TFO-Cookie를 포함하여 전송
- Client는 Cookie를 local에 저장
2. 이후 재접속 시
- Client 는 Cookie와 함께 SYN+Data를 Server에 전송
- Server는 Cookie가 유효하다면, SYN-ACK + 수신 처리
장점 및 보안 이슈
장점
- 지연 시간 (RTT) 감소
- SYN Packet에 data를 함께 전송하므로 요청이 더 빠르게 처리됨
- 모바일/무선 환경에서 유리(빈번한 재접속에 최적화)
- Google, Facebook 등 대규모 서비스에서 실험적으로 도입
보안 이슈 및 제약
- 쿠키 위조
- SYN Flood 공격 악용
- 초기 요청에 데이터 포함 ➡️ 서버 부담 ⬆️
- Middlebox 호환성 문제
- 일부 Router/Firewall 이 SYN에 data 포함된 packet을 차단
- 초기 연결엔 적용 불가
- TFO Cookie가 없으면 일반 3-Way Handshake처럼 작동
5. TLS 0-RTT (Zero Round-Trip Time): 보안 계층에서도 속도 개선 필요
- TLS(Transport Layer Security): 인터넷에서 데이터를 암호화해 안전하게 주고받도록 하는 보안 프로토콜
- Application/Presentation Layer에서 동작하는 프로토콜
- 예: HTTPS: HTTP + TLS
- TLS는 TCP 위에서 동작
- (1) Client -> TCP 연결 (3-Way Handshake)
- (2) Client <-> Server: TLS Handshake (암호화 방식 협상, 인증서 등)
- (3) TLS Handshake 완료되면 <-> Application Data (HTTP 요쳥/응답, …)
- 즉, TCP가 안정적인 통신 통로를 만들어 주면, TLS 는 그 위에 안전한 암호화 터널을 구축하는 것
TLS 1.3의 핵심 개선: 핸드셰이크 간소화
- TLS 1.2
- Handshake 과정이 최소 2 RTT (왕복 2회) 필요
- Client - Server가 서로를 확인한 뒤에만 Data 전송
- TLS 1.3
- 암호 스위트 단순화 + 암호화 기본 적용
- Handshake 과정이 1 RTT (0 RTT 까지 가능)
- 더 빠르고 더 안전하게 연결 가능
0-RTT 데이터 전송이란?
- Client가 과거에 연결한 적이 있는 서버라면, Handshake 없이 곧바로 데이터 전송 가능 (0-RTT)
- 방법
- 이전에 받은 session ticket/PSK(Pre-Shared Key)를 재사용
- Server는 이를 검증한 뒤, Data 처리 바로 시작
장점과 재전송 공격(Replay Attack) 이슈
장점
- 0-RTT: 사용자 체감 성능 개선
- 모바일, 무선 환경에서 효과적 (끊김 후 빠른 재연결 가능)
- 재사용성: session ticket으로 TLS 연결 빠르게 재구성 가능
재전송 공격 이슈
- 0-RTT data는 암호화는 되어있지만 서버는 client를 아직 완전히 검증하지 않은 상태
- 악의적인 제3자가 초기 전송 데이터를 복사해서 다시 보내면, 서버가 이를 중복 처리할 수 있음
- 예시
- 사용자가 0-RTT로 쇼핑몰에서 결제 요청 보냄
- 이를 공격자가 복사해 한 번 더 보냄 -> 이중 결제 가능성
- TLS 1.3 대응 방법
- 서버는 0-RTT data에 대해 재처리 불가능한 API만 허용
- Idempotent(멱등성, 어떤 연산을 여러 번 적용하더라도 결과가 변하지 않는 성질)한 요청만 0-RTT 로 처리하도록 제한