CS 정리/Network

TCP 연결, 해제 과정. 3 way hand shake, 4 way hand shake

tose33 2023. 10. 24. 19:51

3 way handshake

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

 

 

TCP 통신은 PAR (Positive Acknowldge with Re-transmission) 을 통해 신뢰적인 통신 제공.

PAR 을 사용하는 기기는 ack 을 받을 때 까지 유닛을 재전송한다.

 

수신자가 세그먼트 (데이터 유닛) 가 손상된것을 확인하면 해당 세그먼트를 없앤다.

그러면 송신자는 positive ack 이 오지 않은 데이터 유닛을 다시 전송해야 한다.

 

3 way handshake 의 역할은 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고

실제로 데이터 전달이 시작하기 전에 다른 쪽이 준비 되었다는 것을 알 수 있도록 한다.

 

작동 방식

step 1) SYN 단계 

A 클라이언트는 B 서버에게 클라이언트의 ISN을 담아 SYN 을 보냄.

ISN은 새로운 TCP 연결의 첫 번째 패킷에 할당된 32 비트의 임의의 시퀸스 번호를 말하며 장치마다 다를수 있음.

 

A 클라이언트 상태 : SYN 을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태

B 서버 상태 : LISTEN 

 

step 2) SYN+ACK 단계 

B 서버는 SYN 요청을 받고 A 클라이언트에게 요청을 수락한다는 ACK 와, 

서버의 ISN 을 보내며 승인번호로 클라이언트의 ISN + 1 을 보낸다.

 

A 클라이언트 상태 : CLOSED

B 서버 상태 : SYN_RCV

 

step 3) ACK 단계 

클라이언트는 서버의 ISN+1 한 값인 승인번호를 담아 ACK를 서버에 보냄.

 

A 클라이언트 상태 : ESTABLISED

B 서버 상태 : SYN_RCV -> ACK -> ESTABLISED 

 

 


4 way handshake

tcp 연결을 해제하는 과정.

 

step 1) 

클라이언트가 연결을 닫으려고 할때 FIN 으로 설정된 세그먼트를 보낸다.

그리고 클라이언트는 FIN_WAIT_1 상태로 들어가고 서버의 응답을 기다린다.

 

step 2)

서버는 클라이언트로 ACK 라는 승인 세그먼트를 보낸다.

그리고 자신의 통신이 끝날때 까지 기다리는 CLOSE_WAIT 상태에 들어간다.

클라이언트가 세그먼트를 받으면 FIN_WAIT_2 상태에 들어간다.

 

step 3)

서버는 ACK 를 보내고 일정 시간 이후에 클라이언트에 FIN 이라는 세그먼트를 보낸다.

 

step 4)

클라이언트는 TIME_WAIT 상태가 되고 다시 서버로 ACK를 보내서 서버는 CLOSED 상태가 된다.

이후 클라이언트는 어느 정도 시간을 대기한 후 연결이 닫히고 클라와 서버의 모든 자원의 연결이 해제된다.

 

클라가 어느 정도 시간을 대기하는 이유?

step3 에서 서버가 FIN 을 전송하기 전에 전송한 패킷이 FIN 패킷 보다 늦게 도착한다면 문제다.

따라서 클라이언트는 서버로부터 FIN 을 수신하더라도 일정시간 (디폴트 240초) 동안 세션을 남겨놓고 기다리는데 이 과정이 TIME_WAIT 이다. 

 

연결할때보다 해제할때 스탭이 하나 더 필요한 이유는 step2 에서 ack를 보낸후 아직 서버에서 보낼 데이터가 남이 있을수 있기 때문이다.

따라서 일단 최초에 클라이언트가 보낸 fin 에 대해 ack 만 보내고, 데이터를 모두 전송한 후에 서버도 fin 을 보낸다.

즉 연결할때는 아직 아무런 데이터도 오가지 않은 최초의 상태이기 때문에 syn, ack+syn, ack 로 끝나지만,

연결을 해제 할때는 아직 전송하지 못한 데이터가 있을수도 있기 때문에 기다렸다가 또다시 fin,ack 가 이루어져야 한다.