3-way handshake
TCP에서 통신을 하는 장치간 서로 연결이 잘 되어있는지 확인하는 과정
- TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 설정(Connection Establish) 하는 과정
- 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달이 시작하기 전에 한 쪽이 다른 쪽이 준비되었다는 것을 알 수 있도록 한다.
3-way handshake 과정
SYN(Synchronization) : 연결요청, 세션을 설정하는데 사용되며 초기에 시퀀스 번호를 보냄
ACK(Acknowledgement) : 보낸 시퀀스 번호에 TCP 계층에서의 길이 또는 양을 더한 것과 같은 값을 ACK에 포함하여 전송
1. Client -> Server (SYN)
- 클라이언트는 연결하고자하는 서버에 SYN을 보낸다. (seq : m)
- 클라이언트가 데이터를 전송할 떄 Sequence Number를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송
2. Server -> Client (SYN+ACK)
- 서버는 SYN(m)을 받고, 클라이언트로 받았다는 신호를 보내기위해 ACK와 SYN를 전송한다.
(seq : n, ACK : m+1)
- ACK는 받은 seq의 +1로 지정하고 SYN과 ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다.
3. Client -> Server (ACK)
- 클라이언트는 SYN(n)과 ACK(m+1)을 받고 서버에 (ACK : n+1)을 전송한다.
- 마지막으로 접속 요청을 받고 확인을 보내 연결을 맺음
4-Way Handshake
연결을 해제하는 과정
FIN 플래그를 이용
- FIN (finish) : 세션을 종료시키는데 사용되며, 더 이상 보낸 데이터가 없음을 나타낸다.
4-Way Handshake 과정
1. Client -> Server (FIN)
- 서버에게 연결을 종료한다는 FIN 플래그를 보낸다.(FIN_WAIT 상태)
2. Server -> Client(ACK)
- 서버는 FIN을 받고, 확인했다는 ACK를 클라이언트에게 보내고 자신의 통신이 끝날때까지 기다린다. (이상태가 TIME_WAIT 상태)
- 서버는 클라이언트에게 응답을 보내고 CLOSE_WAIT 상태에 들어갑니다. 그리고아직 남은 데이터가 있다면 마저 전송을 마친 후에 close( )를 호출
- 클라이언트에서는 서버에서 ACK를 받은 후에 서버가 남은 데이터 처리를 끝내고 FIN 패킷을 보낼 때까지 기다리게 됩니다. (FIN_WAIT_2)
3. Server -> Client(FIN)
남은 데이터를 모두 보냈다면 서버는 연결이 종료한다는 FIN 패킷을 클라이언트에 보내고 LAST_ACK로 들어간다.
4. Client -> Server(ACK)
- 클라이언트는 FIN을 받고, 확인했다는 ACK를 서버에게 보낸다.
- 서버는 ACK를 받고 closed 상태로 들어간다.
- TIME WAIT 시간이 지나고 클라이언트도 closed 상태로 들어간다.
참조
https://www.geeksforgeeks.org/why-tcp-connect-termination-need-4-way-handshake/
https://afteracademy.com/blog/what-is-a-tcp-3-way-handshake-process/
https://velog.io/@averycode/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP%EC%99%80-3-Way-Handshake4-Way-Handshake