Network

[컴퓨터네트워크] tcp 혼잡제어

우당탕탕코딩일기 2023. 10. 16. 15:57

tcp 전송계층 오류제어, 흐름제어 , 혼잡제어 한다.

 

혼잡제어


 

혼잡

혼잡은 퇴근할때 도로에서 만나는 혼잡이랑 비슷하다. 다만, tcp 에서의 혼잡은 도로가 아닌 인터넷에서 트래픽이 많다면 혼잡이 발생하는 것이다.

웹 서버 터졌다고 할 때 

 

증상은

1. 차타서 고속도로 오래 걸리면 시간도 오래걸린다.(long delays (queueing in router buffers))

2. 가끔씩보면 도저히 난 못참아 하고 이탈할 수도 있다 (packet loss (buffer overflow at routers))

 

우리가 경험하는 패킷손실의 대부분은 혼잡 때문이다.

 

체크섬은 받아야지 계산하지만 패킷 손실을 아예 못받아서 체크섬을 계산할 수 없다. 체크섬 계산이 잘못됐다는 건 0.01 퍼센트밖에 안되고 99퍼이상은 패킷 로스이다. 우리가 경험하는 혼잡의 증상 증 많은 경우는 딜레이 증가와 패킷로스이다.

 

흐름 제어는 다르다. 흐름제어는 수신자에 대한 속도 제어이다. 순전히 수신자의 상태를 보고 판단하는 게 흐름제어고 이것은 네트웤 상태와는 관계가 없다. 

 

혼잡 이유와 비용

혼잡은 라우터에 버퍼가 있는데 중간에 메모리에 들어갔다 나온다. 메모리가 결국 버퍼, 큐이다. 버퍼는 이론적으로 이상적으로는 패킷 로스 없다 계산하지만 현실은 아니다. 결국은 실제 버퍼는 제한되어있어서 패킷 로스가 일어난다. 

도로 막혔는데 더 보내는 악순환 : 버퍼 제한 때문에 발생 / 딜레이가 계속발생하다보니 패킷 로스 발생

그래서 굉장히 중요한 문제고 이게 해결되지 않으면 인터넷은 작동하지 않는다. 서버에 스레드 테스트 로드테스트 한다고 치면 누구나 많이 보내려한다. 인터넷 뿐만아니라 실생활도 그렇다. 나는 빨리 받고 싶어서 이기적으로 행동한다. 내가 빨리 받고 싶다. 다른사람도 빠르게 받고싶다. 내가 가해자 혹은 피해자가 될 수도 있는 것이다. 이러한 불공정 문제는 해결되어야한다.

그 문제를 해결하는게 혼잡제어이다.

 

 

 

인터넷에서 혼잡 처리 방식: 탐지와 제어

인터넷에 혼잡제어는 다 되어있다. 이것은 전송계층에 기능이 있다. TCP 프로토콜에 혼잡 제어가 구현되어 있다. 

혼잡이 일어났다 판단하는 신호는 패킷로스이다. 보냈는데 사라졌다든가..

 

재전송 또는 중복된 ACk 이 3개 이상 올 떄 혼잡이 발생했구나 탐지할 수 있다. 

혼잡 제어는 이기적으로 행동하지 않고 모두가 양보해야한다. 그래서 혼잡이 일어나면 보내는 양을 줄이는 것이 기본적인 철칙이다.

1. TCP 송신자의 보내는 양줄이기

  - Slow Start, AIMD

 

2. 혼잡제어 알고리즘

 - TCP 버전 이름들임 : TCP Tahoe, Reno, NewReno, Cubic, BBR

 

TCP에서 혼잡제어를 구현하게 된 이유는 혼잡제어를 하지 않아서 망해봤기 때문이다. 실제로 1986년에 사건이 있었다

 - Congestion collapse 사건: 1986 NSFNET meltdown (혼잡한 인터넷 경로를 공유하는 많 은 송신자들이 재전송하여 인터넷 이마비된사건)

처음엔 TCP는 라우터로부터 신호를 받는게 없어서 TCP는 수신자의 ACK정보로부터 congestion에 대해서 알아야했다


