Mertcan GÖKGÖZ
Takip Et
Linux Hacısı, Sistem Uzmanı
· 4 dak. Okunur

Bufferbloat nedir? Ne işe yarar? Çözümü Nedir?

Bufferbloat, paketlerin aşırı arabelleğe alınmasının neden olduğu paket anahtarlamalı ağlarda yüksek gecikme oranlarının olmasına neden olan bir durumdur. Bufferbloat ayrıca paket gecikme değişimine (jitter olarak da bilinir) neden olur ve genel ağ trafiğini de azaltması ile bilinir.

Bir yönlendirici veya anahtarlama cihazı aşırı büyük arabellekleri kullanacak şekilde yapılandırıldığında, çok yüksek hızlı ağlar bile olsa, VoIP, çevrimiçi oyun ve hatta sıradan web gezintisi gibi birçok interaktif uygulama için kullanılamaz hale gelir. Türkiyede son zamanlarda gördüğümüz saçmalıklara benzer bu durum. Yapmak istediğinizi yapmaya çalışırsınız ama yavaşladığından dolayı yapamazsınız.

bufferbloat-alcatel-lucent-gorsel

Bazı iletişim ekipmanları üreticileri(Cisco, Alcatel, Extreme, EnteraSys vb) ağ ürünlerinin bazılarına gereksiz yere büyük tamponlar tasarladı hatta bunun sonucunda özel kurumsal çözümler diyerek sattılar.

Bu tür donanımlarda bufferbloat, bir ağ bağlantısı tıkanık olduğunda ortaya çıkar ve paketlerin büyük boyutlu arabelleklerde uzun süreler boyunca sıraya sokulmasına neden olur.

İlk giriş ile ilk çıkışlı kuyruklama sisteminde, aşırı büyük tamponlar daha uzun kuyrukların oluşmasına ve daha yüksek gecikme ile sonuçlanır ve ağ akışını iyileştirmez.

Arabellekleme

Ağ ekipman üreticileri için belirlenmiş bir takım kurallar bulunur bunlardan biride elbette arabellek boyutunun minimum ne kadar olacağıdır, bir cihazdan geçen bir trafik akışı için en az 250 ms'lik arabelleğe almaya uyum sağlayacak kadar büyüklük sağlamalıdır.

Örneğin, yönlendiricinin Gigabit Ethernet bağlantısı büyük bir 32 MB arabellek gerektirir. Arabelleğin bu şekilde boyutlandırılması ki bir bakıma önerilir bir bakıma önerilmez, TCP tıkanıklığı kontrol algoritmasının başarısızlığına neden olabilir, yüksek ve değişken gecikme gibi sorunlara neden olur ve arabellek bir TCP akışının paketleriyle tamamen dolduğunda diğer tüm akışlar için ağ boğazlaması oluşturur ve internetin kullanılmasını engeller.

Arabellek daha sonra, TCP bağlantısını aradaki tüm bağlantılar hızlanana kadar yükseltir ve belleği tekrar doldurmadan önce boşaltmak için biraz zaman harcar. Tamamen doldur boşalt mantığı güdülmektedir.

cmtsrtt-bufferbloat-ms-time-cost

Büyük boyutlu bellekleme işlemi, yalnızca arabelleğe aldıkları bağlantı bir tıkanıklık haline geldiğinde zararlı etkiye sahiptir ki bu durum çoğu zaman gerçekleşir.

Başka bir ana bilgisayardan veya başka bir ana bilgisayara giden rota üzerindeki mevcut tıkanıklık düzelmedikçe, çoğu işletim sisteminin sağladığı ping uygulamasını kullanarak arabelleğin dolup dolmadığını kontrol etmek mümkündür.

kotu-huylu-bufferbloat

Öncelikli olarak, test edecek kişi karşı bilgisayara sürekli ping atmalıdır daha sonra birkaç saniyelik bir indirme işlemi başlatılmalı ve birkaç kez bu işlem durdurulmalıdır.

Tasarım gereği, TCP tıkanıklığı önleme algoritması(TCP congestion control), rotadaki tıkanıklığı hızla dolduracaktır. Karşıdan indirme (ve sırasıyla yükleme), ping tarafından bildirilen gidiş dönüş süresinin doğrudan ve önemli bir artışıyla ilişkilendirilirse, sırasıyla karşıdan indirme (ve yükleme) işlemleri geçerli arabelleğin şiştiğini gösterir.

Gidiş dönüş süresinin artmasına darboğazdaki arabelleklemeden kaynaklandığı için aradaki azami artış, milisaniye cinsinden büyüklüğünün kabaca bir tahminini verecektir.

mtr-gorsel-1

Önceki örnekte direk olarak basit pingleme yerine gelişmiş bir traceroute aracını (örneğin, MTR) kullanırsak, darboğazda dolmuş bir arabellek varlığını değil, aynı zamanda ağdaki konumunu da görebileceğiz. Traceroute, bunu şebeke genelinde rota (path) görüntüleyerek ve paketlerin geçiş gecikmelerini ölçerek başarır. Güzergah geçmişi, ardışık her ana bilgisayardan alınan güzergahtaki paketlerin gidiş-dönüş süreleri olarak kaydedilir.

Bu rotalarda fark edilen düzde değerinde her kayıp kullandığınız internetin hat kalitesinide doğrudan etkilemektedir.

Buradan gayrettepe POP noktasına selamlar

Bufferbloat İşleyişi

