TCP (Transmission Control Protocol) — TCP·IP 스택 Transport 계층의 연결 지향(connection-oriented) 프로토콜. 3-Way Handshake로 연결을 설정한 뒤 Sequence/Acknowledge 기반으로 신뢰성 있는 바이트 스트림을 제공한다.
주요 특징
- 연결 지향 — 통신 시작 전 연결을 설정. 연결된 소켓은 양 프로세스를 잇는 byte stream.
- 신뢰성 있는 전송 — Sequence/Acknowledge 번호로 정상 송수신 확인, 오류 시 자동 재전송.
- 데이터 경계 없음 — 소켓에 데이터가 쌓이는 스트림 구조. Application은 순서 보존 가정 가능.
- Flow Control — 수신 버퍼 오버플로우 방지를 위해 송신량 조절.
- Congestion Control — 네트워크 혼잡 시 송신량 조절.
3-Way Handshake
연결 설정(Connection Establish)을 위한 3단계 핸드셰이크:
- Client → Server: SYN
- Server → Client: SYN + ACK
- Client → Server: ACK
연결 완료 후 송·수신 프로세스 간 바이트 스트림 형성. TCP도 UDP와 동일하게 서버 IP·Port를 사전에 알고 있어야 함.
Sequence / Acknowledge 메커니즘
- 송신: Seq. 번호를 부여하여 전송.
- 수신: 정상 수신 시 Seq. + 1 을 Ack. 로 회신.
- 일정 시간 동안 Ack.이 오지 않으면 손실로 간주하고 재전송.
- 누적 ACK (cumulative ACK) — 중복 ACK나 ACK 일부 손실이 발생해도 재전송 불필요한 경우 처리.
Flow Control
수신자의 Rx 버퍼 읽기 속도보다 송신이 빠르면 오버플로우 발생 → 재전송 폭증 → 네트워크 성능 저하. 수신 버퍼 상태를 송신자가 참조하여 전송량 조절.
Stop & Wait
- 수신 노드의 ACK 수신 후 새 메시지 전송.
- ACK 메시지에 Window Size(수신 가능 버퍼 크기) 포함.
- 단순하지만 ACK 대기로 인한 전송 지연 문제.
Sliding Window
- 최초 연결 시 수신자 Window Size 수신.
- 클라이언트는 Window Size 만큼 ACK 없이 연속 전송 가능.
- Stop & Wait의 지연 문제 해결.
오류 제어 (ARQ)
ARQ (Automatic Repeat Request) — 재전송 기반 오류 제어. 에러 감지 조건:
- 일정 시간 이상 ACK 미수신
- 중복 ACK 수신
Go-back-N vs Selective Repeat
| 구분 | Go-back-N | Selective Repeat |
|---|---|---|
| 에러 발생 시 | 손상된 프레임 이후 모두 재전송 | 손상된 프레임만 재전송 |
| 구현 난이도 | 단순, 구현 쉬움 | 프레임 재배열로 복잡 |
| 버퍼 요구 | 데이터 폐기로 작은 버퍼 | 재배치용 큰 버퍼 필요 |
Fast Retransmit
- 동일 ACK가 3번 이상 수신되면 ACK되지 않은 segment 중 가장 작은 Seq. #를 Timeout을 기다리지 않고 재전송.
Delayed Acknowledge
- ACK 오버헤드를 줄이기 위해 일정 타이머 기준으로 모아서 ACK 전송.
Congestion Control
전송 계층이 네트워크 혼잡을 감지해 제어. 라우터 버퍼 오버플로우 → 메시지 손실 → 재전송 → 혼잡 악화 순환을 방지. 4가지 알고리즘:
AIMD (Additive Increase / Multiplicative Decrease)
TCP 혼잡 제어의 핵심 원리.
- Multiplicative Decrease — 패킷 손실 감지 시 송신 속도를 절반으로 감소.
- Additive Increase — 성공적 전송 시 조금씩 속도 증가.
Slow Start
- 연결 초기 전송 패킷 수 제어.
- 송신 Window Size를 지수적으로 증가시키며 네트워크 부하 최소화하에 최대 속도 도달.
Fast Recovery
- 패킷 손실 감지 시 Window Size를 반으로 줄인 뒤 조금씩 증가시키며 전송 지속.
Fast Retransmit
중복 ACK 기반 조기 재전송 (위 오류 제어 참조).
프로그래밍 모델
- 소켓 생성 →
connect()수행(연결 설정) →send()/recv()사용. - 데이터 경계를 구분하지 않고 소켓에 데이터가 쌓이는 구조.
UDP와의 비교
| 항목 | TCP | UDP |
|---|---|---|
| 연결 | Connection-oriented | Connectionless |
| 신뢰성 | 보장 (Seq/Ack, 재전송) | 비보장 |
| 순서 보장 | 예 | 아니요 |
| 헤더 크기 | 20 Byte+ (가변) | 8 Byte 고정 |
| 속도 | 상대적 느림 | 빠름 |
| 응용 | 파일 전송, 웹 (HTTP), 이메일 | 스트리밍, DNS, 게임 |