Ana içeriğe geç

Bölüm 37:Kuyruk Yönetimi

8 dakikalık okumaGüncelleme:

Ağlar'a “Sen”i Katmak yazısının parçası: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine kadar inen uzun bir teknik yolculuk.

Tüm bölümler
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. Önbellek, Tazelik ve Güven
  6. Port Numarası ve Soket
  7. Bağlantısız Taşıma: UDP
  8. Üç Adımlı El Sıkışma
  9. Simetrik Şifreleme
  10. Açık Anahtarlı Kriptografi
  11. TLS El Sıkışması
  12. Sertifika Zinciri
  13. HTTP Mesajının Anatomisi
  14. Durum, Çerez ve Oturum
  15. HTTP/2'den HTTP/3'e
  16. İçerik Dağıtım Ağları
  17. Diğer Uygulama Protokolleri
  18. Katmanlı Mimari
  19. Kapsülleme ve Başlıklar
  20. Paket Yakalama ve Çözümleme
  21. Ağ Arayüz Kartı
  22. Fiziksel Adresleme
  23. Hata Sezme ve CRC
  24. Adres Çözümleme: ARP
  25. Anahtarlama ve Ortam Erişimi
  26. Ağ Topolojileri
  27. Sanal Yerel Ağlar
  28. Kablosuz Erişim: 802.11
  29. Radyo Kanalı ve Kapasite
  30. Kablosuz Ağ Güvenliği
  31. Hücresel Ağlar
  32. Spektrum ve Kuşaklar
  33. Hareketlilik ve Aktarma
  34. Adres Kiralama: DHCP
  35. Adresin Anatomisi
  36. Adres Tükenmesi ve IPv6
  37. Yönlendirici Mimarisi
  38. Kuyruk Yönetimi
  39. Cihaz Yapılandırma
  40. Yönlendirme Protokolleri
  41. Kontrol Düzlemi ve SDN
  42. Ağ İzleme ve Yönetimi
  43. Alanlar Arası Yönlendirme
  44. Adres Çevirisi
  45. Ara Kutular
  46. Tünelleme ve IPsec
  47. Güvenlik Duvarları
  48. Operatör ve Metro Ağları
  49. Bitten Sinyale
  50. Çoklama Teknikleri
  51. İletim Ortamları
  52. Kablo Sonlandırma
  53. Fiber Optik İletim
  54. Bakır Erişim Ağı: DSL
  55. Pasif Optik Ağlar
  56. Kablo Erişim Ağları
  57. Denizaltı Kabloları
  58. Veri Merkezi Ağları
  59. Kapsülleme Çözme
  60. Güvenilir Aktarım
  61. Tıkanıklık Denetimi
  62. Trafik Çözümleme
  63. Gecikme Bütçesi
  64. Son Söz

Yönlendirici çıkış hattını seçti. Paket şimdi o hattın önünde bekliyor, ve önünde başkaları var.

Hangisinin önce gideceğini kablo belirlemiyor. Sırayı bir politika kuruyor, kararı da o politikayı işleten küçük bir zamanlayıcı veriyor. Peki hangi politika?

Kuyruk ne zaman büyüyor?

Bir hattın önünde kuyruk oluşmasının tek bir sebebi var ve kulağa fazla basit geliyor: gelen bit hızı, o hattın gönderebildiği bit hızını bir süre boyunca aşıyor. Fark biriktikçe kuyruk uzuyor. Varış hızı geri düşünce kuyruk boşalıyor. Kuyruk kalıcı bir hâl değil; geçici bir taşkının deposu.

Bir düğümdeki gecikmeyi dört kaleme ayırmıştım: işleme, kuyruk, iletim ve yayılma. Bunlardan yalnızca kuyruk kalemi trafikle birlikte değişiyor. İşleme gecikmesi, yani bit hatası denetimi ile çıkış hattının belirlenmesi, mikrosaniyenin altında kalıyor. Bunu aklında tut: yönlendiricide harcanan zamanın büyük kısmı sırada beklemekten geliyor, hesaplamadan değil.

