1. TCP 혼잡 제어
1) TCP 혼잡 제어: AIMD control (Additive increase multiplicative decrease 덧셈 증가 곱셈 감소)
cwnd : Congestion WiNDow : 혼잡 윈도우 크기로 송신 측에 있는 윈도우 크기이다. 즉, 한 번에 전송할 수 있는 데이터 양이다.
접근 방식: 송신자는 전송 속도(window 크기)를 증가시키고, 손실이 발생할 때까지 사용 가능한 대역폭을 탐색한다.
추가 증가: 손실이 감지될 때까지 RTT마다 cwnd를 1 MSS씩 증가시킨다.
곱셈 감소: 손실 후 cwnd를 절반으로 줄인다.
-> loss가 발생하면 빨리 대응하기 위해 절반으로 줄이고, 이후 혼잡이 해결되었을 수 있으므로 서서히 증가시켜보는 것이다.
2) 혼잡 제어 상세
Sender 전송 한계 : LastByteSent - LastByteAcked <= min(cwnd, rwnd)
1RTT마다 내보낼 수 있는
cwnd는 동적이고, 감지된 네트워크 혼잡의 함수이다.
TCP sending rate
: cwnd byte 전송, ACK의 RTT 대기, 더 많은 바이트 전송
rate ~= cwnd/RTT bytes/secs
(1) TCP slow start
연결이 시작되면 첫 번째 손실 이벤트까지 속도를 기하급수적으로 증가시킨다.
처음 cwnd = 1 MSS
RTT마다 cwnd 두 배
수신된 모든 ACK에 대해 cwnd를 증가시킴으로써 완료
-> 초기 속도는 느리지만 기하급수적으로 빠르게 증가한다.
(2) TCP 혼잡 방지
cwnd가 충분히 커지면 서서히 늘려야하는데, 그 기준은 ssthresh로 한다.
cwnd가 ssthresh보다 작으면 2배씩 증가시키다가, 비슷하거나 커지면 늘리는 속도를 줄인다.
sthresh란 증가 속도를 늦추기 위한 cwnd 임계값이다.
연결이 시작되면 sshtrsh는 OS에서 결정하는 기본값으로 설정된다.
손실이 발생하면 sshtresh = cwnd/2로 설정한다.
혼잡 방지는 cwnd가 ssthresh에 도달하면 사작된다.
RTT마다 cwnd를 1씩 증가시킨다.
ACK를 받을 때 마다 cwnd를 (MSS/cwnd) 만큼 증카시킨다 -> 1 RTT마다 들어오는 ACK수 = cwnd 수 -> 1 RTT마다 1 MSS 증가
정리하자면
cwnd가 ssthresh보다 작을 때는 RTT마다 cwnd를 2배로 증가시킨다.
그렇지 않을 떄는, RTT마다 cwnd를 1씩 증가한다.
(3) TCP의 Loss(손실) 감지와 대응
TCP가 Loss를 감지하는 방법은 2가지가 있다. timeout 발생과, triple duplicate ACKs.
- Timeout에의한 loss 감지
cwnd 을 1 MSS로 설정한다.
window는 slow start를 했으므로, 초기값이 작다. 그러므로 기하급수적으로 임계값까지 증가시키고, 다음에 선형적으로 증가시킨다.
- triple duplicate ACK로 loss 감지 (TCP RENO)
duplicate ACK는 일부 세그먼트는 전송되고있음을 의미한다.
그러므로, 반으로 줄였다가 서서히 증가시킨다.
TCP Tahoe는 항상(timeout, triple duplicate ACK 일 때 모두) cwnd를 1로 설정한다.
TCP Tahoe는 2배씩 증가시키다가, ssthresh(8)을 만나고, 1씩 증가한다.
그러다가 12에서 timeout이 나고 cwnd를 1로 설정하다. 이 때 ssthresh는 6이된다.
이후 다시 1부터 2배씩 증가하고, ssthresh(6)을 만나면, 1씩 증가한다.
TCP Reno는 12에서 triple duplicate ACK에의해 loss를 감지했다면,
ssthresh=6, cwnd=6이된다.
그 이후 혼잡 방지 상태로 들어가 1씩 증가한다.
2. TCP 성능 측정치
1) TCP throughput
(1) window 크기와 RTT로 평균 TCP thruput은?
(slow start는 무시한다.)
W : loss 발생 시 window size
W에 도달하면 W/2로 떨어지므로 평균은 (W+(W/2)) / 2
avg. window 크기는 3/4 W
평균 thruput 은 RTT마다 3/4W
avg TCP thruput = 3/4*(W/RTT) bytes/secs
(2) long, fat pipe위의 TCP
예시) 1500 byte 세그먼트, 100ms RTT 에서 10Gbps thruput 내기 위한 Loss는?
W=83,333 이 필요하다.
TCP throuput = (1.22*MSS) / (RTT * 루트L)
-> 10Gbps thruput 내기 위해서는 2*10^(-10) 만큼의 Loss rate 여야 가능하다.
2) TCP 공정성 Fairness
공정성 목표: K개의 TCP 세션이 대역폭 R의 동일한 병목 링크를 공유하는 경우, 각 세션은 평균 R/K 이어야한다.
파란 선은 capacity를 완전히 이용하는 경우일 때 이다.
시작점은 R에 훨씬 유리하다. 아직 파란선위가 아니므로 둘다 thruput rate를 늘린다.
파란 선을 넘는 순간, loss가 발생해 절반이 된다. (x, y축 값 모두 2배 감소)
덧셈 증가는 전체적으로 증가함에 따라 기울기가 1이 된다(점선과 평행)
위의 과정을 반복할 수록, equal bandwidth share (점선)에 가까워진다.
하지만 이것은, bottleneck으로부터 비슷한 거리에 있을 때이다.
그렇지 않은 경우에는, 가까운 애가 더 벌리 대응하므로 더 빨리 늘려 불공평해진다.
TCP fairness의 적
UDP는 Loss가 발생해도 대응하지 않고, 어플리케이션이 데이터 만드는대로 보낸다.
parallel TCP를 사용 역시 TCP 공정성 적이다. 한 어플리케이션이 많은 connection을 열면, 1개의 connection을 연 어플리케이션보다 우세하기때문이다.
'CS > 네트워크' 카테고리의 다른 글
[네트워크] 네트워크 계층 2. 가상 회로 및 데이터그램 네트워크 (2) | 2025.01.16 |
---|---|
[네트워크] 네트워크 계층 1. 네트워크 계층 개요 (0) | 2025.01.14 |
[네트워크] 전송 계층 - 혼잡 제어 원리 (0) | 2025.01.12 |
[네트워크] 전송 계층 - TCP : 연결 관리 (0) | 2025.01.12 |
[네트워크] 전송 계층 - TCP : 흐름 제어 (0) | 2025.01.12 |