TCP(Transmission Control Protocol)는 인터넷의 전송 계층에서 가장 중요한 프로토콜 중 하나로, 신뢰성 있는 데이터 전송을 보장한다. 다음은 TCP의 기본 개념과 연결 관리 메커니즘에 대해 정리한 내용이다.
TCP란?
TCP는 **연결 지향적(Connection-Oriented)**이고 신뢰성 있는(Reliable) 전송 프로토콜이다. UDP와 달리 데이터를 전송하기 전에 연결을 설정하고, 전송 후에는 연결을 종료하는 과정을 거친다.
TCP 주요 특징
1. 연결 지향적 (Connection-Oriented)
- 데이터 전송 전 연결 설정 필요
- 양방향 통신 채널 구축
- 연결 상태 정보 유지 관리
2. 신뢰성 보장 (Reliable)
- 순서 보장: 데이터가 올바른 순서로 전달
- 오류 검출 및 복구: 손실된 패킷 재전송
- 중복 제거: 중복된 패킷 처리
3. 바이트 스트림 (Byte Stream)
- 애플리케이션 데이터를 연속된 바이트 스트림으로 처리
- 메시지 경계 없이 연속적인 데이터 흐름
- 송신자가 보낸 데이터와 수신자가 받는 데이터의 순서 보장
4. 전이중 통신 (Full-Duplex)
- 양방향 동시 데이터 전송 가능
- 각 방향마다 독립적인 시퀀스 번호 관리
3-Way Handshake
TCP 연결은 3-Way Handshake 과정을 통해 설정된다. 이 과정에서 양쪽이 통신할 준비가 되었음을 확인한다.
3-Way Handshake 과정
1단계: SYN (Synchronize)
- 클라이언트 → 서버
- 연결 요청 메시지 전송
- 초기 시퀀스 번호(ISN) 설정
- SYN 플래그 = 1, seq = x
2단계: SYN + ACK (Synchronize + Acknowledge)
- 서버 → 클라이언트
- 연결 요청 수락 및 서버의 연결 요청
- 클라이언트 시퀀스 번호 확인응답
- SYN 플래그 = 1, ACK 플래그 = 1
- seq = y, ack = x+1
3단계: ACK (Acknowledge)
- 클라이언트 → 서버
- 서버의 연결 요청 확인응답
- 연결 설정 완료
- ACK 플래그 = 1, seq = x+1, ack = y+1
왜 3-Way인가?
2-Way로는 부족한 이유:
- 서버가 클라이언트의 요청을 받았는지 클라이언트가 확인할 수 없음
- 양방향 통신 채널 설정 불완전
4-Way는 불필요한 이유:
- 3단계에서 이미 양방향 연결 확인 완료
- 추가 메시지는 오버헤드만 증가
4-Way Handshake
TCP 연결 종료는 4-Way Handshake 과정을 통해 이루어진다. 양방향 연결이므로 각 방향을 독립적으로 종료해야 한다.
4-Way Handshake 과정
1단계: FIN (Finish)
- 클라이언트 → 서버
- 데이터 전송 완료, 연결 종료 요청
- FIN 플래그 = 1, seq = m
2단계: ACK (Acknowledge)
- 서버 → 클라이언트
- 종료 요청 확인응답
- 서버는 아직 데이터 전송 가능
- ACK 플래그 = 1, ack = m+1
3단계: FIN (Finish)
- 서버 → 클라이언트
- 서버도 데이터 전송 완료, 연결 종료 요청
- FIN 플래그 = 1, seq = n
4단계: ACK (Acknowledge)
- 클라이언트 → 서버
- 서버의 종료 요청 확인응답
- 연결 완전 종료
- ACK 플래그 = 1, ack = n+1
왜 4-Way인가?
전이중 통신의 특성:
- 각 방향의 연결을 독립적으로 종료
- 한쪽이 FIN을 보내도 상대방은 계속 데이터 전송 가능
Half-Close 상태:
- 1단계 후: 클라이언트 → 서버 방향 종료
- 2단계 후: 서버는 여전히 데이터 전송 가능
- 3단계 후: 서버 → 클라이언트 방향도 종료 요청
TCP 상태 전이 (State Transition)
TCP 연결은 다양한 상태를 가지며, 각 상태 간의 전이는 엄격하게 정의되어 있다.
주요 TCP state
연결 설정 관련 상태
- CLOSED: 연결이 없는 상태
- LISTEN: 연결 요청 대기 상태 (서버)
- SYN_SENT: SYN 전송 후 SYN+ACK 대기 상태 (클라이언트)
- SYN_RECEIVED: SYN 수신 후 ACK 대기 상태 (서버)
- ESTABLISHED: 연결 설정 완료, 데이터 전송 가능 상태
연결 종료 관련 상태
- FIN_WAIT_1: FIN 전송 후 ACK 대기 상태
- FIN_WAIT_2: ACK 수신 후 상대방 FIN 대기 상태
- CLOSE_WAIT: 상대방 FIN 수신 후 자신의 FIN 전송 대기 상태
- CLOSING: 동시에 FIN 전송한 경우
- LAST_ACK: FIN 전송 후 마지막 ACK 대기 상태
- TIME_WAIT: 연결 종료 후 일정 시간 대기 상태
상태 전이도
시퀀스 번호와 확인응답 번호
TCP는 시퀀스 번호(Sequence Number)와 ack 번호(Acknowledgment Number)를 사용하여 데이터의 순서와 신뢰성을 보장한다.
시퀀스 번호 (Sequence Number)
- 32비트 크기
- 보내는 데이터의 첫 번째 바이트 번호
- 초기값은 ISN(Initial Sequence Number)으로 랜덤하게 설정
- 바이트 단위로 증가
ACK 번호 (Acknowledgment Number)
- 32비트 크기
- 다음에 받기를 기대하는 바이트 번호
- 현재까지 올바르게 받은 데이터의 마지막 바이트 + 1
- 누적 확인응답(Cumulative ACK) 방식
TCP의 장단점
장점
1. 신뢰성 보장
- 데이터 손실 없이 전송
- 순서 보장으로 데이터 무결성 유지
- 오류 검출 및 복구 기능
2. 흐름 제어
- 수신자의 처리 능력에 맞춰 전송 속도 조절
- 버퍼 오버플로우 방지
3. 혼잡 제어
- 네트워크 상황에 따른 전송 속도 조절
- 네트워크 혼잡 최소화
단점
1. 연결 설정 오버헤드
- 3-Way Handshake로 인한 지연
- 상태 정보 유지를 위한 메모리 사용
2. 헤더 오버헤드
- 최소 20바이트의 고정 헤더
- UDP 대비 2.5배 큰 헤더 크기
3. 복잡성
- 다양한 상태 관리
- 타이머 및 재전송 메커니즘
실제 활용 사례
TCP를 사용하는 애플리케이션
- HTTP/HTTPS: 웹 브라우징
- FTP: 파일 전송
- SMTP: 이메일 전송
- SSH: 원격 접속
- 데이터베이스 연결: MySQL, PostgreSQL 등
TCP vs UDP 선택 기준
TCP를 선택해야 하는 경우:
- 데이터 정확성이 중요한 경우
- 순서 보장이 필요한 경우
- 신뢰성이 성능보다 중요한 경우
UDP를 선택해야 하는 경우:
- 실시간 성능이 중요한 경우
- 간단한 요청-응답 패턴
- 멀티캐스트/브로드캐스트 필요