필자는 이전에 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 통신 의 흐름 제어 기법에 대해 알아보고자 한다.
ㅋㅋㅋㅋ이미지 정말 귀엽네요ㅠㅠ 좋은 글 감사합니다!