TCP'nin gizli silahı: Ağ Akış Kontrolü ve Ağ Tıkanıklık Kontrolü

TCP Güvenilirlik Taşıma
TCP protokolünü güvenilir bir taşıma protokolü olarak hepimiz biliyoruz, peki bu protokol taşımanın güvenilirliğini nasıl sağlıyor?

Güvenilir iletim sağlamak için veri bozulması, kayıp, çoğaltma ve sıralı olmayan parçalar gibi birçok faktörün dikkate alınması gerekir. Bu sorunlar çözülemezse, güvenilir iletim sağlanamaz.

Bu nedenle TCP, güvenilir iletimi sağlamak için sıra numarası, onay yanıtı, yeniden gönderme kontrolü, bağlantı yönetimi ve pencere kontrolü gibi mekanizmalar kullanır.

Bu yazıda, TCP'nin kayan pencere, akış kontrolü ve tıkanıklık kontrolüne odaklanacağız. Yeniden iletim mekanizması bir sonraki bölümde ayrı olarak ele alınacaktır.

Ağ Akışı Kontrolü
Ağ Akış Kontrolü veya diğer adıyla Ağ Trafik Kontrolü, aslında üreticiler ve tüketiciler arasındaki incelikli ilişkinin bir tezahürüdür. Bu senaryoyla muhtemelen iş yerinde veya mülakatlarda sık sık karşılaşmışsınızdır. Üreticinin üretim kapasitesi, tüketicinin tüketim kapasitesini büyük ölçüde aşarsa, kuyruk süresiz olarak büyür. Daha ciddi bir durumda, RabbitMQ mesajlarının çok fazla birikmesinin tüm MQ sunucusunun performansını düşürebileceğini biliyor olabilirsiniz. TCP için de aynı durum geçerlidir; kontrol edilmezse, ağa çok fazla mesaj gönderilir ve tüketiciler kapasitelerini aşarken, üreticiler yinelenen mesajlar göndermeye devam eder, bu da ağ performansını büyük ölçüde etkiler.

Bu olguyu ele almak için TCP, göndericiye alıcının gerçek alım kapasitesine bağlı olarak gönderilen veri miktarını kontrol etme mekanizması sağlar; bu mekanizma akış kontrolü olarak bilinir. Alıcı bir alım penceresi, gönderici ise bir gönderim penceresi tutar. Bu pencerelerin yalnızca tek bir TCP bağlantısı için geçerli olduğunu ve tüm bağlantıların aynı pencereyi paylaşmadığını belirtmek gerekir.

TCP, alma penceresi için bir değişken kullanarak akış kontrolü sağlar. Alma penceresi, göndericiye ne kadar önbellek alanının hala kullanılabilir olduğunu gösterir. Gönderici, alıcının gerçek kabul kapasitesine göre gönderilen veri miktarını kontrol eder.

Alıcı sunucu, göndericiye alabileceği verinin boyutunu bildirir ve gönderici bu sınıra kadar veri gönderir. Bu sınır, TCP başlığındaki pencere boyutudur; hatırlarsanız, alıcının alabileceği veya almak istediği bayt sayısını belirtmek için kullanılan bir alma penceresi alanı vardır.

Gönderen sunucu, alıcı sunucunun hala veri kabul edip edemediğini tespit etmek için periyodik olarak bir pencere yoklama paketi gönderir. Alıcının tamponunun taşma tehlikesiyle karşı karşıya kaldığı durumlarda, gönderene gönderilen veri miktarını kontrol etmesi için pencere boyutu daha küçük bir değere ayarlanır.

İşte bir Ağ Akış Kontrolü diyagramı:

Trafik Kontrolü

