Ana içeriğe geç

Bölüm 73: Uyarlanır Video Akışı

9 dakikalık okumaGüncelleme:

Ağlar'a “Sen”i Katmak kitabının bir bölümü: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine inip karşı taraftan geri dönen uzun bir teknik yolculuk.

Kısım 11: Ses ve Görüntü (Bölüm 73-74)

Tüm bölümler
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. DNS Kayıtları
  6. Önbellek, Tazelik ve Güven
  7. Port Numarası ve Soket
  8. Bağlantısız Taşıma: UDP
  9. Üç Adımlı El Sıkışma
  10. Simetrik Şifreleme
  11. Açık Anahtarlı Kriptografi
  12. TLS El Sıkışması
  13. Sertifika Zinciri
  14. HTTP Mesajının Anatomisi
  15. Durum, Çerez ve Oturum
  16. HTTP/2'den HTTP/3'e
  17. İçerik Dağıtım Ağları
  18. Diğer Uygulama Protokolleri
  19. Katmanlı Mimari
  20. Hizmet ve Protokol
  21. Encapsulation ve Başlıklar
  22. Paket Yakalama ve Çözümleme
  23. Ağ Interface Kartı
  24. Fiziksel Adresleme
  25. Hata Sezme ve CRC
  26. Adres Çözümleme: ARP
  27. Ortam Erişimi: CSMA/CD
  28. Switch'ler
  29. Ağ Topolojileri
  30. Sanal Yerel Ağlar
  31. Kablosuz Erişim: 802.11
  32. Radyo Kanalı ve Kapasite
  33. Kablosuz Ağ Güvenliği
  34. Hücresel Ağlar
  35. Spektrum ve Kuşaklar
  36. Hareketlilik ve Aktarma
  37. Adres Kiralama: DHCP
  38. Adresin Anatomisi
  39. Adres Tükenmesi ve IPv6
  40. Router Mimarisi
  41. Kuyruk Yönetimi
  42. Cihaz Yapılandırma
  43. Routing Protokolleri
  44. Kontrol Düzlemi ve SDN
  45. Ağ İzleme ve Yönetimi
  46. Alanlar Arası Routing
  47. Adres Çevirisi
  48. Ara Kutular
  49. Tünelleme ve IPsec
  50. Firewall'lar
  51. Ağ Saldırıları
  52. Operatör ve Metro Ağları
  53. Bitten Sinyale
  54. Sembol Hızı ve Kanal Kapasitesi
  55. Multiplexing Teknikleri
  56. İletim Ortamları
  57. Bakır Kablo Sonlandırma
  58. Fiber Sonlandırma
  59. Fiber Optik İletim
  60. Bakır Erişim Ağı: DSL
  61. DSL'de Hız ve Mesafe
  62. Pasif Optik Ağlar
  63. Kablo Erişim Ağları
  64. Kablo Modem ve CMTS
  65. Denizaltı Kabloları
  66. Veri Merkezi Ağları
  67. Encapsulation Çözme
  68. Güvenilir Aktarım
  69. Tıkanıklık Denetimi
  70. Trafik Çözümleme
  71. Gecikme Bütçesi
  72. Soket Programlama
  73. Eşten Eşe ve Protokol Tasarımı
  74. Uyarlanır Video Akışı
  75. Gerçek Zamanlı Ses ve Görüntü
  76. Kablosuz Sensör Ağlarının Mimarisi
  77. Sensör Ağlarında Ortam Erişimi
  78. Sensör Ağlarında Yönlendirme ve IP
  79. Zaman Eşitleme ve Konum Bulma
  80. Sensör Ağı Uygulamaları
  81. Mobil Kablosuz Sensör Ağları
  82. Son Söz

İstemci. 17. bölümde DASH’in fikrini görmüştün: sunucu videoyu birkaç saniyelik parçalara bölüyor, her parçayı birkaç farklı hızda kodluyor ve bir listede yayımlıyor. Hangi parçanın hangi hızda ve ne zaman isteneceğine oynatıcı karar veriyor.

