TCP, 3way handshake & 4way handshake
<br/>
3way Hansdshake
<img alt="pasteImage.png" pathname="KQM7BN190307192506.PNG" src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/KQM7BN190307192506.PNG" style="border-style:solid; border-width:1px; width:500px" title="pasteImage.png" />
TCP는 통신 전, 연결상태를 확인하기 위해 3 Way HandShake 작업을 수행합니다.
쉽게 말하면, 통신을 시작하기전 "너 잘들리니?" - "나 잘들려! 너는?" - "나도 잘들려!" 라는 3가지 과정을 수행하는 것입니다.
다음과 같이 동작합니다.
-
처음에 클라이언트는 CLOSE상태 서버는 LISTEN상태입니다.
-
클라이언트는 서버에 SYN 패킷을 보냅니다. SYN-SENT 상태가 됩니다. ("너 잘들리니?")
-
서버는, SYN 요청을 받고 수락합니다. 그리고 SYN/ACK 패킷을 보냅니다. 이 때, 서버는 SYN_RESCEIVED 상태를 가집니다. ("나 잘들려? 너는?")
-
클라이언트는 SYN/ACK 패킷을 받음으로써, 클라이언트 입장에서 클라이언트-서버 연결은 확인합니다. 그리고 서버에게 ACK 패킷을 보내줍니다. 클라이언트는 연결이 확인된 상태인 ESTABLISHED 상태로 변경됩니다. ("나도 잘들려!")
-
서버는 ACK패킷을 받음으로써, 서버 입장에서 클라이언트 - 서버 연결을 확인합니다. 서버는 연결이 확인된 상태인 ESTABLISHED 상태로 변경됩니다.
-
이후, 통신을 진행합니다.
<br/>
<br/>
<br/>
4way Hansdshake
<img alt="pasteImage.png" pathname="AZ5W3D190307194913.PNG" src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/AZ5W3D190307194913.PNG" style="border-style:solid; border-width:1px; width:500px" title="pasteImage.png" />
반대로, 4way Hansdshake는 TCP가 연결을 종료하기 위한 과정입니다.
다음과 같이 동작합니다.
-
클라이언트는 통신 종료를 위해 FIN 패킷을 보내고, FIN_WAIT_1 상태로 대기합니다.
-
서버는 FIN 패킷을 받고, 수락한다는 ACK 패킷을 보냅니다. 동시에 서버는 Application에게 close()를 요청합니다. 그리고 서버는 CLOSE_WAIT 상태로 변경합니다.
-
클라이언트는 ACK 패킷을 받고 , FIN_WAIT_2 상태로 변경합니다.
-
동시에 close() 요청을 받은, Application은 종료 프로세스를 진행하고, 완료 후 서버는 FIN 패킷을 클라이언트에게 전송 후, LAST_ACK 상태로 변경합니다.
-
클라이언트는 FIN 패킷을 받고, 수락한다는 ACK 패킷을 보냅니다. 그리고 TIME_WAIT 상태로 변경합니다. TIME_WAIT 상태는 일정 시간이 지나면 CLOSED 상태로 변경됩니다.
-
서버는 최종 ACK 패킷을 받고, CLOSED 상태로 변경합니다.
<br/>
<br/>
<br/>
참고
<a href="https://hyeonstorage.tistory.com/287">https://hyeonstorage.tistory.com/287</a>