Ağ Tıkanıklığı Kontrolü
Tıkanıklık kontrolünü tanıtmadan önce, alma penceresi ve gönderme penceresine ek olarak, esas olarak göndericinin alma penceresine hangi hızda veri göndermeye başlayacağı sorununu çözmek için kullanılan bir tıkanıklık penceresi olduğunu anlamamız gerekir. Bu nedenle, tıkanıklık penceresi de TCP göndericisi tarafından korunur. Çok az veya çok fazla veri göndermek ideal olmadığından, ne kadar veri göndermenin uygun olduğuna karar verecek bir algoritmaya ihtiyacımız var; işte bu yüzden tıkanıklık penceresi kavramı ortaya çıkmıştır.

Önceki ağ akışı kontrolünde, göndericinin alıcının önbelleğini veriyle doldurmasını engelledik, ancak ağda neler olup bittiğini bilmiyorduk. Tipik olarak, bilgisayar ağları paylaşımlı bir ortamdadır. Sonuç olarak, diğer ana bilgisayarlar arasındaki iletişim nedeniyle ağda tıkanıklık olabilir.

Ağ tıkandığında, çok sayıda paketin sürekli olarak gönderilmesi gecikme ve paket kaybı gibi sorunlara yol açabilir. Bu noktada TCP verileri yeniden iletir, ancak yeniden iletim ağ üzerindeki yükü artırarak daha büyük gecikmelere ve daha fazla paket kaybına neden olur. Bu durum kısır bir döngüye dönüşebilir ve giderek büyüyebilir.

Dolayısıyla TCP, ağda olup bitenleri göz ardı edemez. Ağ tıkandığında, TCP gönderdiği veri miktarını azaltarak kendini feda eder.

Bu nedenle, göndericiden gelen verilerle tüm ağın dolmasını önlemeyi amaçlayan tıkanıklık kontrolü önerilmiştir. Göndericinin göndermesi gereken veri miktarını düzenlemek için TCP, tıkanıklık penceresi adı verilen bir kavram tanımlar. Tıkanıklık kontrol algoritması, gönderici tarafından gönderilen veri miktarını kontrol etmek için tıkanıklık penceresinin boyutunu ağın tıkanıklık derecesine göre ayarlayacaktır.

Tıkanıklık penceresi nedir? Bunun gönderme penceresiyle ne ilgisi var?

Ağ tıkanıklığı penceresi, gönderici tarafından tutulan ve göndericinin gönderebileceği veri miktarını belirleyen bir durum değişkenidir. Ağ tıkanıklığı penceresi, ağın tıkanıklık seviyesine göre dinamik olarak değişir.

Gönderme Penceresi, gönderici ve alıcı arasında kararlaştırılan ve alıcının alabileceği veri miktarını gösteren bir pencere boyutudur. Tıkanma penceresi ve gönderme penceresi birbiriyle ilişkilidir; gönderme penceresi genellikle tıkanma ve alma pencerelerinin minimumuna eşittir, yani swnd = min(cwnd, rwnd).

Yoğunluk penceresi cwnd aşağıdaki gibi değişir:

Ağda tıkanıklık yoksa, yani yeniden iletim zaman aşımı oluşmuyorsa, tıkanıklık penceresi artar.

Ağda tıkanıklık varsa, tıkanıklık penceresi azalır.

Gönderici, belirtilen süre içinde ACK onay paketinin alınıp alınmadığını gözlemleyerek ağın yoğun olup olmadığını belirler. Gönderici, belirtilen süre içinde ACK onay paketini almazsa, ağın yoğun olduğu kabul edilir.

Tıkanıklık penceresine ek olarak, TCP tıkanıklık kontrol algoritmasını ele almanın zamanı geldi. TCP tıkanıklık kontrol algoritması üç ana bölümden oluşur:

