SEN2008 · 8. hafta · Transport Layer Concepts (II): Congestion Control, Flow Control

Taşıma katmanı II: akış kontrolü, tıkanıklık kontrolü ve RTT tahmini

rwnd ile akış kontrolü, slow start ve AIMD ile cwnd izleri (Tahoe ve Reno), ortalama TCP hızı ve EWMA ile timeout hesabı. Vizede tur tur cwnd tablosu ve timeout sorusu kesin gelir.

flow controlreceive window (rwnd)congestion controlcongestion window (cwnd)slow startssthreshcongestion avoidanceAIMDfast retransmitfast recoveryTCP TahoeTCP Renoduplicate ACKSampleRTTEstimatedRTTDevRTTTimeoutIntervalEWMA

Geçen hafta TCP’nin segmentleri nasıl numaraladığını gördük. Bu hafta ne kadar hızlı gönderdiğini konuşuyoruz. İki ayrı fren var: alıcıyı boğmamak için akış kontrolü (flow control) ve ağı boğmamak için tıkanıklık kontrolü (congestion control). Sınavda neredeyse her zaman tur tur cwnd tablosu ve bir timeout hesabı çıkar. Altın kurallar:

  1. Gönderen pencere = min(cwnd, rwnd). Biri alıcıdan, biri ağdan gelir.
  2. Slow start ikiye katlar, congestion avoidance 1 ekler. Geçiş noktası ssthresh.
  3. Kayıpta ssthresh = cwnd / 2. Her iki sürümde, her iki kayıp türünde.
  4. Timeout’ta cwnd = 1. Tahoe üç tekrar ACK’de de 1’e iner; Reno ssthresh + 3’e iner.
  5. Timeout = EstimatedRTT + 4 · DevRTT.

Akış kontrolü (flow control)

Alıcının bir tamponu (RcvBuffer) var. Ağdan gelen baytlar buraya yazılır, uygulama okudukça boşalır. Uygulama yavaş okursa tampon dolar ve yeni gelenler kaybolur. TCP bunu önlemek için her segmentin başlığında boş yer miktarını, receive window (rwnd) alanını gönderir:

rwnd=RcvBuffer−(LastByteRcvd−LastByteRead)\text{rwnd} = \text{RcvBuffer} - (\text{LastByteRcvd} - \text{LastByteRead})

Gönderen de yolda olan veriyi bu değerin altında tutar:

LastByteSent−LastByteAcked≤min⁡(cwnd,rwnd)\text{LastByteSent} - \text{LastByteAcked} \le \min(\text{cwnd}, \text{rwnd})

Çözümlü örnek: RcvBuffer = 20000 bayt, LastByteRcvd = 15000, LastByteRead = 9000.

tamponda okunmamış veri = 15000 − 9000 = 6000 bayt
rwnd = 20000 − 6000 = 14000 bayt

TUZAK · rwnd = 0 kilitlenmesi. Alıcı rwnd = 0 dediyse ve gönderecek verisi yoksa yeni rwnd bildirmez. Gönderen sonsuza kadar bekleyebilir. Bu yüzden gönderen, pencere sıfırken 1 baytlık deneme (zero window probe) segmentleri yollar.

Pencere aynı zamanda hız sınırıdır: her RTT’de en fazla bir pencere dolusu veri gönderilir. Window scaling olmadan rwnd en fazla 65535 bayttır, RTT 50 ms ise hız en fazla 65535⋅8/0.05≈10.4965535 \cdot 8 / 0.05 \approx 10.49 Mbps.

Tıkanıklık kontrolü: cwnd ve ssthresh

Ağ ortasındaki yönlendiricilerin kuyrukları dolunca paket düşer. TCP ağdan açık bir sinyal almaz (klasik TCP, uçtan uca yaklaşım). Kaybı tıkanıklık işareti sayar ve gönderen taraftaki tıkanıklık penceresini (congestion window, cwnd) ayarlar. Hız yaklaşık cwnd/RTT\text{cwnd} / RTT olur.

Üç evre var:

EvreKuralBir RTT’de değişim
Slow startHer ACK’te cwnd += 1 MSS×2
Congestion avoidanceHer ACK’te cwnd += MSS·(MSS/cwnd)+1 MSS
Fast recovery (Reno)Üç tekrar ACK sonrasıcwnd = ssthresh + 3, sonra doğrusal

