학습 목표
TCP(Transmission Control Protocol) 가 연결 지향·신뢰적 바이트 스트림 서비스임을 설명할 수 있다.
3-way handshake (SYN → SYN-ACK → ACK)로 연결이 수립되는 과정을 설명할 수 있다.
시퀀스 번호·ACK 로 순서·재전송이 이루어지는 원리를 설명할 수 있다.
ss, tcpdump로 TCP 상태·handshake를 확인할 수 있다.
문제 상황
- HTTP·SSH는 UDP가 아니라 TCP 위에서 동작한다
- 신뢰성·순서가 필요한데 UDP는 보장하지 않는다
curl첫 바이트 전에 지연이 있다- handshake 비용 — UDP DNS 질의와 타이밍이 다르다
- 패킷이 중간에 유실돼도 앱은 전체 파일을 받는다
- 누가 재전송하는지 — 앱인지 커널인지 모른다
ss -tn에 SYN-SENT, ESTABLISHED 등 상태가 보인다- UDP와 달리 연결 상태가 있다는 뜻
UDP는 가볍게 보내기를 봤다. HTTP·DB·SSH가 쓰는 TCP — 연결과 신뢰성부터 본다.
1. TCP란
TCP는 IP 위에서 프로세스 간 신뢰적·순서 있는 바이트 스트림을 제공하는 전송 계층 프로토콜이다. RFC 793(및 후속 RFC).
| 특성 | TCP |
|---|---|
| 연결 | 연결 지향 — handshake 후 양방향 스트림 |
| 전달 | 신뢰적 — 유실 시 재전송, 순서 보장 |
| 추상화 | 바이트 스트림 — 메시지 경계 없음 |
| 식별 | 4-tuple (src IP, src port, dst IP, dst port) |
| 상태 | 커널에 연결 상태 (seq, ack, 윈도 등) |
- 앱은
connect()/send()/recv()— 스트림 읽기·쓰기 - Full-duplex — 같은 연결에서 동시에 양방향 데이터
- 흐름 제어·혼잡 제어도 TCP가 담당 — 다음 편에서 심화
2. 3-way handshake
TCP는 데이터 전 연결을 수립한다. 클라이언트·서버가 초기 시퀀스 번호(ISN) 를 교환하고 상호 동의한다.

Client (sport 52341) Server (dport 443)
| |
| 1. SYN seq=x |
|--------------------------------------->|
| 2. SYN-ACK seq=y, ack=x+1 |
|<---------------------------------------|
| 3. ACK ack=y+1 |
|--------------------------------------->|
| ESTABLISHED · data may flow |
| 단계 | 플래그 | 의미 |
|---|---|---|
| 1 | SYN | 클라이언트 ISN x 제안 |
| 2 | SYN+ACK | 서버 ISN y, 클라 seq x+1 확인 |
| 3 | ACK | 서버 seq y+1 확인 — 연결 수립 |
- SYN — “연결 시작, 내 seq는 x”
- ACK 번호 — “다음에 기대하는 바이트” (x+1 = SYN이 1바이트 공간 차지)
- 서버는
listen()→accept()전 SYN 대기 — backlog 큐 - 동시 open, SYN flood 등은 보안·운영 주제 — 여기서는 기본 흐름만
# 새 TCP 연결만 캡처 (handshake 3패킷)
sudo tcpdump -i any -n 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0' -c 3
ss -tn state syn-sent
ss -tn state established | head -5
3. TCP 세그먼트 (개요)
데이터는 세그먼트 단위로 나가지만, 앱이 보는 것은 연속 바이트 스트림이다.

| 필드 | 역할 |
|---|---|
| Source / Dest port | demux — 9편과 동일 |
| Sequence number | 이 세그먼트 첫 바이트의 스트림 위치 |
| Acknowledgment number | 상대가 다음에 보내길 기대하는 seq |
| Flags | SYN, ACK, FIN, RST, PSH 등 |
| Window | 수신 측 여유 버퍼 — 흐름 제어 (다음 편) |
| Checksum | 오류 검출 |
- 헤더 최소 20바이트 — UDP(8B)보다 크고 옵션 가능
- 앱이
send("hello")두 번 해도 수신recv()는 한 번에 더 많이 읽을 수 있음 — 경계 없음 - MSS(Maximum Segment Size) — 한 세그먼트 payload 상한 — Path MTU와 연관
4. 신뢰적 전달 — seq와 ACK
TCP는 누적 ACK(cumulative ACK) 로 “여기까지 받았다”를 알린다. 빠진 구간이 있으면 재전송한다.

