자, 예전에 TCP가 하는 일 중에는 congestion control이 있다 그랬어
Congestion이 뭘까? 해석하면 혼잡이야 혼잡 제어 알고리즘이거든
TCP의 보내는 쪽은, 윈도우를 가지고 있어서, 윈도우가 허락하는 만큼 데이터를 연속으로 보낼 수 있다
그랬었는데,
그러면 "이 윈도우의 크기를 어떻게 결정할건가?"에 대한게 이번 주제의 핵심이야.
이걸 알아보기 위해서 옛날 버전의 TCP를 살펴볼거야.
자 보면 y축은 TCP 보내는쪽의 Congestion window size라고 되어있어, x축은 시간이야
그래프를 따라가다보면 점점점 window의 크기를 늘리다가 손실이 발생하는 순간 반으로 감소시켜서 보내
이런 매커니즘을 AIMD라고 불러, Additive Increase Multiplicative Decrease라고 해서
"증가시킬때는 선형적으로, 감소시킬때는 배수로"라는 뜻이야.
그러니까 내가 보낼 수 있는 최대를 찾아가려고 노력중이다. 정도로 이해 하면 될것 같아.
그러면 Sender의 윈도우 크기를 어떻게 정할까?
일단 기본적으로 윈도우의 크기는
을 사용해, rwnd는 reciver 그러니까 받는쪽이 수용할 수 있는 만큼 이라는 뜻이고
cwnd는 혼잡 상태를 모니터링하면서 그거에 따라 윈도우의 크기를 조절하겠다는 뜻이야.
당연히 이 둘중에 낮은 값을 취해야 어디든 고통을 안받겠지?
근데 일반적으로 rwnd가 충분히 크대 cwnd보다.
아무튼, 처음 보내기 시작할때 부터 적당한 값으로 보내야 할건데, 무턱대고 100MB이렇게 보내면 안되잖아
보내는쪽은 상황을 모르니까.
그래서 두가지 방법을 연달아서 사용하는데, Slow start와 congestion avoidance를 사용해
먼저 Slow start는 처음 보낼때 사용되는 방법인데,
보낼때 엄청 낮은값을 사용해서 보내, 정찰한다는 느낌으로, 그러면 그 패킷에 대한 ACK가 오겠지?
그러면 ACK를 받을 때 마다, Sender의 Window size를 1씩 늘리는거야.
그러면 결과적으로 Window size가 2배가 되는거지.
이런식으로 작동한다는 소리야.
근데 이렇게 계속 커지다보면 분명히 손실이 발생할건데, 계속 두배로 늘려?
그럴 순 없지.
그래서 일정 값을 정해 놔, ssthresh라고 하는 값인데, 이 값보다 커지면 이제
다음 페이즈인 Congestion avoidance로 넘어가는거지.
Congestion avoidance는 뭐냐면 부분적으로 증가하는거야
위에서 8개를 보냈잖아? slow start인 경우 8개 보내면 그 다음에는 16개를 보낼거야
근데, Congestion avoidance는 8개의 ACK가 전부 다 도착을 해야 윈도우 크기를 1늘려.
그러니까 8개의 ACK가 다 도착하면 9개를 보낼 수 있게 되는거지
클만큼 컸으니 이제 눈치보면서 보낸다고 생각하면 편해
Congestion avoidance는 위의 식처럼 작동하는거야.
MSS = 1 , ssthresh = 8이라고 치면
1 2 4 8 9 10
굵은 부분은 이제 slow start가 되는거고
밑줄 부분은 이제 Congestion avoidance가 되는거야.
자자 근데 중요한건
이렇게 점점 증가하면서 보내다보면 Loss가 발생할 수 밖에 없는거야.
근데 Loss가 발생하는 원인은 두개가 있을거야.
1. 타임아웃
2. 3 duplicate ACK
이렇게 있단말이야.
그러면 이 두 상황을 똑같이 대응하는게 맞을까?
2번은 데이터중에서 하나가 빠진거니까 막 그렇게 심각한 상황은 아냐,
근데 1번은 조금 다른게, 패킷들이 많이 버려졌다는 소리야.
이건 좀 정도가 심각한거지, 그래서 대응을 잘 해 줘야해
그래서 CWND를 1MSS로 확 줄여, 그리고 다시 slow start를 사용해서 늘려가는거야
그치만 네트워크가 열악한 상황이라서, 눈치를 좀 심하게 봐줘야해, ssthresh도 절반으로 같이 줄여
아까 내가 8만큼 보내다가 로스가 생긴거니까 4로 줄이는거지. 왜냐면 내가 눈치를 보는 상황이 된거니까.
2번은 하나정도가 손실된거기 때문에 duplicate ack이 온거거든,
그래서 cwnd를 1MSS로 줄이는건 너무 과도한 대응이야.
그래서 그렇게 안하고, 그냥 절반으로 줄이는거지
그리고 살살 눈치보면서 조금씩 많이 보내는거야.
'학교 수업 > 컴퓨터 네트워크' 카테고리의 다른 글
Network layer :: 2. 라우터 내부에는 무엇이 있을까? (0) | 2020.06.11 |
---|---|
Network layer :: 1. 개요 정리 (0) | 2020.06.05 |
Transport layor - 3. TCP fast retransmit (0) | 2020.05.08 |
Transport layor - 2.1 Pipelining, Go Back N, Selective Repeat (0) | 2020.05.07 |
Transport layor - 1.3 개요 // 컴퓨터 네트워크 (0) | 2020.05.06 |
댓글