[TCP] 4-way Handshake

이진영·2023년 7월 19일
0
post-thumbnail

개요

요즘 열심히 CS에 대해서 공부하는 와중에 조금 궁금한 사항이 생겼기에 해당 글을 작성하게 됐다.

TCP에서 3-way Handshake에서는 3가지의 절차를 진행한다는 것은 명확하게 인지하였지만, 왜 연결 종료 시에는 4-way Handshake에 방법을 고수 하는 것이냐는 의문이다.

4-way Handshake에 대해서

먼저 TCP에서의 연결 종료를 명확하게 짚고 넘어가야 한다. 연결 종료를 할 때도 특정한 과정을 거쳐서 연결이 종료해야 한다는 것은 조금만 검색해도 알고 있을 것이다.

하지만 중요한 점은 왜 특정 과정을 거쳐야 한다는 점이다. 그냥 연결을 끊어버리면 한쪽에서 일방적으로 끊어버린 경우이기에 다른 한쪽은 연결이 끊어졌는지 알 방법이 없다.

그렇기에 연결을 종료하기 전에 다 처리하지 못한 데이터가 있을 수도 있기 때문에 양쪽이 다 정상적으로 연결을 종료할 준비가 되었는지를 확인하는 과정이 필요한 것이다.

그렇기에 반드시 4번의 통신 과정을 거쳐야 한다.

공식적인 석상에서는 위와 같은 전송 흐름을 지키는 구조이다.

해당 구조를 지키는 이유는 순차적으로 주고받는 방식이 아니라 상대방이 응답을 줄 때까지 대기하는 과정이 포함되어 있기 때문에 중게 하나라도 엇나가면 교착상태가 되게 된다.



첫 번째 FIN 플래그를 통한 연결 종료의 시작점

여기서 중요한 점은 FIN_WAIT_1이라는 상태에 걸린다. 앞으로 이러한 WAIT 상태를 기반으로 왜 4-way 절차를 거치는지 알게 되기 때문

FIN_WAIT_1은 종료를 대기 한다는 뜻이다. 왜냐?? 수신자는 아직 종료 상태가 준비가 안 됐을뿐더러 인제 종료하겠다고 FIN 패킷을 보냈기 때문이다.



두 번째 ACK를 보냄


수신자는 FIN 플래그를 받고 Server는 확인 메시지인 ACK를 요청자가 보낸 시퀀스 번호 + 1을 송신자에게 보내게 된다. (Ex) 1 -> 2)

그렇다면 송신자는 아 수신자가 이제 종료를 준비한다. 좀만 기달려 보자. 라는 뜻을 의미하게 된다.

그렇다면 수신자는 CLOSE-WAIT 상태로 변한다. 이때 변하는 시점 또한 마찬가지로 수신자에게서 보낼 데이터가 남아 있다면 계속해서 데이터를 전송한 후 그 이후에는 CLOSE-WAIT 상태로 변환한다.

실제로 모든 전송이 끝났다면 명시적으로 close() 나 shutdown()를 수행

즉, 요청자는 언제 서버에서 데이터 처리가 끝날지 모르기 때문에 수신자의 작업을 마치고 다시 연결 종료 승인을 의미하는 FIN 패킷을 보낼 때까지 대기한다는 말!



Close준비가 다 된 후 요청자에게 FIN 플래그를 전송


수신자가 이제는 데이터를 다 처리했다면 더 이상 없다면 연결을 종료하는 함수(close() , shut down())를 수행한다. 그다음 FIN 패킷을 종료의 의미로 보낸다.

그다음 수신자는 LAST_ACK 상태로 들어가 요청자가 다시 승인 번호를 보내줄 때까지 대기한다.



요청자는는 ACK를 보내서 종료를 했다고 수신자에게 알린다.


여기서도 마찬가지로 FIN 패킷에 대한 시퀀스 번호에 1을 추가해서 승인 번호를 생성하고 그다음 승인 번호를 담아 ACK 패킷으로 응답한다.

이후 요청자는 TIME-WAIT 상태에 들어가게 된다. 이는 연결을 종료 과정을 들어간다는 뜻으로 ACK 패킷을 받은 수신자는 종료 상태에 들어가게 된다.

사실 여기 TIME-WAIT 상태는 의도치 않은 에러로 인해 연결이 교착상태로 빠지는 것을 방지하기 위해 변경이 되는 것을 방지하기 위함이다. 생각을 해보자 만약 에러로 인해 종료가 지연되다가 적정 시간을 초과하게 된다면 CLOSED 상태로 변경이 된다.

그렇다면 적정 시간은 어떤 기준일지는 궁금하신 분들도 있을 수 있다. 이것은 컴퓨터마다 다르고 정확하게는 MSL(Maximum Segement Lifetime)의 시간 값은 커널의 파라미터에 정의 되어 있다.

실제로 네트워크 전문가들은 시간에 대한 소비를 줄이기 위해 이러한 커널 파라미터를 조정하는 경우도 있다고 한다.

마지막으로 요청자도 MSL 시간만큼 지나면 CLOSED 상태로 변경이 된다.


마치면서

이렇게 강의를 통해서 궁금했던 점들이 있어서 정리를 하기 시작했지만 정말 이렇게 양이 좀 많아질 줄은 몰랐다.

강의에서는 FIN과 ACK를 보내는 과정을 정말 쉽고 간단하게 알려줬지만 이렇게 섬세한 설정들이 있다는 점은 처음 알았다. 이러한 새로운 경험이 나에겐 좀 재밌기도 하다..ㅎㅎㅎ

그리고 결론적인 내가 왜 해당 글을 작성했는지에 대한 궁금증은 풀렸다. 애초에 보낼 데이터가 남아 있기 때문이고 이러한 데이터가 모두 전송이 됐을 때 FIN을 보내기 때문에 단계가 추가 됐다고 봐도 무방하다.

그리고 마지막으로 해당 포스팅 작성에 도움을 주신 분들에게 감사를 표한다.
https://evan-moon.github.io/2019/11/17/tcp-handshake/#fin_wait_1
https://jeongkyun-it.tistory.com/180

profile
내가 공부한 것들을 적는 공간

2개의 댓글

comment-user-thumbnail
2023년 7월 19일

소중한 정보 감사드립니다!

1개의 답글