TCP(Transmission Control Protocol)는 연결 지향적(Connection-Oriented) 프로토콜로, 안정성과 신뢰성을 보장하기 위해 데이터를 전송하기 전 연결을 설정하고, 데이터 전송이 끝난 후에는 연결을 안전하게 종료하는 과정을 거칩니다.
연결 설정 과정은 3-way 핸드셰이크(Three-Way Handshake) 를 통해 이루어지며, 이를 통해 송신자와 수신자는 서로를 확인하고 신뢰할 수 있는 데이터 전송 환경을 구축합니다.
반면, 연결 종료 과정에서는 4-way 핸드셰이크(Four-Way Handshake) 를 통해 양측이 정상적으로 데이터를 주고받았음을 확인한 후 연결을 차례대로 종료합니다.
이번 글에서는 TCP 연결 설정 및 종료 과정을 심층적으로 살펴보고, 그 중요성을 이해해보겠습니다.
1. TCP 연결 설정: 3-way 핸드셰이크
TCP 연결을 설정하기 위해서는 클라이언트와 서버가 세 번의 메시지를 교환하는 과정을 거쳐야 합니다. 이를 3-way 핸드셰이크라고 합니다.
3-way 핸드셰이크 과정
SYN (Synchronize) - 클라이언트 → 서버
- 클라이언트는 서버와의 연결을 요청하는
SYN
패킷을 전송합니다. - 이때, 클라이언트는 자신의 초기 순서 번호(Sequence Number)를 포함하여 보냅니다.
- 클라이언트는 서버와의 연결을 요청하는
SYN-ACK (Synchronize-Acknowledge) - 서버 → 클라이언트
- 서버는 클라이언트의 요청을 수락하고
SYN-ACK
패킷을 보냅니다. - 서버도 자체적인 초기 순서 번호를 포함하여 연결 준비가 되었음을 알립니다.
- 서버는 클라이언트의 요청을 수락하고
ACK (Acknowledge) - 클라이언트 → 서버
- 클라이언트는 서버의 응답을 확인한 후
ACK
패킷을 보내 연결을 완료합니다. - 이제 데이터 전송이 가능한 상태(Established) 가 됩니다.
- 클라이언트는 서버의 응답을 확인한 후
실제 예시
웹사이트에 접속할 때, 브라우저(클라이언트)가 웹 서버와 TCP 연결을 맺는 과정은 다음과 같이 진행됩니다.
- 사용자가 웹사이트 주소(
https://example.com
)를 입력하면, 브라우저가 서버에SYN
패킷을 보냅니다. - 서버는 요청을 받고
SYN-ACK
패킷을 응답합니다. - 클라이언트는 마지막으로
ACK
패킷을 보내며 연결이 성립됩니다.
이제 클라이언트와 서버는 서로 데이터를 주고받을 수 있습니다.
2. TCP 연결 해제: 4-way 핸드셰이크
TCP 연결이 완료된 후, 더 이상 데이터 전송이 필요하지 않을 경우 안전한 연결 종료가 필요합니다.
연결을 종료하는 과정에서 클라이언트와 서버는 네 번의 메시지를 주고받는 방식을 따르며, 이를 4-way 핸드셰이크(Four-Way Handshake) 라고 합니다.
4-way 핸드셰이크 과정
FIN (Finish) - 클라이언트 → 서버
- 클라이언트가 더 이상 데이터를 전송하지 않겠다는
FIN
패킷을 서버로 전송합니다. - 하지만 서버는 즉시 연결을 끊지 않고, 남아 있는 데이터가 있다면 계속 처리할 수 있습니다.
- 클라이언트가 더 이상 데이터를 전송하지 않겠다는
ACK (Acknowledge) - 서버 → 클라이언트
- 서버는 클라이언트의 요청을 확인하고
ACK
패킷을 보냅니다. - 이 단계에서 서버는 아직 데이터를 보낼 수 있으며, 연결이 완전히 끊긴 상태는 아닙니다.
- 서버는 클라이언트의 요청을 확인하고
FIN (Finish) - 서버 → 클라이언트
- 서버도 모든 데이터 전송을 완료한 후, 이제 자신도 더 이상 보낼 데이터가 없음을
FIN
패킷을 통해 클라이언트에게 알립니다.
- 서버도 모든 데이터 전송을 완료한 후, 이제 자신도 더 이상 보낼 데이터가 없음을
ACK (Acknowledge) - 클라이언트 → 서버
- 클라이언트는 서버의 FIN 메시지를 확인하고, 마지막으로
ACK
패킷을 보내 연결을 완전히 종료합니다. - 이로써 TCP 연결이 완전히 해제(Closed) 됩니다.
- 클라이언트는 서버의 FIN 메시지를 확인하고, 마지막으로
실제 예시
- 사용자가 웹사이트를 다 이용한 후 브라우저의 탭을 닫습니다.
- 브라우저(클라이언트)는 서버에
FIN
패킷을 보내며 연결 종료를 요청합니다. - 서버는
ACK
를 응답하며, 아직 남아 있는 데이터를 모두 보냅니다. - 서버가 전송을 마치면,
FIN
패킷을 클라이언트로 보냅니다. - 클라이언트는
ACK
패킷을 마지막으로 보내고 연결이 해제됩니다.
3. 연결 종료 시 발생할 수 있는 문제
1) TIME_WAIT 상태
TCP에서는 연결이 종료된 후, 일정 시간 동안 TIME_WAIT 상태를 유지합니다.
- 이는 이전에 송수신된 패킷이 네트워크에서 지연되었을 가능성을 대비하기 위함입니다.
- 보통 TIME_WAIT 상태는 약 2배의 최대 세그먼트 수명(2MSL, Maximum Segment Lifetime) 동안 유지됩니다.
2) 연결이 강제 종료될 경우 (RST 패킷)
- 특정 상황에서 TCP 연결을 즉시 종료해야 할 경우,
RST(Reset)
패킷이 사용됩니다. - 예를 들어, 서버가 다운되거나 연결이 비정상적으로 종료될 때
RST
패킷이 전송될 수 있습니다. - 그러나 이 방식은 정상적인 종료 방법이 아니므로, 데이터 손실이 발생할 가능성이 있습니다.
4. 결론
TCP는 신뢰성 있는 데이터 전송을 위해 연결 설정(3-way 핸드셰이크) 과 연결 해제(4-way 핸드셰이크) 과정을 체계적으로 수행합니다.
✔ 3-way 핸드셰이크를 통해 송신자와 수신자는 서로 연결을 확인하고 데이터 전송 준비를 마칩니다.
✔ 4-way 핸드셰이크를 통해 양측이 데이터를 모두 전송했음을 확인하고 안전하게 연결을 종료합니다.
✔ 연결 해제 후 일정 시간 동안 TIME_WAIT 상태를 유지하여 네트워크 패킷을 관리합니다.
✔ 비정상적인 종료(RST 패킷)도 가능하지만, 데이터 손실이 발생할 수 있습니다.
이러한 구조 덕분에 TCP는 웹 브라우징, 이메일 송수신, 파일 다운로드, 온라인 게임 등 인터넷 전반에서 안정적인 통신 환경을 제공합니다.
📌 주요 포인트 정리
1️⃣ TCP 연결 설정은 3-way 핸드셰이크(SYN → SYN-ACK → ACK) 를 사용하여 신뢰성을 확보
2️⃣ 연결 해제는 4-way 핸드셰이크(FIN → ACK → FIN → ACK) 를 통해 안전하게 종료
3️⃣ TIME_WAIT 상태를 유지하여 데이터 손실을 방지
4️⃣ 비정상적인 종료 시 RST
패킷을 통해 즉시 연결 해제 가능
5️⃣ 웹 브라우징, 파일 전송, 온라인 게임 등에서 TCP의 신뢰성 덕분에 원활한 통신 가능
이처럼 TCP의 연결 설정 및 종료 절차는 단순한 데이터 전송을 넘어, 네트워크 전반의 안정성과 효율성을 유지하는 데 중요한 역할을 합니다.
'네트워크 > TCP' 카테고리의 다른 글
TCP 흐름 제어: 흐름 제어 메커니즘 (0) | 2025.03.08 |
---|---|
TCP 흐름 제어: 슬라이딩 윈도우 (0) | 2025.03.08 |
연결 설정 및 해제: 3-way 핸드셰이크 (0) | 2025.03.08 |
TCP 세그먼트 구조: 데이터 (0) | 2025.03.08 |
TCP 세그먼트 구조: 헤더 (0) | 2025.03.07 |