3-way Handshake & 4-way Handshake

신동수·2024년 4월 2일
0

잡동사니

목록 보기
13/17

용어 설명

Stage 정보

  • CLOSED: 포트가 닫힌 상태
  • LISTEN: 포트가 열린 상태로 연결 요청 대기 상태
  • SYN_RECV: SYNC 요청을 받고 상대방의 응답을 기다리는 상태
  • ESTABLISHED: 포트 연결 상태
  • TIME_WAIT: Server로부터 FIN을 수신하더라도 일정시간(default: 240초)동안 세션을 남겨놓고 잉여 패킷을 기다리는 상태

Flag 정보

  • SYN(Synchronize Sequence Number) : 연결 설정, 커넥션을 생성할 때 사용하는 Flag
  • ACK(Acknowledgement) : 응답 확인, 패킷을 받았다는 것을 의미하는 Flag
  • FIN (Finish) : 연결 해제, 세션 연결을 종료할 때 사용되며, 더 이상 데이터가 없음을 의미하는 Flag

3-way Handshake

TCP/IP 프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정이다.

Step1

Client -> SYN -> Server
Client 가 Server 로 접속을 요청하는 SYN 플래그를 전달한다.

Step2

Server -> SYN + ACK -> Client
Server 는 Listen 상태에서 SYN 플래그를 확인하고 SYN_RECV 상태로 바뀌어 SYN+ACK 플래그를 Client 로 전달한다. 그 후 ACK 플래그를 받기 위한 대기상태로 변경된다.

Step3

Client -> ACK -> Server
SYN + ACK 상태를 확인한 Client는 서버에게 ACK를 보내고 연결 성립(Established)이 된다. 

4-way Handshake

3way handshake가 연결확립을 위해 진행했다면 4way handshake는 세션을 종료하기 위해 수행되는 절차이다.

Step1

Client -> FIN -> Server
Client가 연결을 종료하겠다는 FIN플래그를 전송한다. 보낸 후에 FIN-WAIT-1 상태로 변한다.

Step2

Server -> ACK -> Client
FIN 플래그를 받은 Server는 확인메세지인 ACK를 Client에게 전달한다. 그 후 CLOSE-WAIT상태로 변한다. Client도 마찬가지로 Server에서 종료될 준비가 됐다는 FIN을 받기위해  FIN-WAIT-2 상태가 된다.

Step3

Server -> FIN -> Client
Server는 Client에게 FIN 플래그를 전달한다.

Step4

Client -> ACK -> Server
Client는 FIN 플래그를 받고, 확인했다는 ACK 를 Server에 전달한다. (아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT을 통해 기다린다.)

  • 서버는 ACK를 받은 이후 소켓을 닫음
  • TIME_WAIT 시간이 끝나면 클라이언트도 닫음

간단 정리

TCP의 연결 설정 과정(3단계)과 연결 종료 과정(4단계)이 단계가 차이나는 이유?

Client가 데이터 전송을 마쳤다고 하더라도 Server는 아직 보낼 데이터가 남아 있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 후에 자신도 FIN 메세지를 보내기 때문이라고 볼 수 있다.

만약 Server에서 FIN 플래그를 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생하면 어떻게 될까?

TCP는 이러한 현상에 대비하여 Client는 Server로부터 FIN 플래그를 수신하더라도 일정시간동안 세션을 남겨놓고 기다리는 과정을 거친다.

초기 Sequence Number인 ISN을 0부터 시작하지 않고 난수를 생성해서 설정하는 이유?

Connection을 맺을 때 사용하는 포트(Port)는 유효한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재한다. 서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순처적인 Number가 전송된다면 이전의 Connection으로부터 오는 패킷으로 인식할 수 있다. 이런 문제가 발생할 가능성을 줄이기 위해서 난수로 ISN을 설정한다.

profile
조금씩 성장하는 DevOps 엔지니어가 되겠습니다. 😄

0개의 댓글