Kuyruğun ne kadar büyüyeceğini tek bir oranda toplayabiliyorsun. Paket uzunluğu ile ortalama varış hızını çarpıp hattın bit iletim hızına bölüyorsun. Oran sıfıra yakınken ortalama kuyruk gecikmesi küçük kalıyor. Ama 1’e yaklaştıkça gecikmenin düz bir çizgi izlemediğini, keskin biçimde tırmandığını göreceksin; 1’i geçtiği yerde gelen iş hizmet edilebilenden fazla oluyor ve ortalama gecikme sonsuza gidiyor.

Hesabı bir örnek üzerinden yürütelim. 1.500 baytlık paketler 100 Mbit/s’lik bir hatta saniyede 8.000 kez geliyor. Paket başına 12.000 bit demek, tek paketin iletimi ise 120 µs sürüyor. Bu girdilerle oran 0,96 çıkıyor. Hat teknik olarak yetiyor — kâğıt üstünde kapasitenin %4’ü bile boşta — ama kuyruk çoktan tırmanmaya başlamış oluyor. Kapasite planlamasında “yetiyor” ile “rahat” arasındaki fark tam olarak burada.

Kuyruğun kapasitesi de sonlu olduğu için sonu belli: dolu kuyruğa varan paket düşürülüyor. O paketi bir önceki düğüm ya da kaynak uç yeniden gönderebiliyor, ya da hiç göndermiyor. Otoyol benzetmesinde giriş rampasındaki bekleme kuyruk gecikmesine karşılık geliyordu. Benzetme tam burada bitiyor: sıkışan araç eninde sonunda geçer, silinen paket geçmez.

Tampon ne kadar olmalı?

Çıkış kuyruğunun sebebi, dokunun hattan hızlı olmasıydı. Tamponun boyu işte o farkın ne kadarını soğurabildiğini söylüyor.

Boyutunu uzun yıllar tek bir pratik kural belirledi ve hâlâ karşına çıkıyor. RFC 3439 ortalama tamponu, tipik bir gidiş-dönüş süresi ile hat kapasitesinin çarpımı kadar seçmeyi öneriyor. Kuralın örnek olarak aldığı gidiş-dönüş süresi 250 ms. Daha yeni öneri aynı çarpımı akış sayısının kareköküne bölüyor. Aynı hatta 100 akış varsa gereken tampon onda birine iniyor, çünkü akışların tepe noktaları aynı ana düşmüyor.

Fazla tamponu bir iyilik sanma. Hiç boşalmayan uzun bir kuyruk gidiş-dönüş süresini büyütüyor, gerçek zamanlı uygulamaların başarımını düşürüyor ve TCP’nin tepkisini ağırlaştırıyor. Bu etki en çok ev yönlendiricilerinde göze çarpıyor.

Kuyruk hesabının iki girdisi soyut da kalmıyor; bir yönlendiricinin arayüz durum çıktısında ikisini yan yana görebilirsin:

Serial0/1/0 is up, line protocol is up
  MTU 1500 bytes, BW 1544 Kbit/sec, DLY 20000 usec
  Queueing strategy: fifo
  Output queue: 0/40 (size/max), 0 drops
  Input queue: 0/75 (size/max), 0 drops

Çıkış kuyruğu 40 paketlik, giriş kuyruğu 75 paketlik. Hattın kapasitesi 1.544 Kbit/s ve arayüzün MTU’su 1.500 bayt. MTU bir bağ katmanı kararıydı; burada aynı sayı kuyruk hesabının girdisi oluyor. Kuyruk tam dolduğunda içinde 60.000 bayt, yani 480.000 bit bekliyor. Bu hattın onu boşaltması yaklaşık 311 ms sürüyor. Sıranın sonuna eklenen paket bunu peşinen kabul ediyor.

Kimi atmalı, kime haber vermeli?

Çıkış portunun vermesi gereken iki ayrı karar var. Yer kalmadığında hangi paketin düşürüleceği bir karar; sırada bekleyenlerden hangisinin gönderileceği bambaşka bir karar. Birincisi düşürme politikası, ikincisi zamanlama disiplini.

En basit düşürme politikasına kuyruk sonu düşürme deniyor: tampon doluyken gelen paket atılıyor, kuyrukta bekleyenlere dokunulmuyor. İki alternatifi var: paketleri önceliğe göre atmak, ya da kuyrukta bekleyen birini geri çıkarmak.

