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

TCP Güvenilirlik Taşımacılığı
TCP protokolünün güvenilir bir taşıma protokolü olduğunu hepimiz biliyoruz, ancak taşımanın güvenilirliğini nasıl sağlıyor?

Güvenilir iletim elde etmek için veri bozulması, kaybı, çoğaltılması ve sıra dışı parçalar gibi birçok faktörün dikkate alınması gerekir. Bu sorunlar çözülemezse, güvenilir iletim elde edilemez.

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 makalede, TCP'nin kayan penceresi, 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 bilinen adıyla Ağ Trafik Kontrolü aslında üreticiler ve tüketiciler arasındaki ince ilişkinin bir tezahürüdür. Muhtemelen bu senaryoyla işte veya mülakatlarda çok karşılaşmışsınızdır. Üreticinin üretme kapasitesi tüketicinin tüketme kapasitesini büyük ölçüde aşarsa, bu kuyruğun sonsuza kadar uzamasına neden olur. Daha ciddi bir durumda, RabbitMQ mesajları çok fazla biriktiğinde, bunun tüm MQ sunucusunun performansının düşmesine neden olabileceğini biliyor olabilirsiniz. Aynısı TCP için de geçerlidir; kontrol edilmezse, ağa çok fazla mesaj gönderilir ve tüketiciler kapasitelerini aşmış olur, üreticiler ise yinelenen mesajlar göndermeye devam eder ve bu da ağın performansını büyük ölçüde etkiler.

Bu olguyu ele almak için TCP, göndericinin alıcının gerçek alım kapasitesine göre gönderilen veri miktarını kontrol etmesi için bir mekanizma sağlar; bu akış kontrolü olarak bilinir. Alıcı bir alma penceresi tutarken, gönderici bir gönderme penceresi tutar. Bu pencerelerin yalnızca tek bir TCP bağlantısı için olduğunu ve tüm bağlantıların bir pencereyi paylaşmadığını belirtmek gerekir.

TCP, bir 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ğuna dair bir gösterge verir. Gönderen, alıcının gerçek kabul kapasitesine göre gönderilen veri miktarını kontrol eder.

Alıcı ana bilgisayar, göndericiye alabileceği verinin boyutunu bildirir ve gönderici bu sınıra kadar gönderir. Bu sınır pencere boyutudur, TCP başlığını hatırladınız mı? Alıcının alabileceği veya almaya istekli olduğu bayt sayısını belirtmek için kullanılan bir alma penceresi alanı vardır.

Gönderici ana bilgisayar, alıcı ana bilgisayarın hala veri kabul edip edemediğini tespit etmek için kullanılan bir pencere araştırma paketini periyodik olarak gönderecektir. Alıcının ara belleği taşma tehlikesi altında olduğunda, pencere boyutu, göndericiye gönderilen veri miktarını kontrol etmesi talimatını vermek için 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 denetimini tanıtmadan önce, alma penceresi ve gönderme penceresine ek olarak, esas olarak göndericinin alma penceresine veri göndermeye hangi oranda başladığı sorununu çözmek için kullanılan bir tıkanıklık penceresinin de olduğunu anlamamız gerekir. Bu nedenle, tıkanıklık penceresi TCP gönderici tarafından da sürdürülür. Çok az veya çok fazla veri göndermek ideal olmadığından, ne kadar veri göndermenin uygun olduğuna karar vermek için bir algoritmaya ihtiyacımız var, dolayısıyla bir tıkanıklık penceresi kavramı.

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

Ağ tıkalı olduğunda, çok sayıda paket gönderilmeye devam edilirse, gecikme ve paket kaybı gibi sorunlara neden olabilir. 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 bir kısır döngüye girebilir ve büyümeye devam edebilir.

Bu nedenle, TCP ağda olup biteni görmezden gelemez. 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ü önerilmektedir. Gönderenin 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.

Sıkışıklık penceresi nedir? Bunun gönderme penceresiyle ne ilgisi var?

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

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

Sıkışıklık penceresi cwnd aşağıdaki gibi değişir:

Ağda herhangi bir tıkanıklık yoksa, yani yeniden iletim zaman aşımı yaşanmazsa tıkanıklık penceresi artar.

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

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

Tıkanıklık penceresine ek olarak, TCP tıkanıklık kontrol algoritmasını tartışmanı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.
Sıkışıklığın Önlenmesi:Tıkanıklık penceresi belirli bir eşiği aştıktan sonra, gönderici tıkanıklık penceresini doğrusal bir şekilde artırarak tıkanıklık penceresinin büyüme hızını yavaşlatır ve ağın aşırı yüklenmesini önler.
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 girer 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, ilk gönderme hızı yaklaşık MSS/RTT bayt/saniyedir. 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 edilebilecek en iyi gönderme hızını bulmak ister.