Kayıp tepkileri:

OlayssthreshTahoe cwndReno cwnd
3 tekrar ACK (triple duplicate ACK)cwnd / 21 MSSssthresh + 3 MSS
Timeoutcwnd / 21 MSS1 MSS

Üç tekrar ACK gelince gönderen timeout’u beklemeden eksik segmenti hemen yeniden gönderir. Buna hızlı yeniden gönderim (fast retransmit) denir. Neden üç? Bir ya da iki tekrar ACK, sadece sıra karışmasından da gelebilir.

Çözümlü örnek (fast retransmit): gönderen 1’den 6’ya kadar segment yolluyor, 2 numaralı segment kayboluyor. Segment 1 gelince alıcı segment 2’yi istediğini bildirir. Segment 3, 4 ve 5 geldikçe aynı ACK üç kez tekrarlanır:

gelen seg   ACK (beklenen)   gönderende tekrar sayısı
1           2                -
3           2                1. tekrar
4           2                2. tekrar
5           2                3. tekrar → seg 2 hemen yeniden gönderilir

Segment 6’nın gelmesini ya da zamanlayıcının dolmasını beklemeye gerek kalmaz. Kayıp yaklaşık bir RTT içinde onarılır.

AIMD (additive increase, multiplicative decrease): kayıp yokken doğrusal artış, kayıpta yarıya bölme. Aynı darboğazı paylaşan iki AIMD bağlantısı zamanla eşit paya yaklaşır. Bu, TCP’nin adalet (fairness) özelliğidir.

İPUCU · tablo kuralı. Bu sayfada izler tur (RTT) başına yazılır. Slow start’ta cwnd’yi ikiye katlarken ssthresh’i aşarsan ssthresh’te durdururuz: cwnd = min(2·cwnd, ssthresh). Bazı hocalar Reno’da +3’ü atıp cwnd = ssthresh yazar. Sınavda sorunun kuralını oku.

Çözümlü örnek: Tahoe ve Reno izi

Başlangıç: cwnd = 1 MSS, ssthresh = 8 MSS. 12. turun sonunda üç tekrar ACK görülüyor.

tur   :   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
Tahoe :   1  2  4  8  9 10 11 12 13 14 15 16  1  2  4  8  9 10 11 12
Reno  :   1  2  4  8  9 10 11 12 13 14 15 16 11 12 13 14 15 16 17 18
ssth  :   8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8

Adım adım:

  • Tur 1-4: slow start, 1 → 8. Tur 4’te cwnd = ssthresh = 8, artık congestion avoidance.
  • Tur 5-12: her tur +1, 9 → 16.
  • Tur 12 sonu üç tekrar ACK: ssthresh = 16 / 2 = 8 (aynı kaldı).
  • Tahoe: cwnd = 1, yeniden slow start: 1, 2, 4, 8 (tur 13-16), sonra 9, 10, 11, 12.
  • Reno: cwnd = 8 + 3 = 11 (tur 13), sonra doğrusal: 12, 13, … 18.

Sekiz tur sonra Reno 18’de, Tahoe 12’de. Fast recovery’nin kazancı bu.

Soruların sorduğu tipik şeyler: “Hangi turlarda slow start?” (cwnd < ssthresh olan turlar), “Kayıp tespiti üç tekrar ACK mi timeout mu?” (cwnd 1’e düşüyorsa ve Reno ise timeout; yarıya iniyorsa üç tekrar ACK), “n. turda ssthresh kaç?” (son kayıptaki cwnd’nin yarısı).

Ortalama TCP hızı

Congestion avoidance’ta pencere kayıp anındaki W değerine kadar çıkar, yarıya iner, tekrar çıkar. Testere dişinin ortalaması 34W\frac{3}{4}W:

ortalama hız≈0.75⋅WRTT\text{ortalama hız} \approx \frac{0.75 \cdot W}{RTT}

Çözümlü örnek: W = 40 segment, MSS = 1500 bayt, RTT = 100 ms.

W = 40 × 1500 × 8 = 480000 bit
0.75 × 480000 / 0.1 s = 3600000 bit/s = 3.6 Mbps

RTT tahmini ve timeout

