연결을 맺고, 순서대로, 빠짐없이 데이터를 보내는 전송 계층 프로토콜 (Transmission Control Protocol).
"전송 계층"이 하는 일
IP는 패킷을 목적지 컴퓨터까지만 보내 준다. 그것도 순서·도착을 보장하지 않는다. 전송 계층은 그 위에서 두 가지를 더한다.
- 포트 번호 — 컴퓨터 안의 어느 프로그램인지 구분(80은 웹, 3306은 MySQL)
- 신뢰성 — TCP가 담당. UDP는 안 함
신뢰성을 만드는 다섯 장치
| 장치 | 하는 일 | 없으면 |
|---|---|---|
| 시퀀스 번호 | 각 바이트에 번호를 매김 | 순서가 뒤바뀜, 중복을 못 걸러냄 |
| ACK | "몇 번까지 받았다"고 알림 | 도착 여부를 모름 |
| 재전송 | ACK가 안 오면 다시 보냄 | 유실되면 끝 |
| 체크섬 | 손상 검출 | 깨진 데이터를 그대로 씀 |
| 흐름·혼잡 제어 | 속도 조절 | 수신자·네트워크가 넘침 |
세그먼트가 어떻게 생겼나
TCP가 데이터에 붙이는 헤더는 최소 20바이트다.
┌──────────────┬─────────────────┐
│ 출발지 포트 │ 목적지 포트 │ 프로그램 구분
├──────────────┴─────────────────┤
│ 시퀀스 번호 (4B) │ 이 데이터가 몇 번째 바이트부터인지
├────────────────────────────────┤
│ ACK 번호 (4B) │ "여기까지 받았다"
├──────┬──────┬──────────────────┤
│ 플래그│ 윈도우 크기 │ SYN/ACK/FIN … / 수신 여유 공간
├──────┴──────┬──────────────────┤
│ 체크섬 │ │
└─────────────┴──────────────────┘
윈도우 크기가 흐름 제어에, 시퀀스·ACK가 재전송에 쓰인다.
재전송은 언제 일어나나
- 타임아웃 — 일정 시간 ACK가 안 오면. 시간은 왕복 지연(RTT)을 재서 동적으로 정한다.
- 중복 ACK 3회 — 수신자가 "5번 다음이 필요해"를 세 번 반복하면 5번이 유실됐다고 보고 타임아웃을 기다리지 않고 바로 보낸다(빠른 재전송).
대가
- 연결에 왕복 1.5회(3-way handshake)가 든다
- 순서 보장 때문에 앞 패킷이 늦으면 뒤가 다 기다린다 → HOL Blocking
- 헤더가 UDP(8B)보다 크다
면접 꼬리질문
- "체크섬으로 오류를 정정할 수 있나?" → 불가. 검출만 하고 재전송으로 복구한다.
- "TCP가 항상 UDP보다 느린가?" → 오버헤드는 크지만, 손실이 잦은 구간에서는 재전송을 스스로 처리해 완주 시간이 오히려 짧을 수 있다.
- "신뢰성을 보장한다는 게 무슨 뜻인가?" → 반드시 도착한다가 아니라, 도착하면 순서와 무결성이 보장되고, 못 가면 애플리케이션에 알려 준다는 뜻이다.