본문 바로가기

23년 2학기 학교공부/컴퓨터네트워크

[CN] TCP 혼잡제어

728x90
반응형
SMALL
2023학년도 2학기 충남대학교 이영석 교수님의 컴퓨터네트워크 수업 정리자료입니다.

 

 

 

 

📁 혼잡(Congestion)

 

네트워크에서 혼잡(Congetsion)이란, 네트워크상에 너무 많은 데이터가 있는 상태를 뜻한다.

 

 

혼잡한 상태의 증상은 다음과 같다.

 

1. 시간이 오래 걸린다.

2. 패킷이 중간에 이탈할 수 있다.

 

컴퓨터, 라우터, 공유기는 메모리가 있는데, 버퍼 큐에 패킷이 들어갔다 나옴. 들어오는게 나가는거보다 속도가 느리면 쌓일거니까 계속 쌓이다보면 overflow. 들어갈 큐가 없으면 그 데이터는 손실됨. 대부분 이런 경우가 패킷손실의 경우. checksum 경우는 엄청 희귀함.

 

 

 

단, 흐름제어와 혼잡제어는 다르다.

 

흐름 제어는 수신자에 대한 속도 제한. 순전히 수신자의 상태를 보고 판단함. 네트워크와는 상관 없는 주제.

 

 

 

 

🌱 혼잡의 이유

많은 경우가 라우터의 버퍼가 제한되어있어서 패킷로스. 패킷로스가 없는 경우는 딜레이되지만, 패킷로스가 있으면 재전송.혼잡도가 높은데 재전송때문에 보내는 양이 많아지는 악순환이 발생할 수 있음.

 

 

위 문제가 해결되어야 인터넷이 작동할 것임. 혼잡 제어 기능으로 해결. 혼잡하면 불공정 현상 발생 가능.

혼잡 제어 기능이 TCP의 핵심 기능임!

컴퓨터 커널 안에 TCP 프로토콜이 구현되어있고, 이 안에 혼잡 제어기능이 구현되어있음.

 

혼잡은 먼저 packet loss 신호를 탐지함. 패킷 손실이 일어나는건 어떻게 알지? 재전송 타이머를 보고 판단하거나, 중복 ACK이 3개 이상 오면 판단.

 

 

결론적으로 혼잡 제어하는 방법

혼잡이 일어나면, TCP 송신자가 보내는 양을 줄여야한다. 어떻게 줄이느냐. Slow Start, AIMD 두 단계가 있음.

혼잡제어 알고리즘은 TCP Tahoe, Reno, NewReno, Cubic, BBR 등 많음. 현재 다 쓰는 알고리즘.

 

TCP에서 혼잡제어를 구현하게 된 이유는 1986년 혼잡제어가 없어서 사건이 일어났었음.

 

원칙적으로 설계할때 TCP는 라우터로부터 신호를 받지 않게 설계되어있음. 최근에 도입되었음. TCP는 패킷 손실처럼 수신자의 상태를 보고 판단.(??)

 

1986년 혼잡제어기능이 없어서 엿댓던 사건

속도가 32kbit/s에서 40bint/s로 엄청 줄어들었었음. 그래서 Van Jcobson 등 유명한 사람들이 TCP에 혼잡제어기능 구현.

 

요즘은 CUBIC 기반. 윈도우는 Compound. 중간에 라우터가 TCP한테 신호전달하는걸 ECN에서 구현함. 최근에 도입된거임. 근데 다 지원되는건 아니고 몇몇 라우터만 지원.

 

 

 

혼잡이 일어나면 송신자는 지그재그 처럼 왓다갓다함. 그래프처럼. 얘가 직선으로 쭉 안감.

AIMD는 올라갈 때 천천히. RTT 한번 보내고 세그먼트 한개 올리기.

내려갈때 빠르게.  혼잡이 일어나면 절반으로 떨어뜨리겠다.

 

혼잡제어기능이 이런 AIMD 기능을 구현한 것.

 

혼잡이 일어났다, 즉 패킷로스가 일어났음을 감지했다.

 