Üçüncü seçenekte düşürmek yerine işaretliyorsun. ECN ve RED tıkanıklığı haber vermek için paketlere işaret koyuyor. Soru böylece değişiyor: kimi atayım değil, kime haber vereyim. IETF’in tavsiyesi de bu yönde. RFC 7567 ağ cihazlarının kuyruk uzunluğunu yönetmek ve uçtan uca gecikmeyi düşürmek için bir etkin kuyruk yönetimi mekanizması uygulamasını istiyor.

Yaygın uygulamalarından biri RFC 8290’da tanımlı FQ-CoDel. Akış kuyruklamayı CoDel etkin kuyruk yönetimiyle birleştiriyor; varsayılan hedef gecikmesi 5 ms, ölçüm aralığı 100 ms. Farklı akışların paketlerini birbirine karıştırdığı için ani trafiğin ürettiği baş engellemesinin etkisini de azaltıyor.

İşaretin duracağı yer ise IP başlığında hazır bekliyor. Oradaki 8 bitlik hizmet türü baytı ikiye bölünmüş: ilk 6 bit ayrımlaştırılmış hizmet kod noktası, son 2 bit ECN. RFC 2474 o alanı, paketin her düğümde göreceği davranışı seçen bir kod noktası olarak tanımlıyor ve 64 ayrı değer taşıyabiliyor. Öncelik sınıfı ile tıkanıklık işareti, 20 baytlık IP başlığında yan yana duruyor.

İşaretleme şöyle yürüyor. Yönlendirici o iki biti kuruyor, işaret hedefe kadar taşınıyor, hedef de dönüş onayında ECE bitini kurup göndereni yavaşlatıyor. Hangi durumda işaretleneceğine ağ işletmecisi karar veriyor. Bildirimin neden gerektiği klasik TCP ile CUBIC’e bakınca anlaşılıyor. İkisi de gönderme hızını kayıp oluşana kadar artırıyor ve darboğazda neredeyse hiç boşalmayan bir kuyruk bırakıyor.

Sıradaki paketi kim seçiyor?

Zamanlama disiplininin dört klasik cevabı var. Varsayılanı ilk gelen ilk gider, diğer adıyla FIFO. Paketler çıkış portuna varış sırasına göre iletiliyor ve hiçbir sınıflandırma yapılmıyor; yukarıdaki arayüz çıktısında kuyruk stratejisi satırının yazdığı da buydu.

Kalan üç politika ise tek kuyrukla çalışmıyor. Gelen trafik önce sınıflara ayrılıyor ve her sınıf kendi kuyruğuna giriyor. Sınıflandırmada başlığın herhangi bir alanı kullanılabiliyor. Öncelikli zamanlayıcı, bekleyen paketi olan en yüksek öncelikli kuyruktan gönderiyor; aynı sınıfın içinde yine ilk gelen ilk gider kuralı işliyor.

Dönüşümlü tarama (round robin) ise sınıf kuyruklarını sırayla dolaşıyor. Sırası gelen her sınıftan tam bir paket gönderiyor ve boş kuyruğu atlıyor. Hiçbir sınıf diğerini aç bırakamıyor. Ağırlıklı adil kuyruk bunun genelleştirilmiş hâli: her sınıfın bir ağırlığı var ve her turda ağırlığı oranında hizmet alıyor. Bir sınıfın aldığı pay, kendi ağırlığının bütün ağırlıklar toplamına oranı. Garanti mutlak bir hız değil, kapasitenin bir oranı.

Zamanlayıcının sırayı nasıl dağıttığını tur tur izleyelim:

