ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [네트워크] 12. TCP flow control
    CS/네트워크 2023. 4. 17. 23:19

    1. TCP flow control

     

    flow control이란, application에서 데이터를 가져가는 속도가, sender가 주는 데이터의 속도보다 느릴 때, 데이터를 천천히 받도록 조절하는 것입니다.

    sender는 receiver의 버퍼가 가득 찼는지 모르기 때문에, 이를 flow control을 통해서 조절합니다.

     

     

    다음과 같이 sender과 receiver의 버퍼가 있다고 가정하겠습니다.

    여기서 rwnd가 receiver의 남은 버퍼 공간입니다. 이 값을 계속 알려줌으로써 sender가 데이터를 전송하는 속도를 조절하게 합니다.

    rwnd = RcvBuffer - (LastByteRcvd - LastByteRead)

     

    sender는 recevier가 보내준 rwnd값을 보고, in-flight 상태의 데이터 수를 조절합니다. 

    LastByteSend - LastByteAcked <= rwnd

     

     

     

     

     

     

    2. TCP connection management

    Connection management는, sender와 receiver가 데이터를 교환하기 전에 handshake를 맺는 것을 의미합니다.

     

    아래와 같이 2-way handshake 상황을 보도록 하겠습니다.

     

    여성이 남성에게 통신을 시작하자고 요청을 보냅니다.

    이 요청에 대해 남성은 여성에게 대답을 해줍니다.

    이렇게만 handshake를 하더라도 잘 될까요?

     

    여성의 경우, 요청이 제대로 들어가지 않았다면, ACK가 오지 않는 등으로 확인을 할 수 있습니다.

    하지만, 남성의 경우 여성이 OK 신호를 제대로 받았는지 확인할 수 가 없습니다.

    따라서 , 3-way handshake를 사용해야 합니다.

    위와 같이, ACK와 connection 정보를 한번에 전달하면서 3-way handshake를 해야 합니다.

     

    그럼 Three-way handshake에 대해 보다 자세히 알아보도록 하겠습니다.

     

    1. Client는 SYN flag를 세우고 Client Initial Sequence number를 담아 세그먼트를 전송합니다.
    2. Sender는 SYN flag와 ACK flag를 세우고, ACK값을 증가시켜 Server Initial Sequence Number와 함께 보냅니다.
    3. SYNACK를 받은 client는 SYN flag는 내리고, ACK flag는 올려서 ACK를 증가시켜 보냅니다.

    client의 state는 SYNSENT 상태가 되면, ACK를 기다리게 되고, server에게 마지막 ACK를 보낸 후 ESTABLISHED 상태가 됩니다.

     

     

    3-way handshake의 FSM은 아래와 같습니다.

    listen과 SYN rcvd 상태는 server의, SYN sent는 client의 상태가 됩니다.

     

     

    다음은 connection을 끊을 때 어떻게 하는지 알아보도록 하겠습니다.

    connection을 끊을 때는 FIN bit를 1로 설정하여 통신을 종료하게 됩니다.

    다만 중요한 점은, connection을 열 때와는 다르게, 4way 로 해야 한다는 점입니다.

     

    connection을 종료할 땐, server 측에서 종료를 위해 준비할 시간이 필요합니다.

    따라서 client로부터 FIN bit을 받았을 때, ACK를 보내고 끝낼 준비를 합니다.

    이 동안은 CLOSE_WAIT 상태로, 아직 데이터를 보낼 수 있습니다.

     

    이후 server 측에서 준비가 끝나면, FIN bit를 보내게 되어 client에게 끝낼 준비가 되었다고 알립니다.

     

    client는 마지막 ACK를 보내고, segment의 생명주기보다 2배의 시간을 기다린 후, 통신을 종료합니다.

    • 이렇게 시간을 기다리는 이유는 무엇일까요? 통신을 종료한 직후, 운이 나쁘게도 동일한 포트로 다른 process를 사용한다고 하면, 서버와의 통신에서 충돌이 일어날 수도 있습니다. 따라서 기존 통신을 확실하게 종료하기 위해 시간을 두어 기다리는 것입니다.

     

     

    3. SYN Flood Attack

    모든 해커, 보안 전문가들이 사용하는 nmap이라는 도구를 들어보셨을 겁니다.

    칼리 리눅스에는 기본적으로 설치되어 있는 툴입니다.

    이 툴은 포트 스캐닝 툴로, 타겟 서버에 어느 포트가 열려있는지 알 수 있는 도구입니다.

    (모든 포트를 스캐닝하는 것은 시간이 너무 오래 걸리기 때문에, 많이 사용되는 포트나, 조건을 입력해서 포트 스캐닝을 진행합니다.)

    이러한 nmap을 이용해 SYN Flood Attack을 가할 수 있습니다.

     

    *주의 : 운영중인 서버에 포트스캐닝을 하는 것은 불법입니다.

     

    nmap의 원리는, SYN을 서버에게 보내서 SYNACK를 통해 해당 포트가 열려있는지, 방화벽이 걸려 있는지 확인하는 것입니다.

    이를 통해 공격자는 ACK 없이 SYN을 보내, server가 SYN ACK를 기다리도록 하여 서버에 부하를 일으킵니다.(DOS 공격)

    server 입장에서는 너무 많은 Half Connection이 맺어지면서 발생하는 문제입니다.

     

    이를 막는 방법으로, Server 측에서는 확실한 connection에 대해서만 리소스를 사용하기 위해, 메모리 할당을 연기합니다.

    이를 src / dst ip / port / secret no를 넣어 HASH 값을 만든 후, 이를 sequence number로 사용합니다.

    이후 해당 seq num + 1의 값이 올 경우, 메모리를 할당합니다.

    이게 아니라면, connection을 생성하지 않습니다.

     

     

    본 글은 Computer networking : a top-down approach 라는 책을 통해 작성되었습니다.

    댓글

Designed by Tistory.