[CS] TCP 3-way-handshake & 4-way-handshake

이준기·2022년 8월 1일
0

개요


3-Way Handshake는 TCP 네트워크의 연결을 설정, 4-Way Handshake는 TCP 네트워크 연결을 해제하는 과정이다.

  • 포트(PORT) 상태 정보
    • CLOESD: 포트가 닫힌 상태
    • LISTEN: 포트가 열린 상태로 연결 요청 대기 중
    • ESTABLISHED: 포트 연결 상태
  • 플래그 정보
    • SYN(Synchronize Sequence Number)
      • 연결 요청. 세션을 설정하는데 사용되며, 초기에 Sequence Number를 랜덤으로 설정하여 전송한다. → 랜덤으로 설정하는 이유: Connection을 맺을 때 사용하는 포트(Port)는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재한다. 서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순차적인 Number가 전송된다면 이전의 Connection으로부터 오는 패킷으로 인식할 수 있다. 이런 문제가 발생할 가능성을 줄이기 위해서 난수로 ISN을 설정한다.
    • ACK(Acknowledgment)
      • 응답 확인. 패킷을 받았다는 것을 의미한다.
    • FIN(Finish)
      • 연결 해제. 세션 연결을 종료시킬때 사용되며, 더 이상 전송할 데이터가 없음을 의미한다.

TCP 3-Way Handshake


  • TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 설정하는 과정
  • 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달이 시작하기 전에 한 쪽에서 다른 쪽이 준비되었다는 것을 알 수 있도록 한다.
  • 즉, TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송(신뢰성)을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.

작동 방식

  • Client와 Server는 서로 연결 요청을 먼저 할 수 있기 때문에, 연결 요청을 먼저 시도한 쪽을 Client(Host P), 연결 요청을 받은 수신자를 Server(Host Q)라고 가정함

(출처 : https://velog.io/@averycode/네트워크-TCPUDP와-3-Way-Handshake4-Way-Handshake)

  • STEP 1 (SYN)
    • 클라이언트는 서버와 연결하기 위해 SYN(x)을 보냄 (seq : x)
    • 포트 상태
      • Client: CLOSED → SYN_SENT
      • Server: LISTEN → SYN_RCV
  • STEP 2 (SYN + ACK)
    • 서버는 클라이언트에게 SYN를 받았다는 신호(연결 요청 수락)인 ACK(x+1)와 SYN(y) 패킷을 보냄 (seq : y, ack : x+1)
    • 포트 상태
      • Client: SYN_SENT → ESTABLISHED
      • Server: SYN_RCV
  • STEP 3 (ACK)
    • 서버는 ACK(y+1)을 보내 연결을 맺음
    • 포트 상태
      • Client: ESTABLISHED
      • Server: SYN_RCV → ESTABLISHED

TCP 4-Way Handshake


  • 맺어진 TCP 네트워크 연결을 해제하는 과정

작동 방식

(출처 : https://velog.io/@averycode/네트워크-TCPUDP와-3-Way-Handshake4-Way-Handshake)

  • STEP 1 (FIN)
    • 클라이언트가 close()를 호출하여 연결을 끊는다는 신호인 FIN을 보냄
    • 포트 상태
      • Client: ESTABLISHED → FIN_WAIT_1
      • Server: ESTABLISHED → CLOSE_WAIT
  • STEP 2 (ACK)
    • 서버가 확인했다는 신호인 ACK를 보내고, 남은 데이터가 있다면 마저 전송을 마친 후에 close()를 호출함
    • 포트 상태
      • Client: FIN_WAIT_1 → FIN_WAIT_2
      • Server: CLOSE_WAIT
  • STEP 3 (FIN)
    • 서버가 남은 데이터를 모두 보냈다면, 서버도 연결을 합의하에 종료한다는 신호로 FIN을 보냄
    • 클라이언트의 TIME_WAIT 상태는 의도치 않은 에러로 연결이 데드락으로 빠지는 것을 방지 → 종료가 지연되다가 타임이 초과되면 CLOSED 로 들어감
    • 포트 상태
      • Client: FIN_WAIT_2 → TIME_WAIT
      • Server: CLOSE_WAIT → LAST_ACK
  • STEP 4(ACK)
    • 클라이언트가 확인했다는 신호인 ACK를 보내고, 서버는 ACK를 받고 소켓을 닫음
    • 포트 상태
      • Client: TIME_WAIT → CLOSED
      • Server: LAST_ACK → CLOSED

Reference

https://velog.io/@averycode/네트워크-TCPUDP와-3-Way-Handshake4-Way-Handshake

https://asfirstalways.tistory.com/356

profile
Hongik CE

0개의 댓글