Yavaş Başlangıç:Başlangıçta, cwnd tıkanıklık penceresi nispeten küçüktür ve gönderici, ağın kapasitesine hızla uyum sağlamak için tıkanıklık penceresini üstel olarak artırır.
Trafik Sıkışıklığından Kaçınma:Ağ tıkanıklığı penceresi belirli bir eşiği aştıktan sonra, gönderici tıkanıklık penceresinin büyüme hızını yavaşlatmak ve ağın aşırı yüklenmesini önlemek için tıkanıklık penceresini doğrusal bir şekilde artırır.
Hızlı İyileşme:Eğer tıkanıklık oluşursa, gönderici tıkanıklık penceresini yarıya indirir ve alınan yinelenen onaylar aracılığıyla ağ kurtarma konumunu belirlemek için hızlı kurtarma durumuna geçer ve ardından tıkanıklık penceresini artırmaya devam eder.

Yavaş Başlangıç
Bir TCP bağlantısı kurulduğunda, tıkanıklık penceresi cwnd başlangıçta minimum MSS (maksimum segment boyutu) değerine ayarlanır. Bu şekilde, başlangıçtaki gönderme hızı yaklaşık MSS/RTT bayt/saniye olur. Gerçekte kullanılabilir bant genişliği genellikle MSS/RTT'den çok daha büyüktür, bu nedenle TCP, yavaş başlatma yoluyla elde edilebilen en uygun gönderme hızını bulmak ister.

Yavaş başlatma işleminde, tıkanıklık penceresi cwnd değeri 1 MSS olarak başlatılır ve iletilen paket segmenti her onaylandığında, cwnd değeri bir MSS artırılır, yani cwnd değeri 2 MSS olur. Bundan sonra, her başarılı paket segmenti iletimi için cwnd değeri ikiye katlanır ve bu şekilde devam eder. Spesifik büyüme süreci aşağıdaki şekilde gösterilmiştir.

 Ağ tıkanıklığı kontrolü

Ancak, gönderim oranı her zaman artamaz; bu artışın bir noktada sona ermesi gerekir. Peki, gönderim oranındaki artış ne zaman sona erer? Yavaş başlangıç ​​stratejisi, gönderim oranındaki artışı genellikle birkaç şekilde sonlandırır:

İlk yöntem, yavaş başlatma işleminin gönderimi sırasında paket kaybı durumudur. Paket kaybı meydana geldiğinde, TCP göndericinin tıkanıklık penceresi cwnd'yi 1'e ayarlar ve yavaş başlatma işlemini yeniden başlatır. Bu noktada, paket kaybına neden olan cwnd değerinin yarısı olan bir yavaş başlatma eşiği ssthresh kavramı ortaya çıkar. Yani, tıkanıklık tespit edildiğinde, ssthresh değeri pencere değerinin yarısıdır.

İkinci yöntem, doğrudan yavaş başlatma eşiği ssthresh değeriyle ilişkilendirmektir. Tıkanıklık tespit edildiğinde ssthresh değeri pencere değerinin yarısı olduğundan, cwnd ssthresh'ten büyük olduğunda her iki katına çıktığında paket kaybı meydana gelebilir. Bu nedenle, TCP'nin tıkanıklık kontrol moduna geçmesine ve yavaş başlatmayı sonlandırmasına neden olacak şekilde cwnd'yi ssthresh'e ayarlamak en iyisidir.

Yavaş başlatmanın sona ermesinin son yolu, üç gereksiz onay paketinin tespit edilmesidir; bu durumda TCP hızlı bir yeniden iletim gerçekleştirir ve kurtarma durumuna geçer. (Üç onay paketinin neden olduğu açık değilse, yeniden iletim mekanizmasında ayrıntılı olarak açıklanacaktır.)