Timeout çok kısa olursa gereksiz yeniden gönderim, çok uzun olursa kayba geç tepki olur. TCP ölçülen gidiş dönüş sürelerini (SampleRTT) üstel ağırlıklı hareketli ortalama (EWMA) ile yumuşatır:

EstimatedRTT=(1−α) EstimatedRTT+α SampleRTT,α=0.125\text{EstimatedRTT} = (1-\alpha)\,\text{EstimatedRTT} + \alpha\,\text{SampleRTT}, \quad \alpha = 0.125

DevRTT=(1−β) DevRTT+β ∣SampleRTT−EstimatedRTT∣,β=0.25\text{DevRTT} = (1-\beta)\,\text{DevRTT} + \beta\,\lvert \text{SampleRTT} - \text{EstimatedRTT} \rvert, \quad \beta = 0.25

TimeoutInterval=EstimatedRTT+4⋅DevRTT\text{TimeoutInterval} = \text{EstimatedRTT} + 4\cdot\text{DevRTT}

Çözümlü örnek: EstimatedRTT = 100 ms, DevRTT = 10 ms, yeni SampleRTT = 140 ms.

Est     = 0.875 × 100 + 0.125 × 140 = 87.5 + 17.5 = 105 ms
Dev     = 0.75 × 10 + 0.25 × |140 − 105| = 7.5 + 8.75 = 16.25 ms
Timeout = 105 + 4 × 16.25 = 170 ms

TUZAK · güncelleme sırası. Ders kitabındaki sıra: önce EstimatedRTT, sonra DevRTT yeni Est ile. RFC 6298 ise DevRTT’yi eski Est ile önce günceller: Dev = 0.75·10 + 0.25·|140 − 100| = 17.5, Timeout = 175 ms. Soru sırayı belirtmiyorsa kitaptaki sırayı kullan ve yazdığın sırayı belirt.

Birden fazla örnek gelirse aynı adımı zincirle. Est = 80, Dev = 8 ile başlayıp 120, 60, 96 ms örnekleri:

örnek   EstimatedRTT   DevRTT       Timeout
120     85             14.75        144
60      81.875         16.53125     148
96      83.640625      15.48828125  145.59375

Tek büyük örnek (120) Est’i sadece 5 ms oynatır ama Dev’i hemen büyütür. Timeout’u asıl koruyan Dev terimidir.

Ek iki kural:

  • Karn algoritması: yeniden gönderilmiş bir segmentin ACK’inden SampleRTT alınmaz, çünkü ACK’in hangi kopyaya ait olduğu belli değildir.
  • Exponential backoff: timeout olunca bir sonraki timeout ikiye katlanır (1.25 s → 2.5 s → 5 s). Yeni ACK gelince formüle dönülür.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
Slow start yavaş (doğrusal) büyürÜsteldir, her RTT ×2
Akış kontrolü = tıkanıklık kontrolüAkış: alıcı (rwnd). Tıkanıklık: ağ (cwnd)
Pencere = cwndPencere = min(cwnd, rwnd)
Kayıpta ssthresh eski ssthresh’in yarısıKayıp anındaki cwnd’nin yarısı
Reno timeout’ta da yarıya inerTimeout’ta Reno da cwnd = 1
Tahoe üç tekrar ACK’de yarıya inerTahoe her kayıpta cwnd = 1
Ortalama hız = W / RTT≈ 0.75 · W / RTT (testere dişi)
Timeout = EstimatedRTT+ 4·DevRTT güvenlik payı eklenir
Yeniden gönderilen segmentten de RTT ölçülürKarn: ölçülmez

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

A TCP receiver has RcvBuffer = 16384 bytes, LastByteRcvd = 31000 and LastByteRead = 22000. What rwnd does it advertise?

Cevabı göster
7384 bytes

Tamponda bekleyen, uygulamanın henüz okumadığı veri: 31000 − 22000 = 9000 bayt.
rwnd = RcvBuffer − (LastByteRcvd − LastByteRead) = 16384 − 9000 = 7384 bayt.

Soru 2orta

A sender has LastByteSent = 50000 and LastByteAcked = 42000. Its cwnd is 12000 bytes and the last advertised rwnd is 10000 bytes. How many more bytes may it send right now?

Cevabı göster
2000 bytes

