TCP 3-Way Handshake
TCP는 장치들 사이에 논리적인 접속을 성립(establish)하기 위하여 three-way handshake를 사용한다.
3 Way Handshake는 TCP/IP 프로토콜을 이용하여 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.
양쪽(Client와 Server) 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달을 시작하기 전에 한쪽에서 상대방이 받을 준비가 되었다는 것을 알 수 있도록 한다.
양쪽 모두 상대편에 대한 초기 순차 일련 번호를 얻을 수 있도록 한다.
TCP 접속을 성공적으로 성립하기 위하여 아래와 같은 과정이 반드시 필요하다.
[과정]
(1) Client > Server : SYN
(2) Server > Client : SYN ACK
(3) Client > Server : ACK
- SYN = Synchronize sequence numbers
- ACK = Acknowledgment
B Server는 Listen 상태이어야 한다. 서비스 포트가 오픈되어 있어야 한다.
(1) Client > Server : TCP SYN
A Client는 B Server에 접속을 요청하는 SYN 패킷을 보낸다. 이때 A Client는 SYN을 보내고 SYN/ACK 을 기다리는
SYN-SENT(SYN을 보냄) 상태가 된다.
(2) Server > Client : TCP SYN ACK
B Server는 SYN 요청을 받고 A Client 에게 요청을 수락한다는 ACK와 SYN flag가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다린다. 이때 B Server는 SYN-RECEIVED(SYN을 받음) 상태가 된다.
(3) Client > Server : TCP ACK
A Client는 B Server에게 ACK을 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 되는 것이다. 이때의 B Server 상태가 ESTABLISHED 이다.
위와 같은 방식으로 통신하는 것이 신뢰성 있는 연결을 맺어 주는 TCP의 3-Way Handshake 방식이다.
상태 | 설명 |
Listen | 포트가 열린 상태로 연결 요청 대기 중 |
SYN-SENT | SYN 요청을 보낸 상태 |
SYN-RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 중 |
ESTABLISHED | 연결이 확인되고 세션이 연결된 |
CLOSED | 서비스 PORT가 닫힌 상태 |
4-Way Handshake
3-Way Handshake가 TCP 연결을 위해 사용했다면, 4-Way Handshake는 세션을 종료하기 위하여 수행하는 절차이다.
[과정]
(1) Client > Server : FIN
(2) Server > Client : ACK
(3) Server > Client : FIN
(4) Client > Server : ACK
A Client 와 B Server는 세션이 연결되어 있다고 가정. 둘 다 ESTABLISHED 상태.
(1) Client > Server : FIN
A Client가 연결을 종료하겠다고 FIN 플래그를 전송한다. 이때 A Client는 FIN-WAIT 상태가 된다.
(2) Server > Client : ACK
B Server는 FIN 플래그를 받고, 일단 확인메시지 ACK를 보내고 자신의 통신이 끝날 때까지 기다리는 데 이 상태가 B Server의 CLOSE-WAIT 상태이다.
(3) Server > Client : FIN
B Server가 연결을 종료할 준비가 되면, 연결 해지를 위한 준비가 되었음을 알리기 위해 A Client 에게 FIN 플래그를 전송한다. 그리고 LAST-ACK 상태가 된다.
(4) Client > Server : ACK
A Client는 B Server로부터 FIN 플래그를 받으면 연결 해지 준비 확인했다는 ACK 플래그를 보낸다. 이후 TIME-WAIT 상태가 되며 일정 시간 경과 후 CLOSED 상태가 된다.
※ "TIME-WAIT"
B Server에서 FIN을 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 FIN 패킷보다 늦게 도착하는 상황 등이 발생할 수 있다. A Client 는 이러한 현상에 대비하여 B Server로부터 FIN을 수신하더라도 일정 시간(Default 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 데 이 과정을 "TIME-WAIT" 상태라고 한다. 일정 시간이 지나면, 세션을 만료하고 연결을 종료시키며 "CLOSE"상태가 된다.
3-Way Handshake & 4-Way Handshake 에 대해서
이러한 TCP 3-Way Handshake & 4-Way Handshake 과정은 연결지향적인 특성으로 주로 데이터의 신뢰도가 중요하다고 판단되어 질 때 사용된다. 신뢰도 확보가 중요하거나 용량이 큰 데이터를 전달해야할 때 실시간일 필요는 없을 때 사용된다.
그렇다고 TCP의 신뢰성있는 전송이 무조건 좋은 것은 아니다. 데이터의 신뢰성 보다 전송 속도가 중요시되는 서비스, 예를 들어 스트리밍 혹은 게임과 같은 서비스의 경우 속도가 생명이다. 만약 계속해서 버퍼링이 걸린다면 고객은 불쾌해 할 것이다.
UDP의 경우, 비연결 지향형 프로토콜로 이러한 Handshake 과정 없이 단순히 데이터만을 전송하므로 속도가 빠르다. 스트리밍 서비스의 경우 끊기지 않는 서비스가 중요하고 UDP 방식을 사용한다.
추가적으로, 3-Way Handshake 의 취약점을 이용해 서버를 공격하는 SYN Flooding 이라는 공격 방법도 있다.
※ SYN-Flooding
3way handshaking 과정중 서버는 2단계 에서 (클라이언트로 부터 요청을받고 응답을 하고난후 다시 클라이언트의 응답을 기다리는 상태) 이 연결을 메모리 공간인 백로그큐(Backlog Queue) 에 저장을 하고 클라이언트의 응답 즉 3단계를 기다리게 되고 일정 시간 (default 로 UNIX/LINUX : 60초 , Windows : 256초 , Apache : 300 초이며 수정 가능) 동안 응답이 안오면 연결을 초기화한다.
바로 이 점을 이용한 공격법이다.
악의적인 공격자가 실제로 존재하지 않는 클라이언트IP로 응답이 없는 연결을 초기화 하기전에 또 새로운 연결 즉 1단계 요청만 무수히 많이 보내어 백로그 큐를 포화 상태로 만들어 다른 사용자로 부터 더이상에 연결 요청을 못 받게 하는 공격 방법이다.
대응책으로는 연결 타이머 시간을 짧게 하거나 백로그 큐 사이즈를 늘리는법, 정해진 시간동안 들어오는 연결 요구의 수를 제한하는법, 쿠키(cookie)라는 것을 이용해서 전체 연결이 설정되기 전까지는 자원의 할당을 연기하는 법이 있다.
Reference
'Network' 카테고리의 다른 글
[Network] IPsec VPN 과 SSL VPN (0) | 2021.11.25 |
---|