필자는 이전에 TCP 에 대해서 잠시나마 언급한 적이 있다. TCP는 연결지향적이고 패킷의 정확한 전달을 위해 사용되는 프로토콜인 만큼, 통신의 연결과 종료에 있어서도 지켜져야 할 시퀀스가 있다. 그렇지 않으면 막무가내로 통신을 연결하고, 막무가내로 통신을 종료하여 패킷들이 언제부터 들이닥칠지, 언제부터 패킷이 끊겨버릴지 모르기 때문이다. 이번 포스팅에선 TCP 통신에 있어 연결을 성립하고 해제하는 과정을 통칭하는 3-way Handshake 와 4-way Handshake 에 대해 알아보고자 한다.
해당 포스팅에 사용된 이미지는 필자가 직접 제작한 것이므로 자유롭게 퍼가셔도 됩니다
TCP 의 연결 성립 과정을 칭하는 용어이다.
만나서 반갑습니다 ㅎㅎ 하고 악수 3번 조지는 것이다. 마냥 반가워서 악수하는 건 아니고, 악수 한 번 한 번에 의미가 담겨있다. 이에 대해 살펴보자.
클라이언트가 서버에게 SYN 패킷 전송 (SEQ = X)
서버가 SYN(X) 를 수신하고, 클라이언트에게 SYN 을 잘 받았다는 의미로 ACK 과 SYN 패킷 전송
(SEQ : Y, ACK : X + 1)
클라이언트는 서버로부터 온 ACK(X + 1) 과 SYN(Y) 패킷을 수신하고, ACK(Y + 1) 을 서버로 전송
위처럼 3번의 통신을 끝마치면, 종단 간의 연결이 성립되는 것이다. 이 때부터 실제 패킷을 주고받게 된다.
TCP 의 연결 해제 과정을 칭하는 용어이다.
아쉽네요 다음에 또 봐요 ㅠㅠ 하고 아쉬운만큼 악수 4번 조지는 것이다. 마찬가지로 악수 각각에 의미가 있다.
클라이언트는 서버에게 '저 이제 끊을게요' 하는 의미로 FIN 플래그를 전송
서버는 FIN 을 수신하고, '알겠어용' 하는 의미로 클라이언트에게 ACK 으로 답장
→ 남은 데이터를 마저 보내기 위해 CLOST_WAIT 상태로 전환
이후 데이터를 모두 보냈다면, 연결이 종료됐다는 FIN 플래그를 클라이언트에게 전송
클라이언트는 해당 FIN 을 수신하고 확인했다는 의미로 ACK 을 서버로 전송
→ 혹시나 아직 안 온 데이터가 있을 수 있기 때문에 이를 대기하기 위해 TIME_WAIT 상태로 전환
서버가 클라이언트로부터 ACK 을 수신했다면, 소켓을 닫게 된다. 그리고 TIME_WAIT 시간이 끝나면 클라이언트도 소켓을 닫게 된다. 이로써 통신이 완벽히 해제되는 것이다.
통신이 총 4번 이루어지기 때문에 4-way Handshake 라는 용어를 사용한다.
이렇듯 통신의 연결과 해제에 있어 데이터의 신뢰성을 확보해줄 수 있지만, 당연하게도 이 작업들도 오버헤드가 있기 때문에 TCP 통신은 실시간성 서비스에 부적합하다. 따라서 위와 같은 Handshake 과정이 필요없는 UDP 프로토콜의 경우 실시간성 서비스에 적합하게 되는 것이다.
다음 포스팅에선 TCP 통신 의 흐름 제어 기법에 대해 알아보고자 한다.
Every meeting and parting comes with a handshake. It’s like in Friday Night Funkin—every rhythm of connection has its ups and downs. Just as players navigate each challenging battle, we navigate life's encounters, learning to embrace both the joyous greetings and the bittersweet farewells. https://fridaynightfunkingame.io
ㅋㅋㅋㅋ이미지 정말 귀엽네요ㅠㅠ 좋은 글 감사합니다!