O kararın içine girmek için üç şeyi bilmek gerekiyor. Video neden bu kadar sıkıştırılabiliyor, oynatıcının elindeki tampon nasıl doluyor ve boşalıyor, karar veren algoritma neye bakıyor? Sonunda canlı yayının neden hep birkaç saniye geriden geldiğine de bakacağız.

Önce ölçek. Sıkıştırılmamış bir film saniyede kaç bit tutuyor?

Ham görüntü, sıkışmış görüntü

1920×1080 çözünürlükte, piksel başına 24 bit renk ve saniyede 60 kare: 1.920 × 1.080 × 24 × 60, yani saniyede yaklaşık 3 gigabit. Aşağıda göreceğin gerçek bir yayın listesi aynı görüntüyü saniyede 5 ile 8 megabit arasında gönderiyor. Arada yaklaşık 370 ile 600 katlık bir sıkıştırma var.

Bu oran iki tekrardan geliyor. Birincisi karenin içindeki tekrar: gökyüzünün bir parçası yanındaki parçaya benziyor ve kodlayıcı bu benzerliği bir dönüşümle birkaç sayıya indiriyor. İkincisi kareler arasındaki tekrar ve asıl kazanç orada. Saniyede 60 kare çekilen bir sahnede ardışık iki kare neredeyse aynı; değişen şey birkaç nesnenin konumu. Kodlayıcı ikinci kareyi baştan yazmak yerine “birinci karenin şu bloğu şu kadar sağa kaydı” diyor.

Bu yüzden kareler üç türe ayrılıyor:

TürNeye dayanıyorBoyu
I karesihiçbir şeye; kendi başına çözülürbüyük
P karesiönceki bir kareyeküçük
B karesihem önceki hem sonraki bir kareyeen küçük

B karesi sezgiye ters bir sonuç doğuruyor: bir kareyi çözmek için gelecekteki bir kareye ihtiyaç var. Bu yüzden kareler ekranda gösterildikleri sırayla değil, çözülecekleri sırayla gönderiliyor. Gelecekteki kare önce geliyor, arada kalan B kareleri sonra.

Bir I karesinden bir sonrakine kadarki kare grubuna GOP deniyor. Bir oynatıcı yayına ancak bir I karesinden katılabiliyor, çünkü ondan önceki her kare bir öncekine dayanıyor. Akış açısından bundan çıkan kural kesin: her parça, kendinden öncekilere hiç dayanmayan bir I karesiyle başlamak zorunda. Oynatıcı ancak böylece parça sınırında bir hızdan ötekine geçebiliyor.

Kodlayıcı kuşakları aynı işi giderek daha az bitle yapıyor. 2003’te çıkan H.264 bugün hâlâ en yaygını. 2013’te gelen H.265, yani HEVC, aynı kaliteyi yaklaşık yarı bit hızıyla veriyor ama patent lisansları karmaşık. 2018’de dondurulan AV1’i ise büyük teknoloji şirketlerinin kurduğu bir birlik telifsiz olsun diye tasarladı. Her yeni kuşak bit kazandırıyor, karşılığında kodlama tarafında çok daha fazla işlem istiyor.

Bir merdiven, birçok basamak

Apple’ın geliştiricilere örnek olarak yayımladığı bir yayının ana listesi şöyle başlıyor (satırlar kısaltıldı):

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=2177116,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=960x540,FRAME-RATE=60.000
v5/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=8001098,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=60.000
v9/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=6312875,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=60.000
v8/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=4943747,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=60.000
v7/prog_index.m3u8
...
#EXT-X-STREAM-INF:BANDWIDTH=541052,CODECS="avc1.640015,mp4a.40.2",RESOLUTION=480x270,FRAME-RATE=30.000
v2/prog_index.m3u8

Her STREAM-INF satırı merdivenin bir basamağı. BANDWIDTH o basamağın tepe bit hızı, CODECS içindeki avc1 H.264 görüntüyü, mp4a.40.2 AAC sesi gösteriyor. Listede sekiz basamak var: 480×270’te 0,54 Mbit/s’den 1080p’de 8 Mbit/s’ye. Dikkat çeken ayrıntı, aynı 1920×1080 çözünürlüğün üç ayrı basamakta durması. Çözünürlük kalitenin tamamı değil; aynı piksel sayısı daha az bitle daha bulanık, daha çok bitle daha net kodlanabiliyor.

