TCP 3-way, 4-way handshack
TCP란?
통신계층에서 수신자와 송신자를 연결하는 통신 서비스를 제공하고 IP를 통해 전달되는 패킷을 검사해 오류가 있는지 검사하고 재전송 요청하는 역할을 하는 프로토콜이다.
TCP는 신뢰성있고 연결지향적인 서비스를 제공하고 있다. 반대되는 개념으로는 UDP가 있다.
TCP는 패킷을 보내고 해당 패킷을 잘 받았는 지에 대한 확인 패킷도 받는 과정을 거치면서 데이터가 손실되는 것을 막지만 그만큼 속도가 느리다.
그에 비해 UDP는 패킷을 보낸 후 확인 작업을 거치지 않기에 속도가 빠른 대신, 데이터가 손실되는 것을 확인하지 않는다.
3-way, 4-way handshack란?
TCP가 신뢰성있고 연결지향적인 서비스이므로 Client와 Server와 논리적으로 연결되어 있어야하는데 이때 3-way handshack를 이용해서 논리적 연결을 성립한다.
연결이 되면 연결을 끊을수도 있어야하는데 이때 사용되는 것이 4-way handshack이다.
flag의 종류
TCP 헤더에는 6bit로 해당 패킷이 어떤 패킷이 알려주는 제어 비트가 있다. 각 자리마다 의미하는 바는 "URG-ACK-PSH-RST-SYN-FIN” 이다.
즉 010000이면 해당 패킷은 ACK 역할을 하는 패킷임을 알 수 있다.
- ACK는 Acknowledgement로 패킷을 받았다는 의미의 flag이다.
- SYN는 Synchronize Sequence Number로 Connection을 생성할때 사용되는 flag이다. 랜덤으로 숫자가 생성되어 전송된다.
- FIN은 Finish로 더 이상 데이터를 보낼 것이 없으니 연결을 해지하겠다는 의미의 flag이다.
TCP state의 종류
netstate 명령어를 통해 알 수 있다.
- CLOSED : 연결이 해제된 상태
- LISTEN : 접속 요청을 기다리는 상태
- SYN-SENT : Client가 SYN 패킷을 전송하고 아직 Server로부터 ACK 패킷을 전송받기 전 상태
- SYN-RECEIVED : Client에게 SYN 패킷을 전송받아 응답으로 ACK + SYN 패킷을 전송한 상태
- ESTABLISHED : Client와 Server가 연결된 상태
- FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, LAST-ACK: 연결을 종료하기위해 FIN flag를 보내고 응답을 받는 과정의 상태
- TIME-WAIT: 종료되었지만 분실된 패킷을 기다리기위해 소켓은 열어둔 상태
- CLOSING : 흔하지 않지만, 확인 메세지가 분실된 상태
- CLOSED : 연결이 종료된 상태
3-way handshack의 과정
- Client → SYN → Server
- Client가 SYN 패킷을 LISTEN 상태인 Server에게 보낸다.
- Client는 SYN 패킷을 보낸 후 SYN-SENT 상태로 변경된다.
- Server → ACK + SYN → Client
- Server가 SYN 패킷을 받은 후 응답으로 Client에게 ACK + SYN 패킷을 전송한다.
- Server는 ACK + SYN 패킷을 보낸 후 SYN-RECEIVED 상태로 변경된다.
- Client → ACK → Client
- Client가 ACK + SYN 패킷을 확인 후 Server에게 ACK 확인 패킷을 보낸다.
- Client는 패킷을 보낸 후 Client와 Server가 ESTABLISHED 상태로 변경되면서 연결된 상태가 되다.
4-way handshack의 과정
- Client → FIN → Server
- Client가 더 이상 보낼 데이터가 없을 경우 FIN 패킷을 Server에게 보낸다.
- Client가 패킷을 보낸후 Client는 FIN-WAIT-1 상태로 변경된다.
- Server → ACK → Client
- Server가 FIN 패킷을 받으면 확인했다는 의미로 ACK 패킷을 보낸다.
- Server은 연결을 종료할 준비하며, CLOSE-WAIT 상태로 변경된다.
- Client는 ACK 패킷을 받으면 FIN-WAIT-2 상태로 변경된다.
- Server → FIN → Client
- Server가 연결을 종료할 준비가 되면 Client에게 FIN 패킷을 보낸다.
- Server는 LAST-ACK 상태로 변경된다.
- Client → ACK → Server
- Client가 FIN 패킷을 받으면 Server에게 확인의 의미로 ACK 패킷을 Server에게 전송한다.
- 이후 Client는 늦게 오는 패킷을 기다리기위해 TIME-WAIT 상태로 변경된다.
- 일정 시간(디폴트 240초)이 지난후 Client는 CLOSE 상태로 변경된다.