https://jwdeveloper.tistory.com/232
https://jwdeveloper.tistory.com/218?category=860421
TCP 프로토콜을 이용해 연결할 경우 3 way handshaking 과정을 수행하며 연결 종료 시에는 4 way handshaking 과정을 수행한다.
3 Way HandShaking
이전 포스팅에서 언급하였듯이 TCP는 신뢰성을 주된 목적으로 하기 때문에 연결 지향적인 특성을 갖으며
이때 사용하는 방법이 3 Way HandShaking이다.
3 Way Handshaking 과정
- 클라이언트는 서버에 접속을 요청하는 SYN 패킷을 전송한다. 전송 후 클라이언트는 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.
- 이때 수신받은 서버는 Listen 상태로 포트 서비스가 가능한 상태여야 한다. 서버는 SYN 요청을 받고 클라이언트에게 요청을 수락한다는 ACK와 SYN 플래그가 설정된 패킷을 발송한다.
- 이때 서버는 SYN_RECEIVED 상태가 된다.
- 클라이언트는 서버에게 ACK 패킷을 전송하고 이후부터 연결이 성립되고 데이터 송수신이 가능하게 된다.
- 이때 서버의 상태는 ESTABLISHED이다.
상태 | |
Closed | 닫힌 상태 |
Listen | 포트가 열린 상태로 연결 요청 대기 중 |
SYN-SENT | SYN 요청을 한 상태 |
SYN-RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 상태 |
ESTABLISHED | 연결이 확인된 상태 |
SYN Flooding
3 wayHandShaking의 과정 중 서버가 클라이언트의 SYN 패킷을 응답하고 다음 클라이언트의 응답을 기다리는 순간 해당 연결을 백로그 큐에 저장을 한다.
이 당시 클라이언트로부터 응답이 오지 않으면 연결을 초기화한다.
이러한 점을 이용해서 1단계 요청을 클라이언트 측에서 무수히 많이 보내어 백로그 큐를 포화 생태로 만들어버리고 다른 사용자로부터 더 이상 연결 요청을 못 받게 하는 공격 방법
4 Way HandShaking
3 Way HandShaking을 통해 ESTABLISHED 하는 것과 달리 연결을 종료할 때의 HandShaking 과정이 있다.
이를 4 Way HandShaking이라 한다.
4 Way Handshaking 과정
- 통신을 끝마치고 싶은 클라이언트가 서버에게 FIN 패킷을 보내고 자신은 FIN_WAIT_1 상태로 대기한다.
- FIN 패킷을 수신한 서버는 해당 포트를 CLOSE_WAIT 상태로 바꾸고 제대로 수신하였다는 ACK를 클라이언트에게 전달한다.
- 이때 클라이언트가 ACK를 수신하면 자신의 상태를 FIN_WAIT_2 상태로 변환한다.
- 그와 동시에 서버에서는 해당 포트에 연결되어있는 애플리케이션에게 Close()를 요청한다.
- 서버로부터 Close() 요청을 받은 애플리케이션은 종료 프로세스를 진행시키며 최종적으로 Close()가 되고 Server는 FIN패킷을 클라이언트에게 전송하고 자신은 LAST_ACK 상태로 변경한다.
- 클라이언트는 서버가 전송한 FIN 패킷을 수신하면 제대로 수신하였다는 ACK를 보내며 자신은 TIME_WAIT 상태로 변경한다. 최종 ACK를 받은 서버는 자신의 포트도 CLOSED로 닫게 된다.
- TIME_WAIT 상태인 클라이언트도 일정 시간이 지나면 CLOSED 상태로 바뀌게 된다.
References
'CS > Network' 카테고리의 다른 글
(Network) IP와 Subnet 에 대해서 (0) | 2022.01.30 |
---|---|
(Network) Domain Name System에 대해서 (1) | 2020.06.07 |
(Network) TCP vs UDP (0) | 2020.05.10 |
(Network) SSL 인증서 (0) | 2020.04.28 |
(Network) HTTPS와 SSL 인증서(2) - 공개키 (0) | 2020.04.28 |