Basamaklardan birinin kendi listesine girince parçalar görünüyor (bazı satırlar çıkarıldı):

#EXTM3U
#EXT-X-TARGETDURATION:6
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="main.mp4",BYTERANGE="719@0"
#EXTINF:6.00000,
#EXT-X-BYTERANGE:1508000@719
main.mp4
#EXTINF:6.00000,
#EXT-X-BYTERANGE:1510244@1508719
main.mp4

Her parça 6 saniye; bu listede 100 tane var, yani on dakikalık bir video. Sürpriz şurada: parçalar ayrı dosyalar bile değil. Hepsi tek bir main.mp4 dosyasının içinde duruyor ve BYTERANGE satırı hangi bayt aralığının istenmesi gerektiğini söylüyor. Oynatıcı her parça için aynı dosyadan bir aralık isteği gönderiyor. İlk satırdaki 719 baytlık parça ise görüntüyü çözmeye yetecek ayarları taşıyan başlangıç bölümü. Parça başına yaklaşık 1,5 MB, 6 saniyeye bölünce saniyede 2 megabite yakın; ana listedeki 2,17 Mbit/s’lik basamakla tutarlı.

Merdivenin basamaklarını kim ve neye göre seçiyor? Netflix 2010’da bütün kataloğu için tek bir merdiven kullanıyordu: 235 kbit/s’den 5.800 kbit/s’ye on basamak, her birine sabit bir çözünürlük. 2015’te bunu bıraktı. Çizgi film gibi sade bir görüntü 1080p’de 1,5 Mbit/s ile iyi görünürken, film greniyle dolu bir sahne 5,8 Mbit/s’de bile bloklaşıyordu. Artık her yapımın merdiveni kendi karmaşıklığına göre çıkarılıyor. Doğru bit hızı içeriğe bağlı.

Tampon: ağ ile ekran arasındaki depo

Oynatıcı, parçaları indirdikçe bir tampona koyuyor ve tamponu gerçek zamanlı hızla boşaltarak oynatıyor. Ağın dalgalanmasını ekrandan saklayan şey bu depo.

Hesabı bir kez yapmak her şeyi açıklıyor. Parçalar 4 saniyelik ve oynatıcı 5 Mbit/s’lik basamağı seçmiş olsun. Bir parça 20 megabit.

Donmanın adı yeniden tamponlama ve izleyicinin en az affettiği şey o. 2011’de büyük video sağlayıcılarının milyonlarca oturumunu inceleyen bir çalışma, tamponda geçen süre oranının bütün içerik türlerinde izleme süresini en çok etkileyen ölçüt olduğunu gösterdi. En sert etki canlı yayındaydı: 90 dakikalık canlı bir etkinlikte tamponlama oranındaki %1’lik artış, izleme süresini üç dakikadan fazla kısaltıyordu.

Tamponun bir üst sınırı da var. Dolduğunda oynatıcı indirmeyi durduruyor, biraz boşalınca yeniden başlıyor. Bağlantı böylece bir açık bir kapalı çalışıyor ve 17. bölümün sonunda anlatılan sorun burada doğuyor: aynı hattaki iki oynatıcı birbirinin sessiz anlarını boş kapasite sanıyor.

Kararı veren algoritma

Oynatıcı her parçadan önce aynı soruyu soruyor: sıradaki parçayı hangi basamaktan isteyeyim? Bu kararı veren mantığa ABR (adaptive bitrate) deniyor ve üç ana yaklaşım var.

Hıza bakan. Son birkaç parçanın ne hızla indiğini ölç, bir güvenlik payı düş ve o hızın altındaki en yüksek basamağı seç. Sezgisel, ama ölçüm yanıltıcı olabiliyor. Açık-kapalı çalışan bir bağlantıda her parça bir sessizlikten sonra başlıyor. Linux varsayılan olarak (net.ipv4.tcp_slow_start_after_idle = 1) bir yeniden gönderim zaman aşımından uzun bekleyen bağlantının tıkanıklık penceresini küçültüyor. Her parçanın başında hız 68. bölümdeki yavaş başlangıçtan yeniden tırmanıyor. Kısa parçalarda ölçülen hız, hattın gerçek kapasitesinin altında kalıyor.