혼잡이 일어나는 신호를 어떻게 판단할거냐? TCP Tahoe (초창기버전)에는 타이머만 가지고 했었는데, 이젠 3개 중복 ACK도 TCP Reno부터 감지.

 

AIMD는 분산된 비동기 알고리즘. 아 뭐라는거야????????????????

 

 

보내는 사람의 속도라는건, 보낼때도 메모리에 썼다가 보내는거니까  ..

cwnd : congestion window 라는 변수가 커널 안에 설정되어있음. 단위시간 당 보내는 양. 이 크기가 크면 속도가 빠른것.

 

파일 전송하면 속도를 대충계산하면 아래와 같음.

 

윈도우 크기는 기본적으로 cwnd인데 조건이있음. awnd라는. TCP 헤더에 보면 리시버 윈도우 크기라는게 있는데 걔가 얘임. 흐름제어에서 사용함.

cwnd는 송신자 윈도우 크기, awnd는 수신자 윈도우 크기라고 생각하면 됨.

 

 

Slow start

웹에 접속할때 어떻게 시작하느냐? slow start에서 속도가 지수함수로 증가하는 거. 임계치까지, 혹은 패킷로스가 일어날땎지 이렇게 증가함. 처음부터 빠르게 하는게 아니라 천천히 속도를 올려라. 가 철학.

이렇게 해도 느림.

 

패킷 손실이 타이머에 의해 감지되면 슬로우스타트 다시 시작.

 

처음에는 1부터 시작했는데 너무 느려서 최근엔 시작값이 10정도로 함.

그래서 1, 2, 4, 8,,이 아니라 10, 20, 40, 80,,,

 

8부터 AIMD. 이렇게 천천히 증가하는 구간. 그리고 Reno는 절반으로 뚝떨어지고 Taho는 1로 뚝떨어짐. Reno는 절반으로 떨어져서 천천히 증가.

 

congestion avoidance가 슬로우스타트 구간.

뭐?

 

 

NewReno는 Reno에서 약간 발전. ACK이 중간중간 비어있을때 복구 빠름.

 

현재 버전은 Cubic. 속도가 엄청 빨라졌음. 1Gbps를 쓸 때 TCP가 작동을 잘 안하는 것이 만들어진 이유. 속도가 10Gbps 인터넷에서 1500byte 패킷이 있다고 하자. 10Gbps를 풀로 쓰려면 송신자의 윈도우 크기가 1GB여야함. 나누기 1500하면 엄청 많음. 중간에 혼잡이 일어남. 설명놓쳤당

패킷 손실이 고속 환경에서 일어나면 윈도우 복구에 꽤 많은 시간이 걸린다. 가 Cubic 탄생 배경.

 

3차함수를 영어로 Cubic이라고 함.

3차함수 생김새처럼 윈도우 크기를 증가시킴.

고속환경에서 AIMD처럼 올릴때 천천히 올리는건 안됨. 그래서 올릴때 빨리 올림.

Slow start 구간 끝나고 AIMD 구간에서 이렇게 빨리올리는거임.

 

누가 만들었는지 설마 문제내겠어?

 

 

혼잡제어 알고리즘에 TCP BBR도 있음.

혼잡 판단을 패킷로스로만 하니까 세밀하게 못함. 그래서 대역폭 조정하는 기능까지 넣음.

구글이 씀. 만듬.이런게 잇다~ 정도만 알고

 

TCP는 비동기 알고리즘.

두 개의 커넥션이 있다. 10Mbps가 있따. 두 사람이 나눠쓰려면 절반 해야함. 두 커넥션이 그걸 어떻게 알고 중간지점까지만 갈거냐? 이걸 해야 공정해짐.

이걸 TCP가 할수있냐?

두 커넥션의 속도. 쭉 올라가면 혼잡 일어나고 다시 떨어지고, 다시 올라갔다가 혼잡 일어나고 떨어지고. 이게 중간까지 감. 뭔소리야

 

 

 

728x90
반응형
LIST