Congestion Collapse in 1986
Congestive collapse was identified as a possible problem by 1984

It was first observed on the early Internet in October 1986,
when the NSFNET phase-I backbone dropped three orders of magnitude

from its capacity of 32 kbit/s to 40 bit/s,
which continued until end nodes started implementing Van

Jacobson and Sally Floyd's congestion control between 1987 and 1988

( 사람들 기억하기 _ 아마 중간고사..?)

  • When more packets were sent than could be handled by intermediate routers, the intermediate routers discarded many packets, expecting the end points of the network to retransmit the information.
  • However, early TCP implementations had poor retransmission behavior.
  • When this packet loss occurred, the endpoints sent extra packets that repeated the information lost, doubling the incoming rate.

 

라우터로부터 신호받는게 초반에 없었는데 갑자기 들어왔다고 했다. 그게바로 ECN 부터 적용됐다고 생각하면된다

 

 

TCP congestion control: AIMD

AIMD 로 구현한 방식을 살펴보자

혼잡 일어나면 절반으로 떨어뜨리겠다.이게 핵심이다. 속도는 단위시간당 보내는 양으로 윈도우 크기임.

혼잡이 일어났다(=패킷로스발생)

두번째 철학이 비동기 알고리즘이다. 모든 사용자는 각각 알아서 독립적으로 작동한다. 이렇게 해야 아까 얘기한대로 공평한 자원을 누릴 수 있고, 그렇게 안정화가 될 수 있다. 

 

혼잡 제어 : 디테일

ACK 받고 보내려고 하는 순간이 표로 되어있다./ 결국은 속도는 cwnd / RTT 이다. (cwnd 는 윈도우 크기이다. tcp 헤더에 보면 리시버 윈도우 크기가 있었다. 그것이 바로 awnd 이다.)

 

우리가 tcp 헤더에는 리시버 윈도우 크기가 있었다. 그걸 다시 상기하며 

 

아래 사진을 보자. 

cwnd는 송신자 윈도우 크기 awnd 는 수신자 윈도우 크기이다.

따라서 윈도우 사이즈는 cwnd 와 awnd 중 더 작은 것을 취한다. 

 

 

슬로우는 1부터 시작해서 슬로우다. 보내는 단위는 지수함수 단위로 증가한다.

슬로우는 언제 시작될까?

커넥션 시작하면 슬로우 스타트 + 재전송 타이머로 로스가 탐지 될때 이다. 타임아웃이 되면 다시 슬로우 스타트한다.

 

summary: initial rate is slow, but ramps up exponentially fast

(처음엔 느린데 점점 기하급수적으로 빨라짐)

 

initially cwnd = 1 MSS ( MSS 보통 1460 바이트)

짧은 플로가 많으면 IW 늘리는 것도 좋은 방법이다.

 

 

 

1로 세팅하면 다시 1 2 4 8 ~ 보내는 양이 어느때부터는 (threshhold) 그떄부터는 슬로우스타트 끝내고 천천히보내~ 하다가 어떤 타이머로 뚝 1로 떨어짐.
Tahoe버전이 초창기 버전 그다음 Reno
슬로우스타트에는 새로운 ACK 오면 윈도우+MSS / 혼잡피할때 새로운 액 오면 윈도우

 

실제 여러분들 

 
 

Evolution of TCP

NewReno, RFC3782

    • Fast recovery against multiple packet drops

A Reno TCP reacting to a partial ACK by reducing its inflated congestion window

 

우리가 쓰는 버전은 큐빅

 

TCP in High-Speed Environments

With large BDPs (e.g., WANs of 1Gbps or more)

     • TCP may not perform well


TCP using 1500-byte packets operating over a 10Gbps link

    • How many segments are required to be outstanding in order to fully utilize the available bandwidth ?

    • No assuming packet drops or errors

 

윈도우 크기 올릴 때 속도를 엄청나게 빨리 올림 계속 빨리올리면 안되므로, 어느 정도 올렸다가는 유지하는 게 큐빅의 핵심(올릴때 최대한 빨리 올리자.<- 3차함수 이용)

 

 

 

 

 

728x90