[Network] 5-1. 3-Way Handshake, 4-Way Handshake

KYJ의 Tech Velog·2023년 4월 22일
0

Network

목록 보기
7/21
post-thumbnail

앞선 포스팅에서 네트워크 계층에서 통신을 하려면 연결(Connection)을 확립해야 한다고 설명하였습니다.

3-Way Handshake

연결은 TCP 헤더의 코드 비트에 연결 요청 SYN, 확인 응답 ACK를 사용하여 확립할 수 있습니다.

3-Way Handshake는 연결을 위해 패킷 교환을 3번 확인 하는 것입니다.

다음은 클라이언트와 서버 간의 통신을 나타낸 것입니다.

  1. 클라이언트는 서버에 연결을 요청하는 TCP 헤더의 코드 비트가 SYN인 패킷을 보냅니다. 이 때 클라이언트는 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 됩니다. 서버는 LISTEN 상태로 패킷을 기다립니다.
  2. 서버는 요청을 받은 후에 클라이언트에게 요청을 수락한다는 ACK와 SYN 비트가 설정된 패킷을 전송하고 클라이언트의 ACK를 기다립니다. 이 때 서버는 SYN_RECEIVED 상태가 됩니다.
  3. 클라이언트는 서버에게 ACK 비트가 설정된 패킷을 전송하고 나면 연결이 확립된 것입니다. 클라이언트는 패킷을 전송한 시점에 ESTABLISHED 상태가 되고 서버는 패킷을 받고 나면 ESTABLISHED 상태가 됩니다.

SYN Flooding

클라이언트가 서버에게 SYN 비트가 설정된 패킷을 전송하고 서버가 ACY와 SYN 비트가 설정된 패킷을 전송하면 마지막으로 클라이언트가 ACK 비트가 설정된 패킷을 전송해야 연결이 확립됩니다. 이 때 클라이언트가 ACK 비트가 설정된 패킷을 전송하지 않고 SYN 비트만 계속 전송하는 것으로 서버를 공격할 수 있습니다.

서버는 클라이언트의 접속을 받아들이기 위해 메모리에 일정 공간을 확보해둡니다. 이러한 상황에서 클라이언트가 ACK 비트가 설정된 패킷을 보내지 않으면 메모리에 공간을 점점 더 확보하게 됩니다. 그리고 서버의 메모리가 꽉 차게 되면 연결을 더 이상 받아들일 수 없게 됩니다. 이를 SYN Flooding 공격이라고 합니다.

4-Way Handshake

연결을 종료하기 위해서는 연결 종료 비트 FIN, 확인 응답 ACK를 사용해야 합니다.

4-Way Handshake는 연결 종료를 위해 패킷 교환을 4번 확인 하는 것입니다.

마찬가지로 클라이언트와 서버 간의 통신을 나타낸 것입니다.

  1. 클라이언트가 연결 종료 비트 FIN인 패킷을 전송합니다. 이 때 클라이언트는 서버의 ACK를 기다리는 FIN_WAIT_1 상태가 됩니다.
  2. 서버는 ACK 비트가 설정된 패킷을 전송합니다. 이 때 서버는 CLOSE_WAIT 상태가 됩니다. 클라이언트에서 패킷을 받은 후에 클라이언트는 서버의 FIN 패킷을 기다리는 FIN_WAIT_2 상태가 됩니다.
  3. 서버는 연결 종료 비트 FIN인 패킷을 전송합니다. 이 때 서버는 클라이언트의 마지막 응답을 기다리는 LAST_ACK 상태가 됩니다.
  4. 클라이언트는 패킷을 받은 후에 ACK 비트가 설정된 패킷을 전송합니다. 이 때 TIME_WAIT 상태가 됩니다. 혹시 모를 패킷 전송 실패에 대비한 상태입니다. 마지막 패킷이 제대로 전송되지 않았다면 서버는 클라이언트가 제대로 종료될 수 있는 상태인지 확인할 수가 없고 제대로 종료가 되지 않을 수도 있습니다.

FIN_WAIT1, FIN_WAIT2 상태는 일정 시간이 지나 Time Out 되면 클라이언트는 CLOSED 상태가 됩니다. TIME_WAIT 상태는 2 MSL이 지나면 CLOSED 상태가 됩니다.

그리고 만약 서버에서 FIN을 전송하기 전에 전송한 패킷이 라우팅 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생했을 때를 대비한 것이기도 합니다.

클라이언트에서 종료시킨 후에 뒤늦게 도착하는 패킷이 있다면 이 패킷은 버려지고 데이터는 유실될 것입니다. 이를 대비해서 클라이언트가 FIN을 수신하더라도 일정 시간동안 잉여 패킷을 기다리는 것입니다.

Abrupt connection release (갑작스런 연결 해제)

RST 비트가 설정된 패킷을 전송하면 갑작스러운 연결 해제가 수행됩니다. ACK 비트가 설정된 패킷을 전송하는 작업없이 바로 연결이 종료됩니다.

RST 비트를 1로 설정된 패킷을 전송합니다. 송신자는 패킷을 전송하고 바로 연결을 종료하고 수신자는 패킷을 수신받으면 바로 연결을 종료합니다.

  • 보안 위반의 경우
    악성 코드가 존재한다고 판단되면 연결을 즉시 종료하여 보안을 지킬 수 있습니다.
  • 자원이 부족해 자원 할당을 해제해야하는 경우
  • TCP 연결에 장애가 발생한 경우

0개의 댓글