Sender seq: [1000──────1500) [1500──────2000) [2000──────2500)
OK LOST OK
Receiver: ACK 1500 (timeout) ACK 2500 after retransmit
| 메커니즘 | 설명 |
|---|---|
| 시퀀스 번호 | 스트림 바이트 오프셋 — 세그먼트마다 시작 위치 |
| 누적 ACK | “seq N까지 다 받음 → 다음은 N” |
| 타임아웃·재전송 | ACK 없으면 같은 세그먼트 재전송 |
| 순서 재조립 | 뒤 세그먼트 먼저 와도 버퍼에 모았다 순서대로 앱에 전달 |
| 중복 제거 | 같은 seq 재전송분 한 번만 반영 |
- Fast retransmit — 같은 ACK 3번 연속(duplicate ACK)이면 유실 추정 — 다음 편·Wireshark 편
- RTT 추정으로 타임아웃 조정 — 12편
- 앱은 유실·재전송을 몰라도 됨 — TCP가 바이트 스트림으로 가림
5. 연결 종료 (개요)
연결은 4-way handshake로 양쪽 FIN을 주고받으며 닫힌다 (간략).

A B
| FIN (no more send) |
|------------------------->|
| ACK |
|<-------------------------|
| FIN |
|<-------------------------|
| ACK |
|------------------------->|
| TIME_WAIT (A side) |
- FIN — “더 보낼 데이터 없음” (여전히 받기는 가능 — half-close)
- RST — 즉시 끊기 — 포트 없음·프로토콜 오류 등
- TIME_WAIT — 마지막 ACK 유실 대비 — 같은 4-tuple 즉시 재사용 이슈 (운영에서 종종)
6. UDP와 대비
| UDP | TCP | |
|---|---|---|
| 연결 | 없음 | handshake |
| 데이터 | 독립 데이터그램 | 바이트 스트림 |
| 유실 | 앱 책임 | 재전송 |
| 순서 | 보장 없음 | in-order |
| 상태 | 소켓만 | 연결 상태 (seq, cwnd 등) |
| 예 | DNS, VoIP | HTTP, SSH, PostgreSQL |
- TLS는 TCP(또는 QUIC) 위 — handshake 두 번 (TCP + TLS) 체감
- Keep-Alive HTTP는 하나의 TCP 연결 재사용 — 6편과 연결
7. 관측
# LISTEN 중인 TCP 서비스
ss -tlnp | grep ':443'
# 연결별 4-tuple + 상태
ss -tnp | grep ESTAB
# handshake만 (Wireshark 필터와 유사)
tcpdump -i any -n 'tcp port 443 and tcp[tcpflags] & tcp-syn != 0' -c 6
- State —
LISTEN,SYN-SENT,SYN-RECV,ESTABLISHED,FIN-WAIT,TIME-WAIT등 - Recv-Q / Send-Q — 수신·송신 버퍼 backlog — 막히면 앱·네트워크 병목 단서
8. 정리
- TCP는 연결 지향 — 3-way handshake로 양방향 스트림 수립
- seq·누적 ACK·재전송으로 신뢰·순서 제공 — 앱은 바이트 스트림만 본다
- 4-tuple로 연결 식별 — demux는 9편 TCP 행과 동일
- 흐름 제어·혼잡 제어·RTT는 다음 편 TCP 심화
다음에 다룰 것
- TCP 심화
- 슬라이딩 윈도, 혼잡 제어, RTT·타임아웃
해당 내용은 Computer Networking: A Top-Down Approach, 8/E (James Kurose, Keith Ross) 의 내용을 기반으로 합니다.