목차
- TCP란?
- TCP 연결 과정 : 3-way handshake
- TCP 연결 종료 과정 : 4-way handshake
- TCP 헤더, Control Flag 정리
- TCP 패킷을 이용한 네트워크 취약점
1. TCP란?
TCP는 클라이언트와 서버 사이의 연결을 지향하고, 오류 및 흐름 제어 등 신뢰성을 제공하는 전송 계층 프로토콜이다.
데이터를 주고받기 전, 클라이언트와 서버를 연결하기 위해 3단계에 거쳐 패킷을 교환하고 확인하는 작업이 이뤄지는데, 이 과정을 3-way handshake라고 한다. 반대로 클라이언트와 서버 사이의 연결을 종료하기 위해 4단계에 거쳐 패킷 교환 및 확인 작업이 이뤄지며, 이 과정을 4-way handshake라고 한다.
2. TCP 연결 과정 : 3-way handshake
1) 클라이언트 측에서 TCP 연결 요청을 위해 SYN 플래그와 함께, 임의의 Sequence Number를 담아 패킷을 전송한다. 이때 클라이언트는 SYN 패킷을 보낸 SYN_SENT 상태, 서버는 SYN 패킷을 받은 SYN_RECEIVED 상태이다.
2) 서버 측에서 연결 요청 수락을 위해 SYN + ACK 플래그와 임의의 Sequence Number와 함께, ACK Number는 클라이언트에서 보낸 Sequence Number에 + 1을 하여 패킷을 전송한다. 이때 클라이언트는 TCP 연결 수락을 받은 ESTABLISHED 상태이다.
3) 클라이언트 측에서 연결 확립 완료를 위해 ACK 플래그와 함께, 서버 측에서 보낸 ACK Number를 Sequence Number에 담고, 서버 측에서 보낸 Sequence Number에 +1을 한 값을 ACK Number에 담아 전송한다. 이때 서버는 연결 확립 완료 패킷을 받아 ESTABLISHED 상태가 된다.
정리하면 클라이언트가 서버에 데이터를 요청하기 전, TCP 연결을 위해 SYN 패킷을 서버에 보낸다. TCP 연결 요청을 받은 서버는 요청을 수락하는 SYN+ACK 패킷을 다시 클라이언트로 보낸 후, TCP 연결 확립을 받은 클라이언트는 ACK 패킷을 서버로 보내는 과정을 거쳐 TCP 연결이 이뤄지는 것이다.
또한, Sequence Number는 상대 측이 보낸 데이터의 순서를 확인하는 용도이며, ACK Number는 다음에 요청할 데이터의 순서를 의미한다.
3. TCP 연결 종료 과정 : 4-way handshake
1) 클라이언트가 연결을 종료하기 위해 FIN 플래그를 담아 패킷을 전송한다. 이때 클라이언트는 FIN_WAIT1 상태가 된다.
2) 서버는 연결 종료의 응답으로 ACK 플래그를 담아 패킷을 전송한다. 이때 서버는 CLOSE_WAIT 상태가 되고, ACK 패킷을 받은 클라이언트는 FIN_WAIT2 상태가 된다.
3) 연결 종료 준비를 완료한 서버는 클라이언트에게 FIN 플래그를 담은 패킷을 전송한다. 이때 서버는 LAST_WAIT 상태가 되고, 클라이언트는 TIEM_WAIT 상태가 된다.
3) 서버로부터 FIN 패킷을 받은 클라이언트는 ACK 플래그를 담은 패킷을 응답하면서, 2MSL (1 ~ 4분) 정도의 시간 이후, 연결을 종료한다.
4. TCP 헤더 Control Flag
Flag | 설명 |
SYN (Synchronized Sequence Number) |
- 연결 요청 플래그 - TCP 연결 시 가장 먼저 보내는 패킷 - 임의의 Sequence Number를 설정하여 SYN 플래그와 함께 보낸다. |
ACK (Acknowkledgement) |
- 응답 플래그 - 받은 패킷의 Sequence Number에 TCP 계층에서의 데이터 길이를 더해 보낸다. (보통 +1을 함) - ACK 응답을 통해 패킷에 대한 전송 성공 및 실패를 확인한다. |
FIN (Terminate The connection) |
- 연결 종료 플래그 - TCP 연결 종료 시 보내는 패킷 - 더이상 요청하거나 전송할 데이터가 없음을 의미한다. |
RST (Reset The Connection) |
- 연결 재설정 플래그 - 비정상적으로 TCP 연결을 강제로 끊는 방법이다. - 상대 측과 즉시 연결을 끊고자 할 때 사용한다. |
PSH (Request For Push) |
- 송수신 버퍼가 채워지기를 기다리지 않는다. - 데이터를 바로 OSI 7계층의 애플리케이션 계층에 전달한다. |
URG (Urgent Pointer) |
- 긴급 데이터 플래그 - Urgent Pointer가 유효한지를 나타낸다. - 전송하는 데이터 중 긴급히 전달해야할 데이터가 있을 때 사용한다. - (ex) ping 명령어 실행 도중 ctrl + c 입력 |
5. TCP 패킷을 이용한 네트워크 취약점
TCP SYN Flooding 공격은 3-way handshake 과정 중 SYN 플래그를 담은 패킷을 지속적으로 전송해 서버의 자원을 고갈시키는 공격이다. 서버는 SYN 패킷의 연결 요청에 따라 SYN + ACK 패킷을 응답하는데, 이때 클라이언트의 연결을 받아들이기 위해 메모리(RAM)에 일정 공간을 확보해둔다. 만약 클라이언트가 연결 확립 확인을 위해 ACK 패킷을 보내지 않고 계속 새로운 연결을 요청한다면, 서버는 할당된 메모리를 해지하지 못하게 되고 서버 자원이 고갈된다.
(해결 방법)
- SYN 임계치 설정
: IPS에서 룰을 설정해 IP당 들어오는 SYN 패킷을 제어한다. - Backlog Queue 크기 늘리기
: Backlog Queue는 클라이언트의 연결을 받아들이기 위해 확보해둔 메모리 공간이며, Backlog Queue 사이즈를 증가시켜 SYN 요청으로 인해 자원이 고갈되는 것을 늦출 수 있다. 하지만 완벽한 방법은 아니다. - SYN Cookie 설정
: Backlog Queue는 클라이언트의 연결을 받아들이기 위해 확보해둔 메모리 공간이며, 클라이언트로부터 ACK 패킷을 받을 때까지 Backlog Queue에 연결 요청 정보를 저장하지 않는 방법이다.
댓글