본문 바로가기

용어 정리

TCP 4-way handshake 란?

https://www.lynda.com/Wireshark-tutorials/TCP-handshake-teardown/697728/783149-4.html

지난번에 TCP는 3-way handshake를 통해서 연결을 성립한다고 하였다. 그렇다면 연결을 종료할 때는 어떻게 될까?

이번에는 지난번에 비해 한 차례가 늘어난 4-way handshake를 수행하게 된다.

4번의 데이터 전송이 있는 4-Way Handshake

위 사진에서 보다시피 총 4번의 데이터 통신이 연결을 해제하기 위해 오고간다. 왜 그냥 끊어버리지 않고 귀찮게 여러번 패킷을 주고받는 걸까? 그 이유는 TCP의 신뢰성을 보장하기 위함에 있다.

 

신뢰성 있는 연결인 TCP 특성상 보낸 데이터를 잘 받았는지, 그에 대한 잘 받았다는 응답 역시 잘 받았는지 등을 양측에서 확인하게 된다. 이때 통신하던 중 예기치 않게 연결이 종료된다면 아무래도 TCP의 신뢰성에 큰 영향을 끼칠 수밖에 없다. 그러므로 연결 종료 시에도 양측이 서로 확인하에, 즉 당사자가 연결을 종료하고 싶어하며 종료할 준비가 됬는 지 확인한 후에 각자의 종료 과정을 거치게 되는 것이다.

 

또한 서버가 클라이언트에게 할당한 자원 등을 정상적으로 회수하거나 하는 등 단순히 연결을 끊는 것에는 추가적인 작업이 필요하므로 이런 체계적인 과정이 필요한 이유도 있다.

 

그에 따른 상태는 클라이언트(좌측), 서버(우측) 모두 3가지의 상태가 존재하는데 이는 연결을 종료하고자 하는 신호(FIN 플래그)를 보냈거나 그에 대한 응답을 확인(ACK)하는 경우 등에 따라 점차 바뀌게 된다. 위의 도표에서는 ESTABLISHED(TCP 3-Way Handshake로 연결된 상태)에서 시작한다.

1) 클라이언트의 입장에서

ESTABLISHED: 서버와 정상적으로 연결되어 통신을 수행하고 있다.

 

FIN_WAIT 1: 서버와 연결을 종료하기 위해 FIN 플래그를 세운 TCP 패킷을 보내고, 그에 대한 응답을 기다린다. 이때 클라이언트는 통신에 필요한 자료구조를 폐기하기 때문에 더이상 데이터를 전송할 수 없다. 정확히 말하면 응용프로그램이 서버로 데이터를 전송하고 싶어도 보낼 수 없다는 것이다.

 

FIN_WAIT 2: 서버에서 연결을 종료하고 싶다는 메시지를 잘 받았다는 응답(ACK)이 오면 이 상태로 전환된다. 그리고 서버가 연결을 종료하기를 기다린다.

 

TIME_WAIT: 서버에서 연결을 종료하고자 하는 메시지(역시 FIN 플래그)를 보내서 받는다면 ACK를 보내고 이 상태로 진입한다. 서버도 연결을 종료할 준비가 됐다는 것을 확인했고 그에 대한 응답 메시지를 보냈는데 왜 더 기다리는 것일까? 이는 클라이언트가 보낸 ACK가 네트워크 오류 등으로 도착하지 않았을 경우를 고려한 것이다. 서버측에서 ACK를 받지 못하면 서버는 클라이언트가 FIN을 받지 못했다고 간주, TCP의 신뢰성을 위해 FIN 패킷을 클라이언트에게 다시 보낸다. 그럴 경우 나중에 접속한 클라이언트가 연결하자마자 FIN 패킷을 받고 연결이 끊어지는 상황이 발생할 수 있기 때문에 클라이언트 쪽에서도 충분한 시간을 기다려서 서버가 ACK를 받았는지 아닌지 MSL시간만큼 기다리는 것이다.

 

Maximum segment lifetime - Wikipedia

Maximum segment lifetime is the time a TCP segment can exist in the internetwork system. It is arbitrarily defined to be 2 minutes long.[1] The Maximum Segment Lifetime value is used to determine the TIME_WAIT interval (2*MSL) The command that can be used

en.wikipedia.org

2) 서버의 입장에서

ESTABLISHED: 클라이언트와 정상적으로 연결되어 통신을 수행하고 있다.

 

CLOSE_WAIT: 클라이언트에게서 연결 종료 신호(FIN)을 받고 그에 대해 응답(ACK)한다. 이때 서버 측 애플리케이션에 클라이언트 측 애플리케이션이 연결을 종료하려 한다고 알린다.

 

LAST_ACK: 서버 측 애플리케이션도 종료된다면 클라이언트에게 '자신도 연결을 종료할 준비가 되었다'는 FIN을 보낸다.

 

CLOSED: 클라이언트가 LAST_ACK에 대한 ACK를 보낸다면 이를 받고 연결을 종료한다.

 

상대적으로 클라이언트보다 간략한 것을 볼 수 있다.

 

 

이 블로그에 따르면 방화벽 등으로 FIN, ACK 패킷이 막히거나 서버 측 애플리케이션의 문제로 클라이언트가 FIN_WAIT 상태에서 넘어가지 않는 경우도 있다고 한다. 이는 자동적으로 연결을 종료하게되는 TImeout이 있지만 이 경우 비정상 종료되는 과정이라 할 수 있다.

 

영문으로 설명된 사이트도 참고해 보도록 하자.

 

The TCP/IP Guide - TCP Connection Termination

Please Whitelist This Site? I know everyone hates ads. But please understand that I am providing premium content for free that takes hundreds of hours of time to research and write. I don't want to go to a pay-only model like some sites, but when more and

www.tcpipguide.com

 

'용어 정리' 카테고리의 다른 글

TCP 3-way handshake 란?  (0) 2019.01.10