Yolda olan (onaylanmamış) veri: 50000 − 42000 = 8000 bayt.
Etkin pencere = min(cwnd, rwnd) = min(12000, 10000) = 10000 bayt.
Ek gönderilebilir: 10000 − 8000 = 2000 bayt.

Soru 3orta

With no window scaling, rwnd is at most 65535 bytes. What is the maximum TCP throughput on a path with RTT = 50 ms?

Cevabı göster
≈ 10.49 Mbps

Her RTT'de en fazla bir pencere gönderilir: hız ≤rwndRTT\le \dfrac{\text{rwnd}}{RTT}.65535×8 bit0.05 s=10 485 600\dfrac{65535 \times 8\ \text{bit}}{0.05\ \text{s}} = 10\,485\,600 bit/s ≈ 10.49 Mbps. Hattın kapasitesi ne olursa olsun bu sınırı aşamazsın.

Soru 4kolay

During slow start (no losses), how does cwnd change?

  1. It increases by 1 MSS per RTT
  2. It doubles every RTT (increases by 1 MSS per ACK)
  3. It halves every RTT
  4. It stays constant until a timeout
Cevabı göster
B) It doubles every RTT (increases by 1 MSS per ACK)

Slow start'ta gelen her ACK cwnd'yi 1 MSS büyütür. Bir RTT'de cwnd kadar ACK geldiği için pencere her RTT'de ikiye katlanır: 1, 2, 4, 8... Adı "yavaş" ama büyüme üsteldir.

Soru 5orta

A connection starts with cwnd = 1 MSS and ssthresh = 64 MSS. With no losses, after how many RTTs does cwnd first reach 32 MSS?

Cevabı göster
5 RTTs

Tur 1: 1, tur 2: 2, tur 3: 4, tur 4: 8, tur 5: 16, tur 6: 32.
Tur 1'den tur 6'ya 5 RTT geçer. Genel olarak 2k2^k MSS'e kk RTT'de ulaşılır: 25=322^5 = 32.

Soru 6zor

TCP Reno starts with cwnd = 1 MSS, ssthresh = 16 MSS. A timeout occurs at the end of round 9, and a triple duplicate ACK at the end of round 16. Using cwnd = min(2·cwnd, ssthresh) in slow start and cwnd = ssthresh + 3 after a triple duplicate ACK, give cwnd in rounds 10, 14 and 17, and ssthresh in round 17.

Cevabı göster
Round 10: 1, round 14: 10, round 17: 9; ssthresh = 6

Tur 1-5 slow start: 1, 2, 4, 8, 16. Tur 6-9 congestion avoidance: 17, 18, 19, 20.
Tur 9 sonunda timeout: ssthresh = 20/2 = 10, cwnd = 1. Tur 10: 1.
Tur 11-14: 2, 4, 8, sonra min(16, 10) = 10. Tur 15: 11, tur 16: 12.
Tur 16 sonunda üç tekrar ACK: ssthresh = 12/2 = 6, Reno cwnd = 6 + 3 = 9 (tur 17), sonra doğrusal artar.

Soru 7zor

Same scenario as before but with TCP Tahoe. What is cwnd in round 20?

Cevabı göster
6

Tur 16'ya kadar Reno ile aynı (timeout'ta ikisi de aynı davranır): tur 16'da cwnd = 12.
Tahoe üç tekrar ACK'de de cwnd'yi 1'e indirir, ssthresh = 6.
Tur 17: 1, tur 18: 2, tur 19: 4, tur 20: min(8, 6) = 6.

Soru 8orta

Why does TCP Reno react more mildly to a triple duplicate ACK than to a timeout?

  1. Duplicate ACKs mean the receiver's buffer is full
  2. Duplicate ACKs show later segments are still getting through, so congestion is mild; a timeout suggests heavier congestion
  3. A timeout only happens with UDP
  4. Duplicate ACKs are ignored by Reno
Cevabı göster
B) Duplicate ACKs show later segments are still getting through, so congestion is mild; a timeout suggests heavier congestion

Tekrar ACK gelmesi, kayıp segmentten sonraki segmentlerin alıcıya ulaştığını gösterir: ağ hâlâ taşıyor. Reno bu yüzden pencereyi yarıya indirip (fast recovery) devam eder. Timeout'ta hiç ACK gelmemiştir, durum daha kötü kabul edilir ve cwnd 1 MSS'e düşer.