Trafik Sıkışıklığından Kaçınma
TCP tıkanıklık kontrol durumuna girdiğinde, cwnd değeri tıkanıklık eşiği ssthresh'in yarısına ayarlanır. Bu, cwnd değerinin her paket segmenti alındığında ikiye katlanamayacağı anlamına gelir. Bunun yerine, her iletim tamamlandıktan sonra cwnd değerinin yalnızca bir MSS (maksimum paket segmenti uzunluğu) kadar artırıldığı nispeten muhafazakar bir yaklaşım benimsenir. Örneğin, 10 paket segmenti onaylansa bile, cwnd değeri yalnızca bir MSS kadar artacaktır. Bu doğrusal bir büyüme modelidir ve büyüme üzerinde bir üst sınırı da vardır. Paket kaybı meydana geldiğinde, cwnd değeri bir MSS'ye değiştirilir ve ssthresh değeri cwnd'nin yarısına ayarlanır. Veya 3 gereksiz ACK yanıtı alındığında MSS'nin büyümesi de durdurulur. cwnd değeri yarıya indirildikten sonra hala üç gereksiz ACK alınırsa, ssthresh değeri cwnd'nin yarısı olarak kaydedilir ve hızlı kurtarma durumuna girilir.

Hızlı İyileşme
Hızlı Kurtarma durumunda, ardışık olmayan her bir gereksiz ACK için tıkanıklık penceresi cwnd değeri bir MSS artırılır. Bu, ağda başarıyla iletilen paket segmentlerinden en iyi şekilde yararlanarak iletim verimliliğini mümkün olduğunca artırmak içindir.

Kayıp paket segmentine ait bir ACK (onay) geldiğinde, TCP cwnd değerini düşürür ve ardından tıkanıklık önleme durumuna geçer. Bu, tıkanıklık penceresinin boyutunu kontrol etmek ve ağ tıkanıklığının daha da artmasını önlemek içindir.

Tıkanıklık kontrol durumundan sonra bir zaman aşımı meydana gelirse, ağ durumu daha ciddi hale gelir ve TCP, tıkanıklık önleme durumundan yavaş başlatma durumuna geçer. Bu durumda, tıkanıklık penceresi cwnd değeri 1 MSS (maksimum paket segment uzunluğu) olarak ayarlanır ve yavaş başlatma eşiği ssthresh değeri cwnd'nin yarısı olarak ayarlanır. Bunun amacı, ağ toparlandıktan sonra iletim hızı ve ağ tıkanıklığı derecesi arasında denge sağlamak için tıkanıklık penceresinin boyutunu kademeli olarak yeniden artırmaktır.

Özet
Güvenilir bir taşıma protokolü olarak TCP, sıra numarası, onaylama, yeniden iletim kontrolü, bağlantı yönetimi ve pencere kontrolü ile güvenilir taşımayı uygular. Bunlar arasında, akış kontrol mekanizması, alıcının gerçek alım kapasitesine göre gönderici tarafından gönderilen veri miktarını kontrol ederek ağ tıkanıklığı ve performans düşüşü sorunlarını önler. Tıkanıklık kontrol mekanizması, gönderici tarafından gönderilen veri miktarını ayarlayarak ağ tıkanıklığının oluşmasını önler. Tıkanıklık penceresi ve gönderme penceresi kavramları birbirleriyle ilişkilidir ve göndericideki veri miktarı, tıkanıklık penceresinin boyutunun dinamik olarak ayarlanmasıyla kontrol edilir. Yavaş başlatma, tıkanıklığı önleme ve hızlı kurtarma, TCP tıkanıklık kontrol algoritmasının üç ana bölümüdür ve ağın kapasitesine ve tıkanıklık derecesine uyum sağlamak için farklı stratejilerle tıkanıklık penceresinin boyutunu ayarlar.

Bir sonraki bölümde, TCP'nin yeniden iletim mekanizmasını ayrıntılı olarak inceleyeceğiz. Yeniden iletim mekanizması, güvenilir iletimi sağlamak için TCP'nin önemli bir parçasıdır. Kayıp, bozulmuş veya gecikmiş verileri yeniden ileterek verilerin güvenilir bir şekilde iletilmesini sağlar. Yeniden iletim mekanizmasının uygulama prensibi ve stratejisi bir sonraki bölümde ayrıntılı olarak tanıtılacak ve analiz edilecektir. Takipte kalın!


Yayın tarihi: 24 Şubat 2025