네트워크 기초

TCP 기초

meellon 2026. 6. 28. 05:10

학습 목표

TCP(Transmission Control Protocol)연결 지향·신뢰적 바이트 스트림 서비스임을 설명할 수 있다.

3-way handshake (SYN → SYN-ACK → ACK)로 연결이 수립되는 과정을 설명할 수 있다.

시퀀스 번호·ACK순서·재전송이 이루어지는 원리를 설명할 수 있다.

ss, tcpdumpTCP 상태·handshake를 확인할 수 있다.

문제 상황

  • HTTP·SSH는 UDP가 아니라 TCP 위에서 동작한다
    • 신뢰성·순서가 필요한데 UDP는 보장하지 않는다
  • curl 첫 바이트 전에 지연이 있다
    • handshake 비용 — UDP DNS 질의와 타이밍이 다르다
  • 패킷이 중간에 유실돼도 앱은 전체 파일을 받는다
    • 누가 재전송하는지 — 앱인지 커널인지 모른다
  • ss -tnSYN-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
  • StateLISTEN, 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) 의 내용을 기반으로 합니다.

'네트워크 기초' 카테고리의 다른 글

IP와 라우팅  (0) 2026.06.30
TCP 심화  (0) 2026.06.29
UDP  (0) 2026.06.27
전송 계층 역할  (0) 2026.06.26
DNS  (0) 2026.06.25