Soru 9orta

Using the approximation average throughput = 0.75 · W / RTT, find the average throughput for W = 20 segments, MSS = 1460 bytes, RTT = 80 ms.

Cevabı göster
≈ 2.19 Mbps

W bayt cinsinden: 20 × 1460 = 29200 bayt = 233600 bit.0.75×2336000.08=2 190 0000.75 \times \dfrac{233600}{0.08} = 2\,190\,000 bit/s ≈ 2.19 Mbps.
0.75 nereden geliyor: AIMD altında pencere W/2 ile W arasında testere dişi çizer, ortalaması 3W/4.

Soru 10orta

EstimatedRTT = 200 ms and DevRTT = 20 ms. A new SampleRTT of 160 ms arrives. With α = 0.125 and β = 0.25, updating EstimatedRTT first and then DevRTT with the new EstimatedRTT, find the new TimeoutInterval.

Cevabı göster
290 ms

EstimatedRTT = 0.875 × 200 + 0.125 × 160 = 175 + 20 = 195 ms.
DevRTT = 0.75 × 20 + 0.25 × |160 − 195| = 15 + 8.75 = 23.75 ms.
TimeoutInterval = 195 + 4 × 23.75 = 195 + 95 = 290 ms.

Soru 11zor

EstimatedRTT = 80 ms, DevRTT = 8 ms. Two samples arrive in order: 120 ms then 60 ms. Using α = 0.125, β = 0.25 (EstimatedRTT updated first), give EstimatedRTT, DevRTT and TimeoutInterval after both samples.

Cevabı göster
EstimatedRTT = 81.875 ms, DevRTT ≈ 16.53 ms, Timeout = 148 ms

Örnek 1 (120): Est = 0.875·80 + 0.125·120 = 70 + 15 = 85. Dev = 0.75·8 + 0.25·|120 − 85| = 6 + 8.75 = 14.75. (Timeout 85 + 59 = 144.)
Örnek 2 (60): Est = 0.875·85 + 0.125·60 = 74.375 + 7.5 = 81.875. Dev = 0.75·14.75 + 0.25·|60 − 81.875| = 11.0625 + 5.46875 = 16.53125.
Timeout = 81.875 + 4·16.53125 = 81.875 + 66.125 = 148 ms.

Soru 12orta

A TCP sender's TimeoutInterval is 1.25 s. The same segment times out twice in a row. What is the timeout value used for the next retransmission?

Cevabı göster
5 s

Her timeout'tan sonra TCP aralığı ikiye katlar (exponential backoff), EWMA'dan yeniden hesaplamaz: 1.25 → 2.5 (1. timeout sonrası) → 5 s (2. timeout sonrası). Yeni ACK gelince değer tekrar EWMA formülünden hesaplanır.

Doğrulama: rwnd ve gönderilebilir bayt hesapları, tur tur cwnd/ssthresh izleri (Tahoe ve Reno için yazılmış simülatör, slow start'ta cwnd = min(2·cwnd, ssthresh) kuralı), 0.75·W/RTT hızları ve EWMA/DevRTT/Timeout değerleri node ile hesaplandı (verify/SEN2008/08.mjs).

Deftere not kartı

rwnd = RcvBuffer − (LastByteRcvd − LastByteRead) Yoldaki veri = LastByteSent − LastByteAcked ≤ min(cwnd, rwnd) Hız ≤ pencere / RTT 65535 B / 50 ms ≈ 10.49 Mbps Slow start: cwnd 1 MSS, her ACK +1 → her RTT ×2, ssthresh'e kadar Congestion avoidance: her RTT +1 MSS (doğrusal, additive increase) 3 tekrar ACK: fast retransmit. ssthresh = cwnd/2 Tahoe: cwnd = 1, slow start Reno: cwnd = ssthresh + 3, sonra doğrusal Timeout (ikisi de): ssthresh = cwnd/2, cwnd = 1, slow start Ortalama hız ≈ 0.75 · W / RTT (AIMD testere dişi, W/2 ile W arası) EstRTT = 0.875·EstRTT + 0.125·Sample DevRTT = 0.75·DevRTT + 0.25·|Sample − EstRTT| Timeout = EstRTT + 4·DevRTT timeout olunca aralık ×2 Karn: yeniden gönderilen segmentten SampleRTT alma