핵심 요약
포트와 소켓, TCP 연결·신뢰성·흐름·혼잡제어와 UDP의 특성을 비교한다.
본문
포트와 소켓
IP 주소가 호스트를 식별한다면 포트 번호는 호스트 안의 응용 프로세스를 구분한다. 하나의 TCP 연결은 일반적으로 다음 4개 값으로 식별할 수 있다.
출발 IP, 출발 Port, 목적 IP, 목적 Port
소켓은 응용 프로그램이 전송계층 통신을 사용하기 위한 인터페이스 또는 통신 끝점을 뜻한다.
Browser 192.0.2.10:51000
│ TCP connection
▼
Web Server 198.51.100.20:443
TCP의 특징
TCP는 연결 지향적이며 신뢰성 있는 바이트 스트림을 제공한다.
- 연결 설정과 종료 절차가 있다.
- 순서번호와 확인응답으로 순서를 보장한다.
- 손실을 감지해 재전송한다.
- 체크섬으로 전송 오류를 검출한다.
- 수신 윈도를 이용해 흐름을 제어한다.
- 혼잡 윈도와 알고리즘으로 네트워크 혼잡을 제어한다.
- 바이트 스트림이므로 송신 측의 메시지 경계가 그대로 보존된다고 가정하면 안 된다.
3-way handshake
Client Server
│── SYN, Seq=x ───────────────────────────►│
│◄─ SYN+ACK, Seq=y, Ack=x+1 ──────────────│
│── ACK, Ack=y+1 ─────────────────────────►│
│ 연결 설정 완료 │
- 첫 SYN은 클라이언트의 초기 순서번호를 알린다.
- 서버는 자신의 SYN과 클라이언트 SYN에 대한 ACK를 함께 보낸다.
- 마지막 ACK로 양쪽의 송수신 가능성을 확인한다.
연결 종료는 보통 각 방향을 독립적으로 닫기 때문에 FIN과 ACK가 오가는 4단계 형태로 설명한다.
A ── FIN ──► B
A ◄─ ACK ─── B
A ◄─ FIN ─── B
A ── ACK ──► B
실제로 FIN과 ACK가 한 세그먼트에 결합되는 등 패킷 수는 달라질 수 있다.
순서번호, ACK와 재전송
TCP 순서번호는 세그먼트 번호가 아니라 바이트 위치를 나타낸다. ACK 번호는 다음에 받고 싶은 바이트 번호를 뜻하는 누적 확인응답이다.
Sender Receiver
│── Seq=1000, 500 bytes ─────────────►│
│◄─ Ack=1500 ─────────────────────────│
손실은 재전송 타이머 만료나 중복 ACK 등으로 감지할 수 있다. 수신 측은 순서가 바뀐 세그먼트를 버퍼링할 수 있으며 최종적으로 응용에는 순서대로 전달한다.
흐름제어와 슬라이딩 윈도
흐름제어는 빠른 송신자가 느린 수신자의 버퍼를 넘치게 하지 않도록 한다. 수신자는 자신이 더 받을 수 있는 양을 수신 윈도에 광고한다.
송신 가능 범위
[이미 ACK][전송 후 ACK 대기][지금 전송 가능][아직 전송 불가]
◄──── window ────►
ACK가 도착하면 윈도가 앞으로 이동해 다음 데이터를 보낼 수 있다. 윈도 크기가 0이면 송신자는 일반 데이터를 멈추고 수신 버퍼가 비기를 기다린다.
혼잡제어
흐름제어가 수신자 보호라면 혼잡제어는 네트워크 내부의 과부하를 줄이는 기능이다.
- Slow Start: 혼잡 윈도를 작은 값에서 빠르게 증가시킨다.
- Congestion Avoidance: 임계값 이후 더 완만하게 증가시킨다.
- Fast Retransmit: 여러 중복 ACK를 손실 신호로 보고 타이머 전에 재전송한다.
- Fast Recovery: 손실 후 전송률을 조정하면서 완전히 처음부터 시작하지 않도록 한다.
수신 윈도는 흐름제어에, 혼잡 윈도는 네트워크 혼잡제어에 사용된다.
UDP의 특징
UDP는 연결을 설정하지 않고 데이터그램 단위로 전송한다.
- 연결 설정 지연이 없다.
- 헤더가 단순하다.
- 전달·순서·중복 제거를 보장하지 않는다.
- 메시지 경계를 보존한다.
- 오류 검출용 체크섬을 사용하지만 손실 시 자동 재전송하지 않는다.
- 필요한 신뢰성·재전송은 응용 계층에서 구현할 수 있다.
DNS 질의, 실시간 음성·영상, 일부 게임, DHCP 등에 사용될 수 있다. HTTP/3의 QUIC도 UDP 위에서 자체 신뢰성과 암호화를 구현한다.
TCP와 UDP 비교
| 항목 | TCP | UDP |
|---|---|---|
| 연결 | 연결 지향 | 비연결 |
| 데이터 형태 | 바이트 스트림 | 데이터그램 |
| 신뢰성·순서 | 제공 | 기본 제공하지 않음 |
| 흐름·혼잡제어 | 제공 | 응용에서 필요 시 구현 |
| 헤더·처리 비용 | 상대적으로 큼 | 상대적으로 작음 |
| 대표 용도 | 웹, 파일전송, 원격접속, 메일 | DNS, 실시간 미디어, DHCP 등 |
UDP가 항상 TCP보다 빠르다고 단정하면 안 된다. 응용이 신뢰성을 직접 구현하거나 네트워크 조건이 나쁘면 전체 성능은 달라질 수 있다.
순서번호와 ACK 추적
Client ISN=100 Server ISN=500
SYN seq=100 ───────►
◄─────── SYN-ACK seq=500 ack=101
ACK seq=101 ack=501 ───────►
SYN과 FIN은 데이터가 없어도 순서번호 공간 1을 소비한다. seq=1000, 데이터 500B를 연속 수신하면 ACK는 1500이다.
순서 밖 세그먼트가 먼저 와도 누적 ACK는 빈 구간의 시작, 즉 다음 기대 바이트를 반복한다.
윈도·MSS·재전송
유효 송신 윈도 = min(rwnd,cwnd)
rwnd=64KB, cwnd=32KB → 32KB
Ethernet MTU1500 - IPv4 20 - TCP 20 → MSS1460
같은 ACK 번호가 반복되는 것은 앞 구간 손실의 단서다. 전통적으로 중복 ACK 3개는 fast retransmit을 유발하고, RTO 만료는 더 강한 혼잡 신호로 취급된다.
바이트 스트림과 QUIC
TCP에서 두 번의 write(100B)가 수신자에게 정확히 두 번의 100B read로 대응한다는 보장은 없다. 응용이 길이 필드나 구분자로 메시지를 프레이밍해야 한다.
TCP는 앞선 바이트 손실이 뒤 데이터 전달을 막는 HOL이 있다. QUIC은 UDP 위에 스트림별 순서·신뢰성, 연결 수준 혼잡제어, TLS를 구현해 한 스트림 손실이 다른 스트림을 직접 막는 현상을 줄인다.
순서번호 순환
TCP 순서번호는 32비트 모듈로 계산한다. 2^32-100부터 200B를 보내면 다음 ACK는 100이다. 큰 윈도에서는 오래된 세그먼트와 새 세그먼트를 구별할 수 있도록 시간·윈도 조건이 필요하다.
복습 문제
답을 생각한 뒤 정답과 근거를 펼쳐 보세요.
ISN 100과 500의 마지막 handshake ACK는?
정답과 근거
정답: 서버 SYN-ACK의 ACK는 101, 클라이언트 마지막 ACK는 501이다.
seq1000으로 500B를 받으면 ACK는?
정답과 근거
정답: 다음 기대 바이트 1500이다.
유효 송신 윈도는 어떻게 정하는가?
정답과 근거
정답: 일반적으로 min(rwnd,cwnd)다.
TCP write 경계가 read에 보존되는가?
정답과 근거
정답: 아니다. TCP는 바이트 스트림이므로 응용 프레이밍이 필요하다.
QUIC의 독립 스트림 이점은?
정답과 근거
정답: 한 스트림 손실이 다른 스트림 전달을 직접 막는 전송계층 HOL을 줄인다.