CUBIC gibi TCP tıkanıklığı kontrol algoritmaları(TCP congestion control), kullanılabilir bant genişliğini belirlemek için paket kayıplarının(loss) ölçülmesine dayalıdır. Algoritmalar, paketlerde kayıplar yaşanana kadar veri aktarımını hızlandırır, ardından iletim hızını yavaşlatır. İdeal olarak, iletim hızını, bir denge hızına ulaşana kadar hızlandırmaya devam eder.

tcp-cubic-gorsel-1

Ancak bunun çalışması için, paket kayıpları(loss) ile ilgili geribildirim olmalıdır, algoritmaların uygun bir aktarım hızı seçebilmesi için herşeyin zamanında gerçekleşmesi gerekir. Dolmuş büyük bir arabellekle paketler varış yerlerine ulaşacak, ancak gecikme daha uzun olacaktır. Bu nedenle uplink tamamen dolduktan sonra TCP yavaşlamalı ve tamponu daha da fazla doldurmalı. Yeni gelen paketler, yalnızca arabellek tamamen dolmuş olduğunda paket kayıpları(loss) oluşur. TCP bile bağlantı yolunun değişip değişmediğine kendisi karar verebilir ve yeni bir çalışma noktası için daha agresif arayışlar içerisine girer.

tcp_ladder_states_flow_state

Paketler iletilmeden önce bir ağ arabelleği içinde sıralanır; sıkıntılı durumlarda, paketler yalnızca arabellek dolduğunda kabul edilmemeye başlar ve paket kayıpları(loss) oluşur.(Gayet doğal)

Daha eski yönlendiricilerde, arabellekler oldukça küçüktü dolayısıyla hızlı bir şekilde arabellek dolar ve dolayısıyla bağlantı tamamen dolmuş hale geldikten kısa bir süre sonra paketlerde kayıplar(loss) olmaya başlardı, bu nedenle TCP protokolü ayarlanabilir bir haldeydi ve sorun belirginleşmiyordu. Yeni yönlendiricilerde, arabellekler, birkaç megabayt veri tutmak için yeterince büyük bir hale getirildiği için arabelleğin boşaltılması için gerekenler saniye cinsinden zaman miktarlarına dönüşmeye başladı. Bir bağlantıdaki bant genişliğini paylaşan TCP algoritmasına, iletim kanalı dolmuş olan kayıba(loss) uğrayan paketlere sahip olmasına bağlı olarak çok yavaş tepki vermesine neden olur işte boğazlama dediğimiz o saçma durumda burada oluşur.

ping-tepki-sureleri-bufferbloat

Sorun ayrıca diğer protokolleri de dolaylı yoldan etkiler. Tek bir sıra halinde uygulanan basit bir arabellekten geçen tüm paketler aynı gecikmeye maruz kalır; dolayısıyla dolmuş bir arabellek üzerinden geçen tüm bağlantıların gecikmesi eş zamanlı olarak etkilenir.

Zaten dolu bir arabellekteki bazı alanlar için yarışan eşzamanlı bağlantılar arasındaki çekişmeden kaynaklanan yavaşlama, hedeflere ulaşmayı bekleyen verilerle tıkanmış arabelleklerden dolayı hızlı hedeflere ulaşılamayacağı için kullanılabilir kanal bant genişliğini de kullanılmaz hale getirir.

Bu ayrıca UDP, VoIP ve oyunlar gibi gecikmeye duyarlı uygulamalarda kullanılan diğer datagram protokollerini de dahil olmak üzere diğer ağ protokollerini kullanan uygulamaların etkileşimini azaltır ping yükselmelerine ve gecikmelere neden olur. Aşırı şekilde gerçekleştiği zamanlarda, bufferbloat, DNS gibi önemli protokollerde de hatalara neden olarak bağlantı kalitesini %90 oranda etkilemektedir.

Çözümlerimiz

Genel olarak çözümlerimiz iki kategoriye ayrılabilir çeşitli teknik çözümler mevcuttur, ağa yön veren çözümler ve uç noktaları hedefleyen çözümler olarak ayırabiliriz.

Bu tür çözümler çoğunlukla tamamlayıcı niteliktedir.

  • CoDel(controlled delay) ve PIE gibi AQM(Active queue management) algoritmaları.
  • Hybrid AQM ve paket planlama algoritmaları, örneğin FQ-CoDel. 1
  • Kablo modemlerinde daha akıllı tampon kontrolü sağlamak için DOCSIS standardında yapılan değişiklikler.
  • Sıra yönetiminin Linux işletim sisteminin WiFi alt sistemine entegrasyonu 1

Yapılanlar neticesinde gerçekleşebilecek iyi huylu bufferbloat şu şekildedir.

iyi-huylu-bufferbloat

Kullanıcıyı hedefleyen önemli faktörler şunlardır.

  • TCP için BBR(Bottleneck Bandwidth) tıkanıklık kontrol algoritması.
  • Birçok BitTorrent kullanıcısı tarafından kullanılan μTP protokolü
  • Basit HTTP protokolü yerine HTTP bağlantı kurma veya HTTP/2 gibi daha az bağlantı kullanma teknikleri.

Çoğu son kullanıcı için, evdeki yönlendiriciyi sabitleyerek en büyük gelişme sağlanabilir. Teknik düzeltmelerin çoğu, Linux işletim sisteminin son sürümlerine dahil edilmiştir.

Devamı için : BufferBloat Projects