- Bir web sitesinin boyutunu 14kB’ın altında tutmak, 15kB olduğuna kıyasla yükleme hızını önemli ölçüde artırabilir
- Bu durum TCP slow start algoritması nedeniyle ortaya çıkar; ilk veri aktarımındaki sınır, algılanan hız farkına yol açar
- 14kB, çoğu sunucunun başlangıçta gönderdiği 10 TCP paketinin kapasitesine karşılık gelir
- Uydu interneti gibi yüksek gecikmeli ortamlarda, fazladan bir gidiş-dönüş (RTT) 612ms’ten fazla gecikmeye neden olabilir
- Pratikte, ana içeriği 14kB’ın altına sığdırmak veya ilk 14kB içine kritik kaynakları yerleştirmek web performansı optimizasyonunda etkilidir
Genel bakış ve temel prensipler
- Web sitesinin boyutu küçüldükçe daha hızlı yüklendiği iyi bilinen bir gerçektir
- Ancak 14kB’dan 15kB’a geçildiği anda, ilk yanıt hızında çarpıcı bir fark oluşması beklenmedik bir durumdur
- 15kB ile 16kB’lık sayfalar arasındaki hız farkı küçüktür, ancak 14kB ile 15kB arasında en fazla 612ms fark oluşabilir
TCP nedir
- Transmission Control Protocol (TCP), IP (Internet Protocol) üzerinde çalışır ve paketlerin güvenilir şekilde iletilmesini sağlar
- Web tarayıcısı bir HTTP isteği gönderdiğinde birden fazla TCP paketi iletir
- Yalnızca IP kullanıldığında paketlerin ulaşıp ulaşmadığı doğrulanamaz; bu nedenle TCP, paket alındısını onaylama (ACK) işlevini sağlar
- Sunucu önce az sayıda paket gönderir, ardından tarayıcıdan ACK alırsa ek paketleri iletir
- ACK gelmezse, paket yeniden gönderme süreci devreye girer
TCP slow start nedir
- TCP slow start, sunucunun ağ bağlantısının kalitesini (bant genişliğini) anlamak için gönderdiği paket miktarını kademeli olarak artırdığı bir algoritmadır
- Bağlantının başlangıcında sunucu yalnızca küçük bir miktar paket gönderir (genellikle 10 paket)
- Ziyaretçinin bilgisayarı ACK’yi düzgün şekilde gönderirse, paket gönderim miktarı iki katına çıkarılır
- ACK kaybı yaşanırsa, sonrasında paketler daha yavaş bir hızda gönderilir
- Gerçek algoritma uygulamaya göre ayrıntılarda farklılık gösterse de, temel fikir aynıdır
14kB eşiğinin dayanağı
- Çoğu sunucu slow start sırasında bir seferde 10 TCP paketi gönderir
- TCP paketinin azami boyutu 1500 bayttır, ancak başlıklar (40 bayt) çıkarıldığında gerçek veri miktarı 1460 bayttır
- Dolayısıyla 10 x 1460 = 14600 bayt (yaklaşık 14kB) ilk aktarımın üst sınırıdır
- Web sitesini veya kritik kaynakları 14kB’ın altında tutarsanız (sıkıştırma uygulanıyorsa özgün veri onlarca kB olabilir), başlangıçta ek bir gidiş-dönüş gecikmesi olmadan görüntülenebilir
Tek bir gidiş-dönüş ne kadar büyük gecikmeye yol açar
Uydu interneti örneği
- Yüksek gecikmeli ortamlara tipik bir örnek olarak uydu interneti kullanıcıları verilebilir (petrol sondaj platformları, yolcu gemileri vb.)
- Telefonda ana sayfa isteği yapılırken yönlendirici → uydu anteni → uzaydaki uydu → yer istasyonu → sunucu hattındaki her aşama onlarca ila yüzlerce ms sürebilir
- Toplam aktarım gidiş-dönüşü; uzaya iki kez gidip gelmeyi, ağ bölümlerindeki hareketi ve sunucu işlemesini içerdiğinden yaklaşık 612ms ek gecikme yaratır
- HTTPS kullanıldığında, ek handshake nedeniyle bu süre 1836ms’ye kadar çıkabilir
Karasal ağlarda gecikme
- 2G, 3G gibi mobil ağlarda da 100~1000ms düzeyinde gecikme oluşabilir
- Yoğunluk, sunucu aşırı yükü, paket kaybı gibi çeşitli koşullarda ek gecikmeler meydana gelebilir
14kB kuralını uygulayan web sitesi optimizasyon stratejileri
- Temel nokta, web sitesini ya da sayfayı mümkün olduğunca küçük tutmaktır
- Her sayfanın sıkıştırılmış aktarım boyutunun 14kB veya altında olacak şekilde tasarlanması idealdir
- Sıkıştırma kullanıldığında gerçek içerik ~50kB’a kadar çıkabilir
- Otomatik oynatılan videolar, açılır pencereler, izleyiciler, gereksiz JS/CSS gibi çoğu gereksiz öğeyi azaltarak bu hedefe ulaşmak mümkündür
- Eğer tüm sayfayı 14kB içine sığdırmak zorsa, ilk 14kB içinde kritik kaynakları ve ana içeriği (CSS, JS, temel metin vb.) öncelikli olarak yerleştirmek önemlidir
- HTTP başlıkları (sıkıştırılamaz) ve görseller de (yalnızca gerekli minimum kısmı yükleme veya placeholder kullanma) bu 14kB sınırına dahildir
14kB kuralının istisnaları ve modern protokol meseleleri
- 14kB kuralı aşırı bir genelleme değildir, ancak bazı istisnalar vardır
- Bazı sunucular initial window değerini 30 pakete kadar genişletir
- TLS handshake üzerinden daha büyük bir pencereye izin verilmesi mümkün olabilir
- Rota bazında gönderilebilecek paket sayısı önbelleğe alınarak sonraki bağlantılarda daha fazla veri gönderilebilir
- HTTP/2’de de sunucunun TCP slow start nedeniyle 10 paketle başlama pratiği genel olarak değişmemiştir
- HTTP/3, QUIC tarafında da 14kB kuralı resmî olarak tavsiye edilmektedir
Özet ve referans materyalleri
- Teknik gerekçeler ve ek açıklama materyalleri her bağlantı üzerinden incelenebilir
- İlk yayın: 2022-08-25, son düzenleme: 2022-08-26, yazar: Nathaniel, ilgili etiketler: web performansı, HTTP, TCP
Referans bağlantıları
- Ethernet çerçeveleri ve TCP başlık yapısı, gecikme ve bant genişliğiyle ilgili ek materyaller, TCP/QUIC spesifikasyonları vb.
1 yorum
Hacker News yorumu
Yazılım geliştiricilerin medya katmanına biraz daha fazla ilgi göstermesi gerekiyor; özellikle de yazarın 3G/5G güvenilirliği ve gecikmesi hakkında vurguladıkları etkileyici. Radyoda neredeyse her zaman yeniden iletim olur ve çoğu HTTP iletişiminde UI'ın güncellenebilmesi için paketlerin sırayla ulaşması gerekir. Hatta tek bir REST isteği bile, istek ve yanıt 1400 bayttan küçük olduğunda gerçekten tek paket olarak işlenir. Bunun üstünde, 'tekil' istek aslında birden fazla pakete bölünür. Bunlardan biri bile sorun yaşarsa, ekranın düzgün güncellenmesi için tüm paketlerin sırayla gelmesi gerekir. Denemek isterseniz Chrome geliştirici araçlarında 3G modu ve paket kaybını açıp test ederek, tek bir küçük optimizasyonla bile UI tepkiselliğinin büyük ölçüde iyileştiğini görebilirsiniz. Bu yüzden API ve UI'ı olabildiğince küçük tutmak için ikna edici bir neden var
Ana sayfamın aktarım boyutu sıkıştırılmış hâliyle 7.0kB
14kB hedefi biraz iddialı, ama ilk 10 paket içinde kalma fikri de ilginç. Benim gibi site boyutuna odaklanan projelerden biri 512kb.club. Site boyutunu golf skoru gibi karşılaştıran bir yer. Benim sitemin(anderegg.ca) kayıt öncesi tüm kaynakları toplandığında 71kB çıktı. Bu proje sayesinde Cloudflare Radar da öğrendim; site analizi ve sayfa boyutu ölçümü için iyi araçları var. Asıl amacı tüm internet için bir gösterge paneli ama sayfa boyutu analiz aracı da içeriyor
Bunu biraz daha eğlenceli deneylerle test etmek isterseniz, başlangıç penceresi (IW) boyutu sunucu tarafında ayarlanabilir. Örneğin şöyle değiştirilebilir
Aşağıdaki yazıda anlatılanlar da burada geçerli: Cloudflare blogu - Rus ISP'lerin yalnızca ilk 16KB'ye izin vererek web gezintisinin büyük kısmını kullanılamaz hâle getirmesi. Cloudflare analizine göre Rus ISP'ler, yerel kullanıcıların internetini throttling uygulayarak web varlığı başına yalnızca ilk 16KB'nin yüklenmesine izin verecek şekilde sınırlandırıyor
TCP Slow Start'ın ne olduğunu bilmeyenlerle, web sitesi yüklenme gecikmesini milimetrik düzeyde önemseyecek kadar ilgili olanların kesişimi çok küçük. Startupların önce startup işine odaklanması gerekir; bu tür optimizasyon takıntılarına ancak büyük şirketlerin ayıracak zamanı olur
Ana sayfam 17.2KB! (bağımlılıklar hariç) Kişisel sayfam için gerçekten çok optimizasyon yaptım ve Lighthouse'ta da tam 100 puan aldım. Eskiden imkânsız sanıyordum ama başardım. Bu arada Rails ile yapıldı. Böyle bir optimizasyonun gerçekten değdiğini söyleyebilirim. Tepkisiz hissettirmeden şimşek gibi açılan bir sayfa deneyimi başlı başına çok tatmin edici
Yazıda iki mantıksal zayıflık olduğunu düşünüyorum
Yeni neslin, basit statik siteleri bile Next.js gibi framework'lerle yapma eğiliminde olduğunu görüyorum. HTML+CSS+js döneminin geride kalıyor olması biraz üzücü
Gecikmenin yanı sıra kaynak tüketimini en aza indirmek de sürdürülebilir bir gelecek için gerekli. Ağın çevreye etkisi de kesinlikle küçük değil. Yorumların biraz alaycı bir tona kayması üzücü. Bu optimizasyonlar nihai çözüm değil belki ama enerji kullanımını azaltma etkisi daha fazla vurgulanabilirdi