Aynı altı paket, üç ayrı zamanlama politikası
çıkış sırasıvarışsırasıyedek 1yedek 2ses 1yedek 3ses 2yedek 4sınıfkuyruklarıses kuyruğuiki paket bekliyoryedekleme kuyruğudört paket bekliyorFIFOyedek 1yedek 2ses 1yedek 3ses 2yedek 4öncelikses 1ses 2yedek 1yedek 2yedek 3yedek 4ağırlıklıkuyruk 2:1yedek 1yedek 2ses 1yedek 3yedek 4ses 2
Altı paket aynı sırayla varıyor. Çıkış portuna dördü yedekleme, ikisi ses olmak üzere altı paket geliyor. Bundan sonrası tek bir soruya bakıyor: bu altı paket hattan hangi sırayla çıkacak?
  1. Altı paket aynı sırayla varıyor. Çıkış portuna dördü yedekleme, ikisi ses olmak üzere altı paket geliyor. Bundan sonrası tek bir soruya bakıyor: bu altı paket hattan hangi sırayla çıkacak?
  2. Trafik iki sınıfa ayrılıyor. İlk gelen ilk gider dışındaki politikalar tek kuyrukla çalışmıyor. Paketler başlıktaki bir alana bakılarak sınıflara bölünüyor ve her sınıf kendi kuyruğunda bekliyor.
  3. FIFO sırayı hiç bozmuyor. İlk gelen ilk gider hiçbir sınıflandırma yapmıyor. Çıkış sırası varış sırasının aynısı kalıyor; ses paketleri önlerindeki yedekleme paketleri bitene kadar bekliyor.
  4. Öncelik ses sınıfını öne alıyor. Öncelikli zamanlayıcı, bekleyen paketi olan en yüksek öncelikli kuyruktan gönderiyor. Ses kuyruğu boşalınca sıra aşağı geçiyor, boşalmazsa yedekleme hiç sıra alamıyor.
  5. Ağırlık payı orana çeviriyor. Ağırlıklı adil kuyrukta her sınıf turda ağırlığı oranında hizmet alıyor. Buradaki iki bir ağırlıkla yedekleme iki paket geçirirken ses bir paket geçiriyor.

Sırayı değil hızı sınırlamak

Zamanlama disiplinleri sıraya karar veriyor: kuyrukta bekleyenlerden hangisi önce çıkacak? Ama bir de ikinci soru var: bir akış saniyede kaç bit gönderebilir? Bu ikincisinin mekanizması ayrı ve adı jeton kovası.

Fikir tek bir resimle anlaşılıyor. Her akış için bir kova düşün. Kovaya sabit bir hızla, saniyede r bit değerinde jeton damlıyor. Kovanın derinliği b; taştığı anda fazla jeton kayboluyor. Bir paket çıkabilmek için boyu kadar jeton harcamak zorunda. Jeton yoksa paket ya bekliyor ya düşüyor.

İki parametre iki ayrı söz veriyor:

uzun vadeli ortalama hız  =  r
tek seferde çıkabilecek en büyük patlama  =  b
T süresi boyunca çıkabilecek en çok veri  =  r · T + b

İkinci satır kritik. Kova doluyken bir anda b kadar veri çıkabiliyor; yani sınırlayıcı akışı boğmuyor, kısa süreli patlamalara izin veriyor. Sessiz kalan bir akış “kredi biriktirmiş” oluyor. Kovanın derinliği bu yüzden bir hoşgörü ayarı: küçük b düzgün ama katı, büyük b esnek ama darboğazda daha çok kuyruk üretiyor.

Jetonu olmayan pakete ne yapılacağı ayrı bir karar ve iki ad taşıyor. Ölçüm-cezalandırma (policing) fazlayı ya düşürüyor ya da düşük öncelikli diye işaretleyip yola devam ettiriyor — hızlı ve ucuz, ama kayıp üretiyor. Şekillendirme (shaping) fazlayı bir kuyrukta bekletip jeton biriktikçe salıyor — kayıp üretmiyor, karşılığında gecikme ekliyor. Aynı kova, iki farklı sonuç: biri bant genişliğini, öteki gecikmeyi ödüyor.

Bunu her gün görüyorsun. Tarifende yazan “100 Mbit/s” bir kablonun fiziksel hızı değil, operatörün kenar cihazına koyduğu jeton kovasının r değeri. Hat gerçekte 1 Gbit/s taşıyabiliyor olabilir. Bulut sağlayıcılarının API kotaları, mobil tarifelerdeki “adil kullanım” sonrası yavaşlatma ve bir dosya indirirken ilk birkaç saniyenin daha hızlı gitmesi — üçü de aynı kovanın farklı ayarları. O ilk hızlı saniyeler tam olarak b kadar.

Sırayla adil olmak throughput bakımından adil olmak anlamına gelmiyor, çünkü her sırada geçen paketin taşıdığı bit sayısı eşit olmayabiliyor. İnternetin ağ katmanı servis modeli de hâlâ best effort. Datagramın hedefe ulaşacağına, sırasına, zamanlamasına ve akışa ayrılacak bant genişliğine dair söz verilmiyor.

