3.7 TCP 혼잡 제어 240
3.7.1 전통적인 TCP의혼잡제어 240
3.7.2 네트워크 지원 명시적 혼잡 알림과 지연기반 혼잡 제어 250
3.7.3 공평성 252
🎭3.7.1 전통적인 TCP의 혼잡 제어
- TCP가 취한 집근 방식
- 네트워크 혼잡에 따라 연결에 트래픽을 보내는 전송률을 각 송신자가 제한
- 만약 TCP 송신자가 자신과 목적지 간의 경로에서 혼잡이 없음을 감지하면 송신자는 송신율을 높인다.
- 반면 송신자가 경로 사이에 혼잡을 감지하면 송신사는 송신율을 낮춤
TCP 송신자가 연결로 트래픽을 보내는 전송률을 어떻게 제한하는가?
- TCP 연결 양 끝의 각 호스트는 수신 버퍼와 송신 버퍼,그리고 몇 가지 변수(LastByteRead, rwnd 등)로 구성
- 송신 측에서 동작하는 TCP 혼잡 제어 메커니즘은 추가적인 변수인 혼잡 윈도를 추적
- cwnd로 표시되는 혼잡 윈도는 TCP 송신자가 네트워크로 트래픽을 전송할 수 있는 속도에 제약을 가함
- 특히 송신하는 쪽에서 확인응답이 안 된 데이터의 양은 cwnd와 rwnd의 최솟값을 초과X
LastByteSent - LastByteAcked <= min {cwnd, rwnd}
- 수신 윈도의 제약 조건을 무시할 수 있을 정도로 TCP 수신 버퍼가 매우 크다고 가정
- ㄴ-> 송신자의 확인응답이 안 된 데이터의 양은 오로지 cwnd에 의해 한정
- ㄴ-> 송신 속도 간접 제한
- 송신자가 항상 보낼 데이터가 있다고 가정
- 손실과 패킷 전송 지연 무시될 수 있는 연결 가정
- RTT의 시작 때, 송신자는 앞에서 언급한 제약 조건에 따라 cwnd바이트만큼의 데이터를 전송
- RTT가 끝날 때, 데이터에 대한 확인응답 수신
- => 송신자의 송신 속도는 대략 cwnd/RTT바이트/초
- cwnd의 값을 조절하여, 송신자는 링크에 데이터를 전송하는 속도를 조정O
TCP 송신자가 자신과 목적지 사이의 경로에 혼잡이 존재하는지를 어떻게 감지하는가?
- 타임아웃 또는 수신사로부터 3개의 중복된 ACK의 수신이 발생했을 때,TCP 송신자 측에 ‘손실 이벤트’가 발생했다고 정의
- 과도한 혼잡이 발생 -> 경로에 있는 하나 이상의 라우터 버퍼들이 오버플로 ->(TCP가 포함된)데이터그램이 버여짐 -> 버려진 데이터그램은 송신 측에서 손실 이벤트 발생 -> 송신자는 송신자와 수신자 사이의 경로상의 혼잡이 발생했음을 알게됨
손실 이밴트가 발생하지 않는 네트워크가 혼잡이 없는 경우가 되는 더 낙관적인 경우 고려
- TCP 송신자는 이전에 확인응답 안된 세그먼트들에 대한 확인응답들 수신
- 이는 TCP는 모든 것이 올바르게 동작하고 있다는 표시
= 네트워크로 전송되고 있는 세그먼트들이 목적지까지 잘 전달되고 있음을 표시
- TCP는 혼잡 윈도 크기(+ 전송률)를 증가시키기 위해 확인응답을 사용
- 확인응답이 늦은 속도로 도착한다면 혼잡 윈도는 상대적으로 낮은 속도로 증가
- ex) 종단 간의 경로가 높은 지연을 갖거나 낮은 대역폭 링크를 포함
- 확인응답이 높은 속도로 도착한다면 혼잡 윈도는 더 빨리 증가
- TCP는 확인응답을 혼잡 윈도 크기의 증가를 유발하는 트리거 또는 클록으로 사용
-> TCP는 자체 클로킹(self-clocking)이라고 한다
어떻게 TCP 송신자가 자신이 송신할 속도를 결정하는가?
- 만약 전체 TCP 송신자들이 너무 빠르게 송신하면,네트워크가 혼잡해져 그림 3.48에서와 같은 혼잡 붕괴가 나타남
- 만약 TCP 송신자들이 너무 천천히 송신한다면,네트워크 내의 대역폭을 충분히 활용X
- => TCP 송신자들은 네트워크를 혼잡시키지 않으면서 높은 전송률로 보내야 함.
TCP는 아래와 같은 처리 원칙에 따름
손실된 세그먼트는 혼잡을 의미 -> TCP 전송률은 한 세그먼트를 손실했을때 줄여야 한다.
- 타임아웃 이벤트나 4개의 확인응답의 수신은 손실 세그먼트의 재전송을 야기
- 묵시적인 손실 이벤트 :하나의 원래의 ACK와 3개의 중복된 ACK
확인응답된 세그먼트는 네트워크가 송신자의 세그먼트를 수신자에게 전송된다는 것이고, 이 에 따라 이전에 확인응답되지 않은 세그먼트에 대해 ACK가 도착하면 송신자의 전송률은 증가할 수 있다.
- 확인응답의 도착은 네트워크는 혼잡하지 않다는,즉 모든 것이 좋다는 묵시적 표시로 받음
- 혼잡 윈도 크기 증가 ㅇㅇ
대역폭 탐색
- 묵시적 신호
- ACK: 혼잡이 없는 출발지에서 목적지까지의 경로를 표시
- 손실 이벤트 : 혼잡한 경로를 표시
- ACK 주어짐 -> 손실 이벤트가 발생할 때까지 ACK가 도착함에 따라 전송률 증가시킴
- 손실 이벤트 주어짐 -> 전송률 감소시킴 -> 다시 혼잡 시작이 발생했는지를 보기 위한 탐색 시작
- 네트워크에 의한 혼잡 상태의 어떠한 명시적인 신호가 없으며, 각 TCP 송신자들은 다른 TCP 송신자들과는 비동기적으로 로컬 정보에 근거해 동작
TCP 혼잡 제어 알고리즘
구성요소 3가지
(1) 슬로 스타트
- TCP의 필수요소
- 수신된 ACK에 대웅하여 cwnd 크기를 비교적 빠르게 증가
(2) 혼잡 회피
- TCP의 필수요소
- 수신된 ACK에 대웅하여 cwnd 크기를 비교적 느리게 증가
(3) 빠른 회복
슬로 스타트
- TCP 연결이 시작될 때,cwnd의 값은 일반적으로 1 MSS로 초기화되고,그 결과 초
기 전송률은 대략 MSS/RTT
- MSS(MAX Segment Size) : 1MSS면 1개의 세그먼트 전송
- 가용 대역폭 > MSS/RTT
- ㄴ TCP 송신자는 가용 대역폭 양을 조속히 찾기 원함
슬로 스타트 상태
: cwnd 값을 1 MSS에서 시작하여,한 전송 세그먼트가 첫 번째로 확인응답을 받을 때마다 1 MSS씩 증가
슬로 스타트가 종료될 수 있는 방법 3가지
- 타임아웃으로 표시되는 손실 이벤트(즉, 혼잡)가 있을 경우
- cwnd 값을 1 로 설정하고 새로 슬로 스타트 시작
- 상태 변수 ssthresh(슬로 스타트 임곗값) 값을 cwnd/2으로 설정
- cwnd == ssthresh : 슬로 스타트 종료 -> 혼잡회피 모드로 전환
- ssthresh = 혼잡이 마지막으로 검출된 시점에서의 cwnd 값의 반
- ㄴ= 이 값에 도달하거나 지나친데 cwnd를 2배로하면 신중하지 못함
- 약 3개의 중복 ACK가 검출
- TCP는 빠른 재전송(3.5.4절 참고)을 수행하여 빠른 회복 상태로 전환
![](https://velog.velcdn.com/images/yujeongkwon/post/ebedd1c8-036b-4f4d-bf5a-c200a63a3abd/image.png)
혼잡회피
- 이 시점에서 cwnd의 값 = 대략 혼잡이 마지막으로 발견된 시점의 값 / 2 (거의)
- 슬로스타트 상태에서 cwnd == ssthresh이 되어 혼잡회피로 온 상태
- RTT마다 cwnd 값을 두 배로 하기보다는 TCP는 좀 더 보수적인 접근법 채택
- RTT마다 하나의 MSS만큼 cwnd 값을 증가
- 보통 새로운 승인 도착마다 TCP 송신자가 cwnd를 MSS바이트(MSS/cwnd)만큼 증가시키는 것
- 타임아웃이 발생했을 때
- 슬로 스타트의 경우와 같이 동작
- cwnd의 값은 1 MSS로 설정
- ssthresh의 값 : 손실 이벤트가 발생할 때의 cwnd 값 / 2
- 손실 이벤트가 3개의 중복된 ACK 이벤트에 의해 야기되는 경우
- 이 때, 네트워크는 송신자로부터의 세그먼트를 수신자에게 계속 전달 중.
- = 타임아웃 표시 손실보다 덜 과감해야 함
- ㄴ-> cwnd의 값을 반으로 줄임 -> ssthresh = cwnd 값/2 -> 빠른 회복 상태로 전환
- 이때, 수신된 3개의 중복 ACK를 설명하기 위해3 MSS 더함
빠른 회복
- cwnd 값을 손실된 세그먼트에 대해 수신된 모든 중복된 ACK에 대해 1 MSS만큼씩 증가
- ㄴTCP를 빠른 회복 상태로 들어가게 했던 세그먼트
- 손실된 세그먼트에 대한 ACK가 도착하면 TCP는 cwnd 혼잡 회피 상태 전환
- 타임아웃 이벤트가 발생한다면
- 슬로 스타트 및 혼잡 회피에서와 같은 동작을 수행 -> 슬로 스타트로 전환
- ㄴ cwnd 값은 1 MSS로 하고,ssthresh 값 : 손실 이벤트가 발생할 때의 cwnd 값 / 2
- 권고사항이지만 필수는 아님.
- TCP 리노의 방법
![](https://velog.velcdn.com/images/yujeongkwon/post/12b2fdbc-4715-43ce-993a-0ac7a3938731/image.png)
TCP 혼잡제어의 FSM
![3.51 TCP 혼잡제어의 FSM](https://velog.velcdn.com/images/yujeongkwon/post/15d31cde-1f48-4a66-9228-e4d118ad6759/image.png)
TCP 혼잡제어 : 복습
- 연결이 시작, 초기 슬로스타트 기간을 무시, 손실이 타임아웃이 아니라 3개의 중복 ACK로 표시된다고 가정
- TCP의 혼잡 제어의 구성
- RTT마다 1 MSS씩 cwnd의 선형(가법적인) 증가
- 3개의 중복 ACK 이밴트에서 cwnd의 절반화(승법적 감소)
- => TCP 혼잡 제어 종종 가법적 증가,승법적 감소의 혼잡 제어 형식
- AIMD 혼잡 제어 : 그림 3.53에서 보이는 ‘톱니' 동작이 생김
- TCP는 3개의 중복 ACK 이밴트가 발생할 때까지 선형으로 그 혼잡 윈도 크기(전송률)를 증가시킴
- 이 후, 혼잡 윈도 크기를 반으로 감소시키지만,다시 주가적인 가용 대역폭이 있는지를 탐색하기 위해 선형으로 증가시키기 시작
![](https://velog.velcdn.com/images/yujeongkwon/post/5d40337d-e584-4fcb-8e71-299870b302f1/image.png)
TCP 큐빅
- 전송 속도를 절반으로 줄인 다음 (or 전송 속도를 RTT당 하나의 패킷으로 줄이는 것)시간이 지남에 따라 다소 천천히 중가시키는 것은 지나치게 신중한 일
- TCP 타호로 알려진 이전 버전의 TCP 처럼
- TCP 큐빅 : 패킷 손실이 발생한 혼잡한 링크의 상태가 많이 변경되지 않은 경우, 전송 속도를 더 빠르게 높임 -> 손실 전 전송 속도에 근접하다면, 대역폭을 신중하게 조사
- TCP 리노와 약간 다름
- ACK 수신 시에만 혼잡 윈도를 늘리고 슬로스타트 단계와 빠른 복구 단계는 동일하게 유지되지만, 큐빅은 다음과 같이 혼잡 회피 단계가 수정됨.
- 큐빅은 혼잡 윈도를 현재 시각 r와 K 시각 사이 거리의 세제곱 함수로 증가
- ㄴ-> k가 K에 가까울 때보다 멀리 떨어질 때, 혼잡 윈도 크기 증가가 훨씬 더 커짐.
- Wmax에 가까워지면 조심스럽게 탐지
- t가 K보다 크게 초과하면 윈도 크기가 급격히 증가 = 정체 수준이 크게 변경
- Wmax : 손실이 마지막으로 감지되었을 때 tcp의 혼잡 제어 윈도 크기
- K : TCP 큐빅의 윈도 크기가 다시 게 도달하는 미래 시점
- 널리 쓰임
![](https://velog.velcdn.com/images/yujeongkwon/post/604a284d-d46e-45af-9c38-d53d4b29e708/image.png)
👏🏻 3.7.2 네트워크 지원 명시적 혼잡 알림과 지연 기반 혼잡 제어
- TCP 송신자는 네트워크에서 관찰된 패킷 손실을 통해 혼잡을 추론(명시X)
- 최근에는 네트워크가 TCP 송신자와 수신자에게 명시 적으로 혼잡 신호 전송 가능
명시적 혼잡 알림(ECN)
- 인터넷 내에서 수행되는 네트워크 지원 혼잡 제어의 한 형태
- 네트워크 계층에서 IP 데이터그램 헤더의 서비스 유형 필드에 있는 2비트(4개 값)가 ECN에서 사용
- ECN 비트의 한 설정
라우터가 정체를 겪고 있음을 나타내기 위해 라우터에서 사용
-> 이 혼잡 표시는 표시된 IP 데이터그램에서 목적지 호스트로 전달
-> 송신 호스트에게 알림
- 혼잡 알림 비트 : 언제 라우터가 혼잡해지는가는 정의X
- ㄴ 직관적으로 손실이 발생하기 전에 혼잡 시작을 송신자에게 알림
- ECN 비트의 두 번째 설정
- 발신 호스트가 라우터에게 송신자와 수신자가 ECN을 사용할 수 있음을 알림
-> 이에따라 ECN으로 표시된 네트워크 혼잡에 대한 응답으로 조치를 취할 수 있음을 알리는 데 사용
- TCP 송신자는 빠른 재전송을 사용하여 손실된 세그먼트에 반응하는 것처럼 혼잡 윈도를 절반으로 줄여 혼잡 알림 표시가 있는 ACK에 반응하고 다음 전송되는 TCP 수신자 세그먼트 헤더에 CWR(Congestion Window Reduced) 비트를 1로 설정
![](https://velog.velcdn.com/images/yujeongkwon/post/29ad60fc-db94-431e-a081-90455401e655/image.png)
지연 기반 혼잡 제어
- 송신자는 ECN의 혼잡 알림 비트를 통해 패킷 손실 전에 더 일찍 전송 속도 줄임 ㄱㅇㄷ
- +) 지연 기반 접근 방식 : 패킷 손실이 발생하기 전에 혼잡 시작을 사전에 감지
- TCP 베가스 : 모든 확인응답된 패킷에 대한 출발지에서 목적지까지 경로의 RTT 측정
- RTTmin : 경로가 정체되지 않고 패킷이 최소 대기 지연을 경험할 때 발생
- cwnd /RTT : 혼잡하지 않을 때의 처리율
- 실제 송신자가 측정한 처리량이 cwnd /RTT 값에 가까움 = 정체 X
-> TCP 전송 속도가 증가 가능
- 반대로 처리량 << 혼잡하지 않을때의 처리율(cwnd /RTT) = 경로가 혼잡
-> TCP 베가스 송신자는 전송 속도를 낮춤
⚖ 3.7.3 공평성
- 각 연결의 평균 전송률이 R/K에 가깝다면 혼잡 제어 메커니즘이 공평하다고 한다
- TCP 혼잡제어는 공평하게 함.
![](https://velog.velcdn.com/images/yujeongkwon/post/ce9ea093-8911-4640-b225-585a733144c9/image.png)
![](https://velog.velcdn.com/images/yujeongkwon/post/b13e256b-e240-45ec-9b03-92ebc3aae2e1/image.png)
공평성과 UDP
- UDP는 네트워크가 혼잡하더라도 자신의 전송률이 조절되는 것을 원하지 않음.
- TCP 입장에서 ㅈ같음 -> 요즘은 UDP 때매 일어난 혼잡을 제어하는 방식 개발중
공평성과 병렬 TCP 연결
- 위 UDP 혼잡 제에어 방식 되도 ㅈ같을걸? ~ 우린 웹 트래픽이 인터넷에 널리 퍼져있꼬 다중 병렬 연결은 흔하고 이러면 혼잡 제어 더 힘둠~