🔍 개념 정리
⚙️ TCP : TCP는 프로세스-대-프로세스 통신과 전이중 방식의 연결 지향 서비스를 제공하며, 연결설정, 데이터 전송, 연결해제의 3단계로 구성된다.
⚙️ TCP 통신 : 네트워크 통신에서 신뢰적인 연결방식을 말한다. TCP는 기본적으로 unreliable network에서, reliable network를 보장할 수 있도록 하는 프로토콜로, network congestion avoidance algorithm을 사용한다.
⚙️ TCP 버퍼 : 송신 측은 버퍼에 TCP 세그먼트를 보관한 후 순차적으로 전송하고, 수신 측은 도착한 TCP 세그먼트를 애플리케이션이 읽을 때까지 버퍼에 보관한다.
⚙️ 흐름 제어 : 수신 측이 송신 측보다 데이터 처리 속도가 빠르면 문제가 없지만, 송신 측의 속도가 빠를 경우 문제가 생긴다. 수신 측에서 제한된 저장 용량을 초과한 이후에 도착하는 패킷은 손실될 수 있으며, 만약 손실된다면 불필요한 추가 패킷 전송이 발생하게 된다. 흐름 제어는 위와 같이 송신 측과 수신 측의 TCP 버퍼 크기 차이로 인해 생기는 데이터 처리 속도 차이를 해결하기 위한 기법이다.
👉🏻 해당 문제가 발생하지 않기 위해서는 송신 측의 데이터 전송량을 수신특에 따라 조절해야함. 이를 위해 Stop and Wait 방식과 Sliding Window 방식이 존재함
⚙️ 송신 윈도우 : 윈도우 크기가 수신자와 네트워크의 상황에 따라서 조정이 되고, 세그먼트 단위로 전송하지만 바이트 단위로 윈도우를 관리한다.
⚙️ 수신 윈도우 : 윈도우 크기는 송신측으로부터 넘치지 않고 수신할 수 있는 데이터 바이트의 개수를 결정한다.
👉🏻 rwnd = 버퍼크기 - (수신프로세스로부터) 읽히기를 기다리는 바이트 수
⚙️ Stop and Wait : 매번 전송한 패킷에 대해 확인 응답(ACK)를 받으면 다음 패킷을 전송하는 방법이다. 그러나 패킷을 하나씩 보내기 때문에 비효율적인 방법이다.
⚙️ Sliding Window : 수신 측에서 설정한 윈도우 크기만큼 송신 측에서 확인 응답(ACK) 없이 패킷을 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어 기법이다. 윈도우에 포함되는 모든 패킷을 전송하고, 그 패킷들의 전달이 확인되는대로 이 윈도우를 옆으로 옮김으로써 그 다음 패킷을 전송한다. 전송은 되었으나 ACK를 받지 못한 바이트의 숫자를 파악하기 위해 사용되는 프로토콜이다.
⚙️ 윈도우 크기 : 최초의 윈도우 크기는 호스트들의 '3 way handshaking'을 통해 수신 측 윈도우 크기로 설정되며, 이후 수신 측의 버퍼에 남아있는 공간에 따라 변한다. 윈도우 크기는 수신 측에서 송신 측으로 확인 응답(ACK)을 보낼 때 TCP 헤더(window size)에 담아서 보낸다. 즉, 윈도우는 메모리 버퍼의 일정 영역이라고 생각하면 된다.
⚙️ 동작 방식 : 윈도우에 포함된 패킷을 계속 전송하고, 수신 측으로부터 확인 응답(ACK)이 오면 윈도우를 옆으로 옮겨 다음 패킷들을 전송한다.
- 최초로 수신자는 윈도우 사이즈를 7로 정한다.
- 송신자는 수신자의 확인 응답(ACK)을 받기 전까지 데이터를 보낸다.
- 수신자는 확인 응답(ACK)을 송신자에게 보내면, 슬라이딩 윈도우 사이즈을 충족할 수 있게끔 윈도우를 옆으로 옮긴다.
- 이후 데이터를 다 받을 때까지 위 과정을 반복한다.
⚙️ 3 ACK Duplicate : 패킷을 받는 수신자 입장에서는 세그먼트로 분할된 내용들이 순서대로 도착하지 않는 경우가 생길 수 있다. 이런 상황이 발생했을 때 수신 측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어서 보낸다. 그리고 이런 중복 ACK 3개를 받으면 문제가 있다고 판단하여 해당 패킷을 송신 측이 재전송한다.
⚙️ Timeout : 말 그대로 여러 가지 요인으로 인해 송신 측이 보낸 데이터 자체가 유실되었거나, 수신 측이 응답으로 보낸 ACK가 유실되는 경우를 뜻한다.
⚙️ 재전송 : 송신 측은 일정 시간 동안 수신 측으로부터 확인 응답(ACK)을 받지 못하면 패킷을 재전송한다. 만약, 송신 측에서 재전송을 했는데 패킷이 소실된 경우가 아니라 수신 측의 버퍼에 남는 공간 없는 경우면 문제가 생긴다. 이를 해결하기 위해 송신 측은 해결 응답(ACK)을 보내면서 남은 버퍼의 크기 (윈도우 크기)도 함께 보내 준다.
⚙️ 혼잡 제어 : 데이터의 양이 라우터가 처리할 수 있는 양을 초과하면 초과된 데이터는 라우터가 처리하지 못한다. 이때 송신 측에서는 라우터가 처리하지 못한 데이터를 손실 데이터로 간주하고 계속 재전송하여 네트워크를 혼잡하게 한다. 이런 상황은 송신 측의 전송 속도를 적절히 조절하여 예방할 수 있는데, 이것을 혼잡 제어라고 한다.
정리하자면, 흐름 제어는 송 수신 측 사이의 패킷 수를 제어하는 기능이라 할 수 있으며, 혼잡 제어는 네트워크 내의 패킷 수를 조절하여 네트워크의 오버플로우를 방지하는 기능이다.
⚙️ 혼잡제어의 3단계 원칙
1) Slow Start (느린 시작), 2) Congestion Avoidance (혼잡 회피), 3) Congestion Detection (혼잡 감지)
⚙️ 혼잡 제어 기법
1) AIMD(Additive Increse / Multicative Decrease) : 우리 말로 직역하면 합 증가/곱 감소 방식이다. AIMD 방식은 처음에 패킷을 하나씩 보내고 문제 없이 도착하면 윈도우의 크기를 1씩 증가시켜가며 전송한다. 만약, 전송에 실패하면 윈도우 크기를 반으로 줄인다. 윈도우 크기를 너무 조금씩 늘리기 때문에 네트워크의 모든 대역을 활용하여 제대로 된 속도로 통신하기까지 시간이 오래 걸린다는 단점이 있다.
2) Slow Start(느린 시작) : 지수 증가 (Exponential Increase)
위에서 언급되어 있듯이 AIMD 방식은 윈도우 크기를 선형적으로 증가시키기 때문에, 제대로된 속도가 나오기까지 시간이 오래 걸린다. 반면, Slow Start는 윈도우의 크기를 1, 2, 4, 8, ...과 같이 지수적으로 증가시키다가 혼잡이 감지되면 윈도우 크기를 1로 줄이는 방식이다. 이 방식은 보낸 데이터의 ACK가 도착할 때마다 윈도우 크기를 증가시키기 때문에 처음에는 윈도우 크기가 조금 느리게 증가할지라도, 시간이 가면 갈수록 윈도우 크기가 점점 빠르게 증가한다는 장점이 있다. (= 데이터를 전송하는 초기에는 수신윈도우의 크기가 크기 때문에 송신윈도우의 크기는 혼잡윈도우와 같다.)
3) Fast Retransmit(빠른 재전송) : 패킷을 받는 수신자 입장에서는 세그먼트로 분할된 내용들이 순서대로 도착하지 않는 경우가 생길 수 있다. 이런 상황이 발생했을 때 수신 측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어서 보낸다. 그리고 이런 중복 ACK를 3개 받으면 재전송이 이루어진다. 송신 측은 자신이 설정한 타임 아웃 시간이 지나지 않았어도 바로 해당 패킷을 재전송할 수 있기 때문에 보다 빠른 재전송률을 유지할 수 있다.
4) Fast Recovery(빠른 회복) : 빠른 회복은 혼잡한 상태가 되면 윈도우 크기를 1로 줄이지 않고 반으로 줄이고 선형 증가시키는 방법이다. 이 방법을 적용하면 혼잡 상황을 한 번 겪고나서부터는 AIMD 방식으로 동작한다.
5) Congestion Avoidance(혼잡 회피) : 혼잡 회피는 TCP/IP 프로토콜에서 혼잡 상태를 피하기 위한 중요한 메커니즘 중 하나인데, 네트워크 내에서 혼잡이 발생하지 않도록 송신자가 데이터 전송 속도를 적절히 조절하여 네트워크의 효율성을 유지하는 과정이다. Slow Start 단계를 마치고, 송신자가 전송 속도를 선형적으로 증가시키는 단계로 이루어진다. 이 단계에서 혼잡을 감지하거나 혼잡 상태를 해결하는 데 필요한 조치를 취하지 않고, 혼잡을 방지하고 네트워크의 안정성을 유지하기 위해 CWND(Congestion Window),
⚙️ SSTHRESH(Slow Start Threshold)와 같은 두 가지 주요 메커니즘을 사용한다. 혼잡 회피는 Slow Start 지수적 증가가 임계치(SSTHRESH)에 도달하게 되면 혼잡으로 간주하고 회피를 위해 CWND 크기가 선형적으로 증가하여 혼잡을 예방한다. Slow Start에 비해 훨씬 느린 속도로 증가되므로 혼잡 회피 기능 수행한다.
⚙️ 혼잡 제어 정책 : TCP에는 Tahoe, Reno, New Reno, Cubic, Ealstic-TCP까지 다양한 혼잡 제어 정책이 존재한다. 이러한 혼잡 제어 정책들은 공통적으로 혼잡이 발생하면 윈도우 크기를 줄이거나, 혹은 증가시키지 않으며 혼잡을 회피한다 라는 전제를 깔고 있다. 대표적인 정책으로는 Tahoe와 Reno가 있다. Tahoe와 Reno는 기본적으로 처음에는 Slow Start 방식을 사용하다가 네트워크가 혼잡하다고 느껴졌을 때는 AIMD 방식으로 전환하는 방법을 사용하는 정책이다.
⚙️ Slow Start 임계점 (SSTHRESH) : Tahoe와 Reno를 비교하는 그래프를 보면 Threshold(임계점) 이라는 단어가 등장한다. 이 임계점은 Slow Start Threshold(ssthresh) 를 뜻하는 것으로, 여기까지만 Slow Start를 사용하겠다는 의미를 가진다.
Slow Start를 사용하며 윈도우 크기를 지수적으로 증가시키다보면 어느 순간부터는 윈도우 크기가 기하급수적으로 늘어나서 제어하기가 힘들다. 또한, 네트워크의 혼잡이 예상되는 상황에서 빠르게 값을 증가시키기 보다는 조금씩 증가시키는 편이 훨씬 안전하다. 쉽게 생각해서 현재 윈도우 크기가 10이고, 현재 네트워크에 남은 공간이 15라고 할 때, Slow Start 방식을 사용하면 윈도우 크기가 20이 되지만 AIMD를 사용하면 앞으로 5번은 윈도우 크기를 천천히 늘릴 수 있다. 그래서 특정한 임계점을 정해 놓고, 그 임계점이 넘어가면 AIMD 방식을 사용하여 선형적으로 윈도우를 증가시킨다. 이때, 이 임계점을 Slow Start Threshold (ssthresh)라고 부른다.
- 참고 및 출처
1) https://steady-coding.tistory.com/507 [[네트워크] TCP/IP 흐름 제어 & 혼잡 제어]
2) https://benlee73.tistory.com/186 [TCP의 흐름제어 / 오류제어 / 혼잡 제어]
3) https://blog.skby.net/tcp-%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4/ [TCP 혼잡제어]
4) https://gyoogle.dev/blog/computer-science/network/%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4%20&%20%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4.html [TCP/IP (흐름제어/혼잡제어)]
5) https://blog.skby.net/tcp-%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4/ [TCP 혼잡제어]
6) https://sw-test.tistory.com/18
'🗂ㅤ인프라 | 네트워크' 카테고리의 다른 글
SuperPuTTY 설치 (0) | 2024.08.19 |
---|