개요
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
작동 방식
(출처 : 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