Tampona bakan. Netflix’in 2014’te yayımladığı çalışma soruyu tersine çevirdi: kapasiteyi tahmin etmek zorunda mıyız? Tampon doluysa yüksek basamak seç, boşalıyorsa düşük; aradaki bölgede tampon doluluğunu doğrudan bir bit hızına eşle. Mayıs ile Eylül 2013 arasında milyonlarca gerçek kullanıcıyla yapılan deneylerde yeniden tamponlama, şirketin o günkü algoritmasına göre %10 ile %20 azaldı; ortalama görüntü hızı ise aynı kaldı. Tek istisna açılış anı: tampon boşken bakılacak bir şey olmadığından orada hız tahmini hâlâ gerekiyor.

İkisini birlikte tartan. Birkaç parça sonrasını öngörüp en iyi planı seçen denetim kuramı yaklaşımları geliştirildi. 2016’da yayımlanan BOLA bunlardan biri; yalnızca tampona bakıyor ama seçimini kalite ile donma riskini tartan bir optimizasyonla yapıyor ve DASH’in açık kaynak başvuru oynatıcısına girdi. 2017’de ise karar mantığını pekiştirmeli öğrenmeyle kendisi öğrenen denemeler geldi.

Tampona bakan bir kuralın basit bir hâli, yukarıdaki merdivenle şöyle olabilir:

TamponSeçilen basamak
10 saniyeden azen düşük: 0,54 Mbit/s
10 ile 30 saniye arasıdoluluğa göre doğrusal olarak yukarı
30 saniyeden fazlaen yüksek: 8 Mbit/s

Alt bölge bir güvenlik deposu: orada tek amaç donmamak. Üst bölgede ise kaybedecek bir şey yok, en iyi görüntü isteniyor.

HLS, DASH ve ortak parça biçimi

Yukarıdaki listeler HLS biçiminde. Apple 2009’da başlattı ve 2017’de RFC 8216 olarak yayımlandı. DASH ise 2012’de ISO standardı oldu ve aynı bilgiyi XML biçimli bir tanım dosyasıyla veriyor. Uzun süre aynı video iki kez paketlenip iki kez saklandı: bir kez HLS için, bir kez DASH için. 2018’de standartlaşan CMAF parçaların biçimini ortaklaştırdı. Artık aynı parça dosyaları iki listeden de işaret edilebiliyor. Kenar sunucuları her parçayı bir kez önbelleğe alıyor.

DerinleşmeParçalar neden 2 ile 10 saniye arasında?

Parça süresi dört kuvvetin arasında sıkışmış bir sayı.

Kısa parça hızlı tepki demek. Hat düştüğünde oynatıcı bir sonraki parça sınırında hemen daha düşük basamağa geçebiliyor. Canlı yayında da gecikmeyi doğrudan kısaltıyor, çünkü bir parça tamamlanmadan yayımlanamıyor.

Uzun parça ise verim demek. Her parça bir HTTP isteği ve en az bir gidiş-dönüş. Daha önemlisi her parça bir I karesiyle başlamak zorunda ve I karesi pahalı. Parça kısaldıkça I kareleri sıklaşıyor, aynı kalite için gereken bit artıyor.

Apple’ın tavsiyesi zamanla değişti. Eskiden 10 saniyelik hedef süre öneriyordu. 2016’da bunu 6 saniyeye indirdi ve iki saniyede bir anahtar kare istedi. Belgesindeki gerekçe açık sözlü: eski içeriği yeniden bölmenizi beklemiyoruz, ama ileriye dönük olarak 6 saniye daha iyi bir ödünleşim.

Canlı yayın neden geriden gelir?

