본문 바로가기
Network

CS 네트워크 TCP 3-Way Handshake & 4-Way Handshake

by 차가운개발 2024. 10. 14.

 

TCP의 3-way Handshake4-way Handshake는 각각 연결 설정연결 종료 과정에서 사용하는 절차이다. 이 과정은 신뢰성 있는 데이터 전송을 보장하기 위해 필수적이다. 

 

 ㅇ 플래그 정보

  • SYN
    연결을 초기화할 때 사용
    시퀀스 번호의 초기화를 의미
  • ACK
    이전에 수신한 데이터나 연결 요청을 확인하기 위해 사용
    응답이 도착했음을 확인하는 역할 
    ACK 번호는 수신한 데이터의 다음 시퀀스 번호를 가리킨다.
  • FIN
    연결 종료를 요청할 때 사용
    4-Way Handshake에서 각 측의 데이터 전송이 끝났음을 알리기 위해 사용

 

ㅇ 3-Way Handshake

포트 상태 정보

  • CLOSED : 포트가 닫힌 상태
  • LISTEN : 포트가 열린 상태로 연결 요청 대기중
  • SYN_SENT : SYN 요청을 한 상태
  • SYN_RECEIVED : SYN 요청을 받고 상대방의 응답을 대기중 
  • ESTABLISHED : 포트 연결 상태

 

동작 과정

1. Client Server (SYN)

  • 서버에 접속을 요청하는 SYN 패킷을 전송한다.
  • 송신자가 최초로 데이터를 전송할 때 시퀀스 넘버를 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다.
  • 클라이언트는 SYN을 보낸 후 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.

2. Server → Client(SYN/ACK)

  • LISTEN 상태인 Server가 SYN을 받고, 클라이언트에게 요청을 수락(ACK)했으며 접속 요청 프로세스인 클라이언트도 포트를 열어달라는 SYN 메세지를 전송한다
  • ACK 넘버필드를 시퀀스 넘버 + 1로 지정하고 SYN과 ACK 플래그 비트를 1로 설정한 세그먼트 전송
  • SYN을 받은 서버는 SYN_RECEIVED 상태가 된다.

3. Client → Server(ACK)

  • 클라이언트는 서버의 응답을 받았다는 의미로, ACK 넘버필드를 시퀀스 넘버 + 1로 지정하고 서버로 ACK 플래그가 설정된 세그먼트를 전송한다.
  • ACK 요청을 보낸 클라이언트는 ESTABLISHED 상태가 된다.
  • ACK를 받은 서버는 ESTABLISHED 상태가 된다.

 

ㅇ 4-Way Handshake

포트 상태 정보

  • FIN_WAIT_1 : Close()를 호출 후 FIN 패킷을 보내고 응답을 대기하는 상태
  • CLOSE_WAIT : 종료 요청을 받고 진입하는 상태로 남은 데이터가 있다면 전송을 마친 후 Close() 호출
  • FIN_WAIT_2 : 종료를 준비한다는 응답을 받고 종료 요청이 올 때까지 대기
  • LAST_ACK : 모든 데이터를 보내고 FIN 패킷을 전송한 후 상대방의 응답을 대기
  • TIME_WAIT : FIN 패킷을 받은 후 다시 ACK 응답을 한 이후의 상태, 의도치 않은 에러로 인해 연결이 데드락에 빠지는 것을 방지

 

동작 과정

1. Client Server(FIN)

  • close()가 호출되면 연결을 종료한다는 FIN 패킷을 보낸다.
  • FIN 패킷에는 ACK가 포함되어있다.
  • FIN 패킷을 보낸 후 FIN_WAIT_1 상태가 된다.

2. Server Client(ACK)

  • FIN 패킷을 받은 서버는 응답 패킷 ACK를 보낸다.
  • 응답 패킷 ACK를 보낸 후 CLOSE_WAIT 상태가 된다.
  • 아직 남은 데이터가 있다면 마저 전송을 마친 후에 close()를 호출한다.
  • 클라이언트는 ACK 패킷을 받은 후 FIN_WAIT_2 상태가 된다.

3.Server Client(FIN)

  • 데이터를 모두 보냈다면 서버는 FIN 패킷을 클라이언트에게 보낸 후에 승인 번호를 보내줄 때까지 기다리는 LAST_ACK상태로 들어간다.

4.Client Server(ACK)

  • 클라이언트는 FIN 패킷을 받고 확인했다는 ACK 응답을 보낸다.
  • ACK 응답을 보낸 후 클라이언트는 TIME_WAIT 상태가 된다.
  • TIME_WAIT 상태는 의도치 않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지한다.
  • 만약 에러로 인해 종료가 지연되다 타임이 초과되면 CLOSED 상태로 들어간다.
  • 서버는 ACK를 받은 이후 소켓을 닫는다(Closed)
  • TIME_WAIT 시간이 끝나면 클라이언트도 닫는다 (Closed) 기본 240초