TCP 4-way Handshake

Dal.001·2022년 11월 16일
3

서버

목록 보기
3/5
post-thumbnail

지난번에 TCP/IP에 대한 짧은 글을 썼었다.
https://velog.io/@yhm8622/TCPIP

그 중에 TCP의 4-way handshake가 궁금해져서 추가로 글을 써볼까한다.
(3way handshake는 위 글 참고)

위 글에서 언급했던 것 처럼, TCP에서 연결을 종료할때 4-way handshake를 진행한다.
왜 그럼 왜 굳이 4번 핸드쉐이크 하는 걸까?

Flag

Flag
SYN(연결 요청 flag)
ACK(응답 flag)
FIN(연결종료 flag)
RST(연결 재설정 flag)
PSH(밀어넣기)
URG(긴급 데이터 flag)

다양한 flag 존재한다.
연결을 시작 종료할 때는 ACK와 FIN flag가 주로 사용된다.



4way handshake

4-way handshake를 도식화 하면 위와 같은 형식이 된다.
일종의 2-way handshake를 두 번하는 느낌이다.

서버의 ACK와 FIN을 동시에 보내면 3way handshake로도 처리할 수 있을 것 같은 구조다.
그럼 왜 굳이 4-way handshake 하는지 설명해보겠다.


STEP1

클라이언트가 먼저 통신을 중단하는 상황을 예로 들어보겠다.

클라이언트가 FIN flag를 보낸다. 서버에서 답변이 올 때까지 기다리고 있으며 이 상황을 FIN_WAIT_1이라고 한다.


STEP2

서버가 ACK flag로 답변한다.
이 상태에서 클라이언트는 서버에서 FIN flag를 보내기를 기다리고 있다.
FIN_WATI_2 상태라고 한다.

이 상태에서 클라이언트는 연결을 종료했기 때문에, 더 이상 새로운 데이터를 받을 수 보낼 수 없다.
하지만 데이터를 받는 것은 가능하다.

여기서 서버가 못 보낸 데이터가 있다면 마저 클라이언트에게 보내고, 완료 되면 다음 단계로 넘어간다.


STEP3

서버가 통신을 중단한 준비가 되었다면, FIN flag를 클라이언트에게 보낸다.


STEP4

클라이언트는 서버가 보낸 FIN flag에 대해 ACK flag를 보내고 통신이 중단 된다.



결론

연결을 시작 할 때와 끝낼 때가 다른 점은, 이미 통신 중인 상태라는 것이다.

연결을 시작할 때는 서로 통신 중이 아닌 상태에서 handshake를 시도하지만,
끝낼 때는 이미 상호 통신 중이기 때문에 한쪽에서 일방적으로 끊어낼 수 없다.

반대편도 끝낼 준비를 마치고, 통신이 종료되어야하기 때문에 4-way handshake하는 것이다.





참고 자료

https://www.geeksforgeeks.org/why-tcp-connect-termination-need-4-way-handshake/
https://sh-safer.tistory.com/146

profile
App/Server Software Engineer

0개의 댓글