1.TCP 3way-handshaking

4계층의 대표적인 TCP는 신뢰성을 기반으로 설계된 프로토콜로서 서비스의 논리적연결(Session)을 담당하며 신뢰성 확보를 위해 3way-handshaking 방식으로 통신한다.

3way-handshaking 방식은 전송데이터의 유실을 방지하고, 정확한 정보전송을 보장하기위한 네트워크 구성방식이나 connection 구성에 따른 불필요한 데이터가 송수신 됨으로써 과도한 overhead가 발생한다.

※ Sync Flooding : TCP의 특성을 이용한 해킹기법

- 공격자가 다수의 패킷을 서버로 보내고 ACK는 보내지 않아서 연결은 종료되지 않고 서버의 리소스가 소비되어 정상적인 사용자가 연결을 시도할 때, 서버 접속이 불가능하게 된다.

Sync Flooding 공격 발생시 서버는 자신이 연결하고 있지 않은 출발지에서 유입되는 다양한 패킷을 처리하고 확인하는 과정에서 과부하를 야기함 

Sync Flooding 방어 방법 

- Syn Flooding 공격방어 및 완화를 위해서는 TCP프로토콕이 연결 지향성(Connection-Oriented)이라는 점을 이용하고

  Handshake과정에 위배된 TCP 패킷이 유입될 경우 비정상적인 트래픽으로 구분하여 차단하는 방법이 가장 효과적임

1)임계치 기반의 Syn Flooding 차단
방화벽의 IP당 Syn요청에 대한 PPS 임계치를 단계적으로 조정하여 Syn Flooding을 차단함

PPS 설정 예시

2)First Syn Drop(Spoofed) 설정에 의한 차단
Syn패킷을 보내는 클라이언트가 진짜 존재하는지를 파악하여 차단하는 방법으로 클라이언트로부터
전송된 첫번째 Syn을 Drop하여 재요청 패킷이 도착하는지를 확인하여 Spoofing 여부를 판단하고 차단함

 

3)Syn이외의 Flooding 공격 방어
Syn이외의 Flooding 공격을 방어하기 위해서는 다음과 같은 다양한 형태의 DDoS 방어 기법을 사용
먼저 정상적인 TCP세션 연결이후 정상적인 트랜잭션이 수해되는지에 대해 검증하여 만약 정상적인 트랜잭션이
일루어질 경우 서버로 전달해야 하고, 정상적인 트랜잭션 없이 TCP세션 연결만 수행할 경우에는 서버로 전달하지
않아야 서버에 부하 증가 현상을 막을 수 있음
또한 네트워크의 정상적인 환경에서 설정된 각 트래픽 유형별 임계치를 통하여 과도한 TCP세션 연결에 대해 차단

**TCP/IP Overhead 참고 링크 : http://tech.kakao.com/2016/04/21/closewait-timewait/

 

[TCP Diagram]

TCP Diagram

TCP 기반의 네트워크는 connection의 요청이나 종료를 대기하거나 서로간에 negociate 하기 위한 상태를 가지고 있다


2. TCP Diagram 상태 설명

상태 의미
LISTEN 서버 어플리케이션은 서비스를 위한 포트개설, 서버 TCP는 연결 요청을 기다리는 상태
*서버가 클라이언트의 접속요청 대기
SYN_SENT 연결 요청을 하고(SYN 세그먼트 전송), 서버 응답을 기다리는 클라이언트의 상태
*클라이언트 → 서버로 접속 요청
SYN_RCVD 클라이언트에게 SYN세그먼트를 받고, ACK/SYN 플래그가 설정된 응답 세그먼트를 보낸 후 클라이언트의 ACK 세그먼트를 기다리는 서버의 상태
*서버(클라이언트의 접속 요청을 받고)가 클라이언트에게 접속 요청 응답
ESTABLISHED 3 Way-Handshake과정이 완료되어 연결이 완료된 상태
*클라이언트와 서버가 서로 세션 확립 상태
FIN_WAIT_1 클라이언트의 어플리케이션이 회선 종료를 요청하고 FIN 세크먼트를 서버에 전송한 클라이언트의상태
*접속을 끊기 위해 소켓을 close하고 close 요청(close 발생 주체는 서버 또는 클라이언트)
CLOSE_WAIT FIN 세크먼트를 수신하고 이에 대한 ACK 세그먼트를 클라이언트에게 전송한 서버의 상태
*close 요청을 받고 응답을 보냄
FIN_WAIT_2 서버에게 전송한 FIN 세크먼트에 대한 ACK 세그먼트를 수신했고, 서버로부터 FIN 세그먼트가 전송되기를 기다리는 클라이언트의 상태
*close 요청에 대한 응답을 받고 최종 응답 대기
LAST_ACK 요청받은 회선 종료에 대해 클라이언트에게 FIN 세크먼트를 전송하고, 이에 대한 ACK 세그컨트를 기다리고 있는 서버의 상태
*소켓을 close하고 최종 close 응답
TIME_WAIT 회선이 종료되었지만, 분실되었을지 모르는 세그먼트를 위해 당분간 회선을 유지하는 상태(회선 종료를 요청한 클라이언트에서만 나타나는 상태)
*최종 close 응답을 받고 미처 처리되지 못한 데이터를 처리를 위해 일정시간 유지 상태
active open 능동적으로 세션 확립에 대한 요청을 하는 과정으로 보통 클라이언트에서 이루어짐
(예: 클라이언트가 포트를 개방하고 서버에 접속 요청을 하는 것)
passive open 수동적으로 세션 확립에 대한 요청을 받는 과정으로 보통 서버에서 이루어짐
(예: 서버가 포트를 개방하고 클라이언트의 접속 요청을 대기하는 것)
active close 능동적으로 세션 해제를 발생시키는 과정으로 서버 또는 클라이언트가 될 수 있다
(예: 클라이언트가 접속을 끊거나 서버가 접속을 끊는것)
passive open 수동적으로 세션 해제에 대한 요청을 받는 과정으로 마찬가지로 서버 또는 클라이언트가 될 수 있다