Golü ekranda görmeden önce komşunun sevinç çığlığını duyduysan sebebi bu bölümde. Canlı bir yayında görüntünün kameradan ekrana varması birkaç aşamadan geçiyor ve her biri bekletiyor:

  1. Kodlama ve paketleme. Kodlayıcı bir parçayı tamamlamadan yayımlayamıyor; 6 saniyelik parçada ilk kare en az 6 saniye bekliyor.
  2. Dağıtım. Parça kaynaktan kenar sunucularına yayılıyor.
  3. Oynatıcı tamponu. HLS belirtimi, oynatıcıya canlı listenin sonundan en az üç hedef süre geriden başlamasını söylüyor. 6 saniyelik parçalarla bu tek başına 18 saniye.

Toplamda klasik bir canlı yayın ekrana onlarca saniye geç varabiliyor. Apple’ın 2019’da duyurduğu düşük gecikmeli HLS bu zinciri kısaltıyor. Parçalar birer saniyenin altındaki alt parçalar hâlinde yayımlanıyor ve oynatıcı listenin yeni sürümünü sunucuda bekleyerek alıyor, tekrar tekrar sormuyor. Apple halka açık ağlarda iki saniyenin altında gecikme hedefliyor. Aynı fikrin DASH tarafındaki karşılığı da CMAF parçalarını, tamamlanmalarını beklemeden küçük parçalar hâlinde göndermek.

Bir saniyenin altına ise bu mimari inemiyor; orada 74. bölümdeki gerçek zamanlı protokoller devreye giriyor.

Taşıma: TCP’den QUIC’e

Video trafiği taşımanın değişiminden en çok etkilenenlerden biri. Google 2017’de yayımladığı ölçümlerde YouTube’u 15. bölümdeki QUIC üstüne taşımanın etkisini gösterdi. Yeniden tamponlama oranı masaüstünde %18,0, mobilde %15,3 düştü. Kazancın bir kısmı bağlantı kurulumundan, bir kısmı kayıp kurtarmadaki iyileştirmelerden geliyor. Masaüstü bağlantıların yaklaşık %88’i sıfır turla kuruluyordu.

Parçaların nereden geldiği de en az taşıma kadar önemli. 16. bölümde gördüğün kenar sunucuları video için özel bir biçim de aldı. Netflix 2012’den beri kendi önbellek cihazlarını doğrudan internet servis sağlayıcılarının ağlarına yerleştiriyor. Popüler bir dizinin parçaları, izleyicinin bağlı olduğu operatörün içinden, birkaç sekme öteden geliyor.

Özet

  • Sıkıştırma kareler arasındaki tekrardan gelir: I karesi kendi başına çözülür, P ve B kareleri başka karelere dayanır. Her parça, oynatıcının basamak değiştirebilmesi için bağımsız bir I karesiyle başlar.
  • Merdiven içeriğe göre kurulur: aynı çözünürlük farklı bit hızlarında durabilir, sade bir görüntü yüksek çözünürlüğü daha az bitle taşır.
  • Tampon ağın dalgasını emer: hat seçilen hızın altına düşerse tampon her parçada erir ve biterse görüntü donar. İzleyicinin en az affettiği şey donmadır.
  • ABR kararı iki şeye bakar: ölçülen hıza ya da tamponun doluluğuna. Tampona bakan yaklaşım Netflix’te donmaları %10 ile %20 azalttı.
  • Canlı yayının gecikmesi parçadan gelir: tamamlanmadan yayımlanamayan parçalar ve birkaç parçalık oynatıcı tamponu onlarca saniye tutar. Düşük gecikmeli HLS bunu iki saniyenin altına indirmeyi hedefliyor.

Canlı yayında bile birkaç saniyelik gecikmeye razı olabiliyorsun; golü geç görsen de maç aynı maç. Karşında konuşan biri varsa durum değişiyor. Sen sözünü bitirdiğinde cevabı yarım saniye gecikirse konuşma birbirinin üstüne biniyor. Gecikmenin yüz milisaniyeler içinde kalması gerekiyorsa ağ neden vazgeçiyor?

74. bölüme devam et: Gerçek Zamanlı Ses ve Görüntü