3-Way & 4-Way Handshake

기술노트

3-Way & 4-Way Handshake

3-Way Handshake4-Way Handshake는 TCP(Transmission Control Protocol) 통신에서 연결을 설정하고 해제하는 데 사용되는 핵심적인 절차입니다. 이 과정들을 통해 클라이언트와 서버 간의 신뢰성 있는 양방향 통신이 보장됩니다.


🤝 3-Way Handshake: TCP 연결 설정

  • 목적 : 클라이언트와 서버 간에 TCP 연결을 설정하고, 통신에 필요한 초기 시퀀스 번호(Initial Sequence Number, ISN)를 교환하여 신뢰성 있는 데이터 전송을 준비합니다.
  • 과정 (Steps)

1. SYN (Synchronize Sequence Numbers) : 클라이언트가 서버에 연결을 요청하는 SYN 패킷을 보냅니다. (클라이언트의 ISN 포함) 2. SYN-ACK (Synchronize-Acknowledgement) : 서버가 클라이언트의 SYN 요청을 수락한다는 SYN과 클라이언트의 SYN에 대한 ACK를 함께 보냅니다. (서버의 ISN 포함, 클라이언트 ISN + 1에 대한 ACK) 3. ACK (Acknowledgement) : 클라이언트가 서버의 SYN-ACK에 대한 ACK를 보냅니다. (서버 ISN + 1에 대한 ACK)

  • 의미 : 이 과정을 통해 양쪽 모두 데이터를 전송할 준비가 되었음을 확인하고, 초기 시퀀스 번호를 동기화하여 데이터 손실 없이 순서대로 데이터를 주고받을 수 있는 기반을 마련합니다.

🚪 4-Way Handshake: TCP 연결 해제

  • 목적 : 클라이언트와 서버 간에 설정된 TCP 연결을 안전하게 해제합니다. 양쪽 모두 더 이상 보낼 데이터가 없음을 확인하고, 남아있는 데이터를 모두 전송한 후 연결을 종료합니다.
  • 과정 (Steps)

1. FIN (Finish) : 클라이언트가 서버에게 연결을 종료하겠다는 FIN 패킷을 보냅니다. (클라이언트가 더 이상 보낼 데이터가 없음을 알림) 2. ACK (Acknowledgement) : 서버가 클라이언트의 FIN 요청을 받았다는 ACK 패킷을 보냅니다. (서버는 아직 보낼 데이터가 남아있을 수 있으므로, 일단 ACK만 보냄) 3. FIN (Finish) : 서버가 클라이언트에게 더 이상 보낼 데이터가 없음을 알리는 FIN 패킷을 보냅니다. 4. ACK (Acknowledgement) : 클라이언트가 서버의 FIN 요청을 받았다는 ACK 패킷을 보냅니다.

  • TIME_WAIT 상태 : 클라이언트가 마지막 ACK를 보낸 후 일정 시간(보통 2MSL, Maximum Segment Lifetime) 동안 `TIME_WAIT` 상태에 머무릅니다. 이는 서버가 마지막 ACK를 받지 못했을 경우 재전송된 FIN 패킷을 수신하여 ACK를 다시 보낼 수 있도록 하고, 네트워크에 남아있는 지연된 패킷이 새로운 연결에 영향을 주는 것을 방지하기 위함입니다.

💡 개발자 핵심 Point

  • 3-Way Handshake는 연결의 신뢰성을 확보하고, 양방향 통신을 위한 초기 시퀀스 번호를 동기화하는 데 필수적입니다.
  • 4-Way Handshake는 연결 해제 시 데이터 손실 없이 안전하게 종료하는 것을 보장합니다. 특히 `TIME_WAIT` 상태는 네트워크의 안정성을 위해 중요합니다.
  • SYN Flooding Attack : 3-Way Handshake의 취약점을 이용한 DoS(Denial of Service) 공격. 클라이언트가 SYN만 보내고 ACK를 보내지 않아 서버의 연결 자원을 고갈시키는 공격입니다.
  • CLOSE_WAIT 상태 : 서버에서 4-Way Handshake 중 두 번째 ACK를 보낸 후, 클라이언트로부터 FIN을 받기 전까지의 상태입니다. 이 상태가 비정상적으로 길게 유지된다면, 서버 애플리케이션이 소켓을 제대로 닫지 않고 있음을 의미할 수 있습니다. (메모리 누수, 자원 고갈의 원인)