3. TCP 상태 특징
1) TCP 연결은 양방향이므로, 양 측에서 각각 다른 상태를 관리하게 됨
- 즉, 다른 경로를 통해 `TCP 연결 설정` 및 `TCP 연결 종료`에 갈 수 있음

2) 2가지 다른 TCP 연결 설정 경로
- (능동 개방) Closed -> Listen -> SYN-Received -> Establshed
. 자발적으로 SYN 세그먼트를 보내며 연결 설정하는 경우
- (수동 개방) Closed -> SYN-Sent -> Established
. 수동적으로 SYN 세그먼트를 수신하며 연결 설정하는 경우
  -> 주로, 서버 응용이 TCP에게 상시적 연결 수용 및 대기

3. 다른 연결 종료 경로
- (수동 종료) Eatablished -> Close-Wait -> Last-ACK -> Closed
. 상대로부터 FIN 세그먼트를 받고, 이에대해 응답하며 종료하는 경로
- (능동 종료) Eatablished -> FIN-Wait-1 -> FIN-Wait-2 -> Time-Wait -> Closed
또는, Eatablished -> FIN-Wait-1 -> Closing -> Time-Wait -> Closed
. 자발적으로 FIN 세그먼트를 보내고, 응답을 기다리며 종료하는 과정

 

4. 세그먼트(전송 계층에서의 데이터 전송 단위) 설명

명칭 의미
SYN(Synchronize) 연결 시작, 회선 개설 요청에 사용되는 세그먼트이다. TCP 에서는 접속 요청을 하는 주체가 SYN 세그먼트를 전송하고 요청을 받는 주체는 여기에 값을 추가해서 응답한다.
ACK(Acknowledgement) 요청에 대한 응답 세그먼트이다.
RST(Reset) 연결 리셋에 대한 세그먼트로 유효하지 않은 연결에 대한 시도를 했다거나 통신의 연결 및 종료를 정상적으로 할 수 없을때 사용된다.
FIN(Finish) 연결 해제, 회선 종결 요청에 사용되는 세그먼트이다.
MTU(Maximum Transmission Unit) MTU는 그림에는 나와있지 않지만 MSS의 설명이 필요하기 때문에 언급하게 되었다. MTU란 TCP/IP 네트워크 등과 같은 패킷 또는 프레임 기반의 네트워크에서 한번에 전송될 수 있는 최대 크기의 패킷 또는 프레임을 말한다. 단위는 Byte이며 MTU 값은 네트워크 인터페이스나 대역폭 등 네트워크 환경에 따라 달라질 수 있는데 일반적으로 흔히 쓰이는 이더넷의 경우 MTU 값은 1500을 사용하고, FDDI는 4000, X.25는 576, Gigabit는 9000정도를 사용한다.
MSS(Maximum Segment Size) MTU에서 헤더를 제외한 TCP상에서 전송 할 수 있는 사용자 데이터의 최대 크기에 해당하는 세그먼트이다. 위 그림에서는 처음 접속 요청시 1460바이트에 해당하는 MSS를 전송하고 있다. 이것은 이더넷과같은 환경에서 MTU를 1500으로 사용했을 때 여기에 IPv4 헤더의 20바이트와 TCP 헤더의 20바이트를 뺀 값이다. 그리고 응답시에는 1024바이트로 응답하는데 이것은 1024바이트의 크기의 단위로 데이터를 전송하겠다는것을 의미한다.

 

5. 비정상 종료 상황 예시

명칭 의미
CLOSE_WAIT - 어플리케이션에서 close()를 적절하게 처리해주지 못하면, TCP 포트는 CLOSE_WAIT상태로 계속 기다림
- CLOSE_WAIT상태가 statement에 많아지게 되면 Hang이 결려 더 이상 연결을 하지 못하는 경우가 발생한다 따라서 어플리케이션 개발 시 여러 상황에 따라 close() 처리를 잘 해줘야 함
FIN_WAIT_1 - 상대방 측에 커넥션 종료 요청을 했는데 ACK를 받지 못한 상태로 기다리고 있음
- 서버를 찾을 수 없는 것으로 네트워크 or 방화벽의 문제일 수 도있음
- FIN_WAIT_! 상태는 일정시간이 지나 Time Out이 되면 자동을 종료함
FIN_WAIT_2 - 클라이언트가 서버에 종료를 요청한후 서버에서 요청을 접수했다고 ACK를 받았지만, 서버에서 종료를 완료했다는 FIN을 받지 못하고 기다리고 있는 상태
- 이 상태는 양방 간 두번의 통신이 이루어졌기 때문에 네트워크 문제는 아닌 것으로 판단되며, 서버 측에서 CLOSE를 처리하지 못하는 경우일 수도 있음
- FIN_WAIT_2 역시 일정시간 후 Time Out이 되면 자동을 종료함

 

+ Recent posts