Yavaş başlatma sürecinde, tıkanıklık penceresi cwnd değeri 1 MSS olarak başlatılacak ve iletilen paket segmenti her onaylandığında, cwnd değeri bir MSS artırılacak, yani cwnd değeri 2 MSS olacak. Bundan sonra, cwnd değeri bir paket segmentinin her başarılı iletimi için iki katına çıkarılacak ve bu böyle devam edecek. Belirli büyüme süreci aşağıdaki şekilde gösterilmiştir.

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

Ancak, gönderme oranı her zaman artamaz; büyümenin bir noktada sona ermesi gerekir. Peki, gönderme oranı artışı ne zaman sona erer? Yavaş başlangıç ​​genellikle gönderme oranındaki artışı birkaç şekilde sonlandırır:

İlk yol, yavaş başlangıç ​​gönderme işlemi sırasında paket kaybı durumudur. Bir paket kaybı meydana geldiğinde, TCP göndericinin tıkanıklık penceresi cwnd'yi 1'e ayarlar ve yavaş başlangıç ​​işlemini yeniden başlatır. Bu noktada, başlangıç ​​değeri paket kaybı oluşturan cwnd değerinin yarısı olan yavaş başlangıç ​​eşiği ssthresh kavramı tanıtılır. Yani, tıkanıklık algılandığında, ssthresh değeri pencere değerinin yarısıdır.

İkinci yol, yavaş başlatma eşiği ssthresh değeriyle doğrudan ilişki kurmaktır. Ssthresh değeri, tıkanıklık algılandığında pencere değerinin yarısı olduğundan, cwnd ssthresh'ten büyük olduğunda her iki katına çıkmada paket kaybı meydana gelebilir. Bu nedenle, cwnd'yi ssthresh'e ayarlamak en iyisidir; bu, TCP'nin tıkanıklık kontrol moduna geçmesine ve yavaş başlatmayı sonlandırmasına neden olur.

Yavaş başlangıcın sonlanma yolu, üç yedekli onayın algılanması durumunda TCP'nin hızlı bir yeniden iletim gerçekleştirmesi ve kurtarma durumuna girmesidir. (Üç ACK paketinin neden olduğu açık değilse, yeniden iletim mekanizmasında ayrı olarak açıklanacaktır.)

Sıkışıklıktan Kaçınma
TCP tıkanıklık kontrol durumuna girdiğinde, cwnd tıkanıklık eşiği ssthresh'in yarısına ayarlanır. Bu, cwnd değerinin her paket segmenti alındığında iki katına çıkarılamayacağı anlamına gelir. Bunun yerine, her iletim tamamlandıktan sonra cwnd değerinin yalnızca bir MSS (maksimum paket segment uzunluğu) artırıldığı nispeten muhafazakar bir yaklaşım benimsenir. Örneğin, 10 paket segmenti onaylansa bile, cwnd değeri yalnızca bir MSS 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 yedek ACK yanıtı alındığında MSS'nin büyümesini de durduracaktır. cwnd değeri yarıya indirildikten sonra hala üç yedek ack alınırsa, ssthresh değeri cwnd değerinin yarısı olarak kaydedilir ve hızlı kurtarma durumuna girilir.

Hızlı İyileşme
Hızlı Kurtarma durumunda, tıkanıklık penceresi cwnd değeri, alınan her yedek ACK, yani sırayla gelmeyen ACK için bir MSS kadar artırılır. Bu, ağda başarıyla iletilen paket segmentlerinden yararlanarak iletim verimliliğini mümkün olduğunca artırmak içindir.

Kayıp paket segmentinin bir ACK'si geldiğinde, TCP cwnd değerini azaltır ve ardından tıkanıklık önleme durumuna girer. Bu, tıkanıklık penceresinin boyutunu kontrol etmek ve ağ tıkanıklığını daha fazla artırmaktan kaçınmak 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ı, iletim hızını ve ağ tıkanıklığı derecesini dengelemek için ağ kurtarıldıktan sonra tıkanıklık penceresinin boyutunu kademeli olarak artırmaktır.

Özet
Güvenilir bir taşıma protokolü olarak TCP, sıra numarası, onay, yeniden iletim kontrolü, bağlantı yönetimi ve pencere kontrolü ile güvenilir taşıma uygular. Bunlar arasında akış kontrol mekanizması, göndericinin gönderdiği veri miktarını alıcının gerçek alma kapasitesine göre kontrol eder ve bu da 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 boyutunu dinamik olarak ayarlayarak kontrol edilir. Yavaş başlatma, tıkanıklıktan kaçınma ve hızlı kurtarma, ağın kapasitesine ve tıkanıklık derecesine uyum sağlamak için farklı stratejiler aracılığıyla tıkanıklık penceresinin boyutunu ayarlayan TCP tıkanıklık kontrol algoritmasının üç ana parçasıdır.

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. Kaybolan, bozulan veya geciken verileri yeniden ileterek verilerin güvenilir bir şekilde iletilmesini sağlar. Yeniden iletim mekanizmasının uygulama ilkesi ve stratejisi bir sonraki bölümde tanıtılacak ve ayrıntılı olarak analiz edilecektir. Takipte kalın!


Gönderi zamanı: 24-Şub-2025