Garanti veren alternatifler tanımlandı ama varsayılan olmadı. Intserv garantili bant genişliği, kayıpsızlık ve sıra vaat ediyordu; Diffserv aynı şeyleri mümkün düzeyinde bıraktı. Hücresel tarafta ise aynı fikir bir sınıf tablosuna dönüşmüş durumda. 3GPP’nin hizmet kalitesi sınıf göstergesi ses için 100 ms, gerçek zamanlı oyun için 50 ms, akan video için 300 ms, web gezinme için 600 ms azami gecikme hedefi tanımlıyor.

Adalet hedefi de basit yazılıyor: aynı darboğazı K oturum paylaşıyorsa her biri ortalama R/K almalı. Ama kimse dayatmıyor. Paralel bağlantı açan uygulama payını büyütüyor; hâlihazırda dokuz bağlantı varken bir bağlantı isteyen onda bir alıyor, on bir bağlantı isteyen yarıyı alıyor. Sabit hızda gönderip kaybı kabullenen bir UDP uygulamasını denetleyen merci de yok. Bir sağlayıcının kendi kaynağını nasıl paylaştırdığı sorusunun mekanizması tam olarak bu ikisi: paket zamanlama ve tampon yönetimi.

DerinleşmeAğ tarafsızlığı teknik bir kural mı, hukuki bir kural mı?

Mekanizmanın kendisi tarafsız. Öncelikli zamanlayıcı bir sınıfa neden öncelik verildiğini sormuyor, ağırlıklı adil kuyruk da ağırlıkları kimin yazdığını umursamıyor. Tartışma bu yüzden mekanizmanın değil, mekanizmayı kimin hangi gerekçeyle ayarladığının tartışması.

ABD’de 2015 tarihli FCC kararı üç açık ve net çizgi kuralı koydu: yasal içeriği engelleme yok, yasal trafiği kasten yavaşlatma yok, ücretli önceliklendirme yok. Üçü de makul ağ yönetimi kaydıyla sınırlandı. Yani teknik gerekçeyle yapılan ayrım kuralın dışında bırakıldı, ve bu kaydın sınırının nerede olduğu tartışmanın asıl yeri hâline geldi.

Sonrası daha da öğretici. Aynı kural 2017’de geri alındı, 2024’te geri alma geri alındı. Hukuki çerçeve on yılda üç kez değişti.

Hukuki eksen tek bir tanımda düğümleniyor: bir sağlayıcı ne sayılıyor? Telekomünikasyon hizmeti sayılırsa ortak taşıyıcı yükümlülükleri doğuyor: makul ücret, ayrım gözetmeme ve düzenlemeye tabi olma. Bilgi hizmeti sayılırsa doğmuyor. Aynı kutu, aynı kuyruk, aynı zamanlayıcı, farklı hukuki sınıf.

Ülkelerin tutumu da birbirinden farklı, çünkü tartışmanın dayandığı gerekçeler teknik değil toplumsal: ifade özgürlüğünün korunması, yeniliğin ve rekabetin teşvik edilmesi.

Özet

Peki, ne öğrendik?

  • Kuyruk geçici bir taşkının deposu: varış hızı çıkış hattının kapasitesini aştığı sürece uzuyor, düştüğünde boşalıyor, ve taştığında hem gecikme hem kayıp üretiyor.
  • Tampon iki yönlü bir bedel: azı kayıp, fazlası gecikme demek, ve fazlasının faturası en çok ev yönlendiricilerinde ödeniyor.
  • Düşürmek tek seçenek değil: etkin kuyruk yönetimi tıkanıklığı işaretleyerek haber veriyor ve o haber hizmet türü baytındaki iki bite sığıyor.
  • Zamanlayıcı bir politika taşıyor: FIFO hiç sınıflandırmıyor, öncelik bir sınıfı öne alıyor, ağırlıklı adil kuyruk ise kapasitenin bir oranını garanti ediyor.

Çıkış hattının önündeki sırayı bir politikanın kurduğunu artık biliyorsun. Ama paketi o hatta yollayan şey hâlâ bir tablodaki tek satırdı. O satırı oraya kim yazdı?

38. bölüme devam et: Cihaz Yapılandırma