TCP 연결 과정
2025-06-17 14:04

시작하기
이전 포스팅에서 TCP 는 OSI 4계층에서 신뢰성을 보장한 프로토콜이라고 소개했었다.
TCP가 어떻게 연결을 수립하고 데이터를 주고 받은 후 종료하는지 그 과정을 차례대로 이해해보자.
TCP 정의
TCP(Transmission Control Protocol) 는 연결 지향적이고, 신뢰성 있는 전송을 보장하는 프로토콜이다.
일반적으로 네트워크에서 데이터를 주고 받을 때 패킷을 기본 단위로 사용해왔지만,
TCP에서는 기본적으로 바이트 스트림 기반으로 동작한다.
애플리케이션이 보내는 데이터를 바이트 단위로 처리하고, 이 바이트들을 TCP가 적절히 나누어서 전송한다.
이때 나뉜 데이터 블록을 TCP 세그먼트 라고 한다.

각 바이트에는 고유한 번호가 매겨지고, 시퀀스 번호(Sequence Number) 를 가진다.
이 번호를 통해서 데이터 수신자에서는 정확한 순서로 데이터를 재조립해서 통신할 수 있다.
TCP 시퀀스 번호 (Sequence Number)
TCP에서는 데이터가 바이트 스트림 형태로 전송되기 위해서 각 바이트에 고유한 시퀀스 번호가 부여된다.
시퀀스 번호는 첫 번째 바이트부터 순차적으로 할당된다.
ISN (Initial Sequence Number)
- TCP 연결이 시작되면 무작위 값으로 초기 시퀀스 번호(ISN) 을 사용한다.
- 이때 ISN은 0부터 시작하지 않고 임의의 숫자를 사용해서 보안성을 높였다.
- 시퀀스 번호는 전송한 바이트만큼 1씩 증가한다.
예를 들어,
첫 번째 바이트가ISN+1
이라면,
두 번째 바이트는ISN+2
,
세 번째 바이트는ISN+3
순으로 계속 증가한다.
TCP 시퀀스 번호와 ACK
TCP는 수신한 데이터에 대해서 ACK (Acknowledgment) 번호를 보낸다.
이 번호는 다음에 받을 바이트 번호이다.
예를 들면, 시퀀스 번호 1001부터 1010까지 데이터를 받았다면,
수신자 측은 ACK 1011을 응답값으로 보낸다.
성공적으로 수신한 데이터의 마지막 바이트 번호 + 1 을 ACK로 보낸다.
양방향 통신 (Full-Duplex)
TCP는 양방향 연결(Full-Duplex) 을 전제로 한다.
즉, 데이터를 보내는 쪽과 받는 쪽이 모두 시퀀스 번호와 ACK 번호를 관리하며 서로 확인 응답을 주고받는다.
이러한 구조 덕분에 TCP는 신뢰성과 순서를 보장할 수 있다.
3-Way Handshake 연결 과정

-
SYN
클라이언트가 서버에게 연결 요청을 보내면서 자신의 ISN을 같이 보낸다. -
SYN-ACK
서버가 클라이언트의 요청을 수락하고, ISN을 잘 받은 것을 확인한다.
동시에 자신의 ISN을 함께 보낸다. -
ACK
클라이언트가 서버의 응답을 잘 받았다고 확인 메시지를 보낸다.
TCP 연결 종료 (4-Way Handshake)

TCP 연결을 정상적으로 종료하려면 양쪽에 보낼 데이터가 없다고 알려야 한다.
이때 사용하는 것이 FIN 패킷이다.
FIN은 Finish 의 약자로,
양쪽이 모두 FIN과 ACK를 주고 받으면 연결이 완전히 종료된다.
TCP는 양방향 통신이기 때문에,
종료도 양쪽 모두 동의해야 완전히 닫힌다.
요약
- TCP는 연결 지향적, 신뢰성 보장, 순서 보장, 흐름 제어 등의 특징을 가진 전송 프로토콜이다.
- 데이터를 바이트 단위로 처리하고, 이를 세그먼트로 나누어 전송한다.
- 3-Way Handshake를 통해 연결을 수립하며, 4-Way Handshake로 연결을 종료한다.
- 시퀀스 번호와 ACK 번호를 기반으로 신뢰성 있는 통신이 가능하다.