TCP 흐름제어와 혼잡제어
흐름제어
흐름제어란 ?
- 송신 측과 수신 측의 TCP 버퍼 크기 차이로 인해 생기는 데이터 처리 속도 차이를 해결하기 위한 기법
흐름 제어 기법
Stop and Wait
- 매번 전송 패킷에 대해 확인 응답(ACK)을 받으면 다음 패킷을 전송하는 방법
- 패킷을 하나씩 보내기 때문에 비효율적
Sliding Window
- 수신 측에서 설정한 윈도우 크기만큼 송신 측에서 확인 응답(ACK) 없이 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어 기법
✨ 윈도우 크기 ?
- 최초의 윈도우 크기는 3way handshaking을 통해 수신 측 윈도우 크기로 설정되며, 이후 수신 측의 버퍼에 남아있는 공간에 따라 변한다.
- 윈도우 크기는 수신 측에서 송신 측으로 확인 응답(ACK)을 보낼 때 TCP 헤더(window size)에 담아서 보낸다.
- 윈도우는 메모리 버퍼의 일정 영역이라고 보면 됨(?)

빨간 네모 박스 옆에 보면 Window Size가 있음
동작 방식
윈도우에 포함된 패킷을 계속 전송하고, 수신 측으로부터 확인 응답(ACK)이 오면 윈도우를 옆으로 옮겨 다음 패킷들을 전송

- 최초로 수신자는 윈도우 사이즈를 7로 정함
- 송신자는 수신자의 확인 응답(ACK)을 받기 전까지 데이터를 보냄
- 수신자는 확인 응답(ACK)을 송신자에게 보내면, 슬라이딩 윈도우 사이즈를 충족할 수 있도록 윈도우를 옆으로 옮김
- 데이터를 다 받을 때 까지 위 과정을 반복
- GBN, SR 방식이 이에 해당
- 송신 측은 일정 시간 동안 수신 측으로부터 확인 응답(ACK)을 받지 못하면 패킷을 재전송
- 수신측의 버퍼에 남는 공간이 없는 경우, 문제 발생을 방지하기 위해 송신 측은 ACK를 보내면서 남은 버퍼의 크기를 함께 보내줌
혼잡 제어
혼잡 제어란 ?
- 데이터가 너무 많아서 라우터가 처리할 수 있는 양을 초과하면?
- 송신 측에서는 이러한 경우를 데이터 손실로 간주하고 데이터를 계속 재전송함
- 네트워크가 혼잡해짐
- 송신 측의 전송 속도를 적절히 조절하여 예방할 수 있음.
흐름 제어 : 송,수신 측 사이의 패킷 수를 제어하는 기능
혼잡 제어 : 네트워크 내의 전체 패킷 수를 조절하여 오버플로우를 방지하는 기능
AIMD(Additive Increse/Multicative Decrease)
- 합 증가 / 곱 감소 기법 ?
- 패킷을 하나씩 보내고 문제 없이 도착하면 윈도우의 크기를 1씩 증가시켜가며 전송
- 전송 실패 시, 윈도우의 크기를 반으로 줄임
- 윈도우 크기를 너무 조금씩 늘리기 때문에 네트워크의 모든 대역을 활용하여 제대로 된 속도로 통신하기까지 오래 걸림

Slow Start
- 윈도우의 크기를 1, 2, 4, 8 … 과 같이 지수적으로 증가
- 혼잡이 감지되면 윈도우의 크기를 1로 줄임
- ACK가 도착할 때 마다 윈도우 크기를 증가시키기 때문에 처음에는 윈도우 크기가 조금 느리게 증가할지라도, 시간이 가면 갈수록 윈도우 크기가 점점 빠르게 증가한다는 장점이 있음
- Slow Start threshold (ssthresh)

Fast Retansmit
- 패킷을 받는 수신자 입장에서는 세그먼트로 분할된 내용들이 순서대로 도착하지 않는 경우가 생길 수 있음
- 수신 측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어서 보냄
- 위와 같은 중복 ACK 3개를 받으면 재전송( 3 ACK Duplicate )
- 송신 측은 자신이 설정한 타임 아웃 시간이 지나지 않았어도 바로 해당 패킷을 재전송할 수 있기 때문에 보다 빠른 재전송률 유지 가능

Fast Recovery
- 혼잡 상태가 될 시, 윈도우 크기를 반으로 줄이고 선형 증가시키는 방법
- 이 방법을 적용할 시 혼잡 상황을 한 번 겪고나서부터는 AIMD 방식으로 동작
'CS > 네트워크' 카테고리의 다른 글
터널링, VPN 터널링 (0) | 2023.03.26 |
---|---|
Forwarding vs Routing / Data Plane, Control Plane (0) | 2023.02.23 |
ARQ Stop and Wait, Go Back N, SR (0) | 2022.12.31 |
3 Way-Handshake, 4 Way-Handshake (2) | 2022.12.19 |
HTTP와 HTTPS (0) | 2022.12.09 |