본문 바로가기
일/Network

[TCP/IP 개념] 세션의 시작과 종료 3way , 4way Handshake

장치와 장치가 TCP통신을 하기 위해서는

세션의 시작 과정인 3-way-handshake와 세션의 종료 과정인 4-way-handshake가 필요하다

 

3-way-handshake는 TCP/IP프로토콜로 통신을 하는 과정에서 데이터 전송 전 정확, 안전한 전송을 위해 상대방 장치와 Session을 연결하는 과정이다.

반대로 4-way-handshake는 정상적인 종료를 위함

 

 

 

3-way-handshake 과정

Client ==> Server : TCP(SYN)

Client <== Server : TCP(SYN/ACK)

Client ==> Server : TCP(ACK)

 

 

[STEP 1]

Client는 Server에 접속 요청을 함 (SYN 패킷 전송)

Client는 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 됨

 

[STEP 2]

Server가 SYN요청을 받고 해당 요청이 정상적인 서비스 요청이라면 응답 (SYN/ACK 패킷 전송)

Server는 Client의 ACK패킷 응답 대기 상태인 SYN_RECIVED가 된다

 

[STEP 3]

Client는 Server로 부터 응답이 왔으면 세션을 맺는 과정의 마무리 응답 (ACK 패킷 전송)

이렇게 되면 3-way-handshake가 마무리 되면서 통신이 가능한 Established 상태가 된다

 

 

아래는 실제 서비스 중인 장비에서 확인한

172.26.0.1 <-> 172.26.0.5 3-way-handshake 과정

(IP정보 및 Port정보 등 보안적인 요소는 사설 IP기에 영향이 없으므로 모자이크 하지않고 게시하였습니다)

tcpdump를 통해 패킷을 확인했을 때 TCP/ACK 패킷은 . 으로 확인이 된다  (SYN/ACK -> S.)

위 과정으로 3-way-handshake가 종료되면 아래와 같이 신뢰적인 통신이 가능한 상태가 된다.

 

 

 

 

 

4-way-handshake


장치와 장치가 TCP통신을 하기 위해서 세션의 시작 과정인 3-way-handshake가 필요했다면,

세션의 종료는 4-way-handshake 과정이 필요하다.

 

4-way-handshake는 3way에 비해 좀 더 간단하다.

 

4-way-handshake 과정

Client ==> Server : TCP(FIN)

Client <== Server : TCP(ACK)

Client <== Server : TCP(FIN)

Client ==> Server : TCP(ACK)

 

 

[STEP 1]

Client가 Server로 세션을 종료하겠다는 FIN패킷 전송

클라이언트는 FIN-WAIT 상태

 

[STEP 2]

Server는 FIN패킷을 받은 후 ACK 패킷을 보내고 현재 모든 통신이 끝날때까지 대기 상태

Server은 CLOSE-WAIT 상태

 

[STEP 3]

Server는 모든 통신이 정상적으로 끝나서 세션 종료를위한 준비가 끝났음을 알리는 FIN패킷을 Client로 전송

Server는 LAST-ACK 상태

 

[STEP 4]

Client도 세션 종료 준비가 끝났음을 알리는 ACK패킷을 Server로 전송

Client는 TIME-WAIT 상태

 

STEP 4의 TIME-WAIT 상태는 중요한데, Server은 Client의 모든 응답에 대한 패킷을 전송 후, FIN 패킷을 보냈는데 만약 회선의 상태 , 경로 설정의 오류 등등으로 인해 FIN패킷 전에 보낸 데이터 패킷이 도착 하지 않았다면

데이터를 손실할 수도 있는데, 이 때 TIME-WAIT 상태라고 60~240초(장비마다 설정값이 다름)를 기다리게 된다.

TIME-WAIT 상태의 대기 시간이 모두 지나면 세션을 종료 및 CLOSE 상태로 변경