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.
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:
- Gönderen pencere = min(cwnd, rwnd). Biri alıcıdan, biri ağdan gelir.
- Slow start ikiye katlar, congestion avoidance 1 ekler. Geçiş noktası ssthresh.
- Kayıpta ssthresh = cwnd / 2. Her iki sürümde, her iki kayıp türünde.
- Timeout’ta cwnd = 1. Tahoe üç tekrar ACK’de de 1’e iner; Reno ssthresh + 3’e iner.
- 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:
Gönderen de yolda olan veriyi bu değerin altında tutar:
Çö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 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 olur.
Üç evre var:
| Evre | Kural | Bir RTT’de değişim |
|---|---|---|
| Slow start | Her ACK’te cwnd += 1 MSS | ×2 |
| Congestion avoidance | Her ACK’te cwnd += MSS·(MSS/cwnd) | +1 MSS |
| Fast recovery (Reno) | Üç tekrar ACK sonrası | cwnd = ssthresh + 3, sonra doğrusal |
Kayıp tepkileri:
| Olay | ssthresh | Tahoe cwnd | Reno cwnd |
|---|---|---|---|
| 3 tekrar ACK (triple duplicate ACK) | cwnd / 2 | 1 MSS | ssthresh + 3 MSS |
| Timeout | cwnd / 2 | 1 MSS | 1 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ı :
Çö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:
Çö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üşünce | Doğ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 = cwnd | Pencere = 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 iner | Timeout’ta Reno da cwnd = 1 |
| Tahoe üç tekrar ACK’de yarıya iner | Tahoe 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ür | Karn: ölçülmez |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
A TCP receiver has RcvBuffer = 16384 bytes, LastByteRcvd = 31000 and LastByteRead = 22000. What rwnd does it advertise?
Cevabı göster
Tamponda bekleyen, uygulamanın henüz okumadığı veri: 31000 − 22000 = 9000 bayt.
rwnd = RcvBuffer − (LastByteRcvd − LastByteRead) = 16384 − 9000 = 7384 bayt.
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
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.
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
Her RTT'de en fazla bir pencere gönderilir: hız . bit/s ≈ 10.49 Mbps. Hattın kapasitesi ne olursa olsun bu sınırı aşamazsın.
During slow start (no losses), how does cwnd change?
- It increases by 1 MSS per RTT
- It doubles every RTT (increases by 1 MSS per ACK)
- It halves every RTT
- It stays constant until a timeout
Cevabı göster
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.
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
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 MSS'e RTT'de ulaşılır: .
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
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.
Same scenario as before but with TCP Tahoe. What is cwnd in round 20?
Cevabı göster
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.
Why does TCP Reno react more mildly to a triple duplicate ACK than to a timeout?
- Duplicate ACKs mean the receiver's buffer is full
- Duplicate ACKs show later segments are still getting through, so congestion is mild; a timeout suggests heavier congestion
- A timeout only happens with UDP
- Duplicate ACKs are ignored by Reno
Cevabı göster
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.
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
W bayt cinsinden: 20 × 1460 = 29200 bayt = 233600 bit. 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.
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
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.
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
Ö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.
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
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).