Modern web tarayıcısına yakından bakış (2. bölüm)

Mariko Kosaka

Navigasyonda ne olur?

Bu, Chrome'un iç işleyişine odaklanan 4 bölümlük bir blog dizisinin 2. bölümüdür. Önceki yayında, farklı işlemlerin ve ileti dizilerinin tarayıcının farklı bölümlerini nasıl işlediğini ele aldık. Bu yayında, bir web sitesi göstermek için her bir sürecin ve ileti dizisinin nasıl iletişim kurduğunu daha ayrıntılı olarak inceleyeceğiz.

Web'de gezinmenin basit bir kullanım örneğine bakalım: Tarayıcıya bir URL yazarsınız, ardından tarayıcı internetten veri alıp bir sayfa görüntüler. Bu yayında kullanıcının site isteğinde bulunduğu, tarayıcının ise sayfayı oluşturmaya hazırladığı bölüme odaklanacağız. Bu bölüm, gezinme olarak da bilinir.

Bir tarayıcı işlemiyle başlar

Tarayıcı işlemleri
Şekil 1: Üstte tarayıcı kullanıcı arayüzü; alt tarafta kullanıcı arayüzü, ağ ve depolama iş parçacığı içeren tarayıcı işlemi şeması

1. bölümde (CPU, GPU, Bellek ve çoklu işlem mimarisi) ele aldığımız gibi, sekme dışındaki her şey tarayıcı işlemi tarafından yürütülür. Tarayıcı işleminde, düğmeleri ve tarayıcının giriş alanlarını çizen kullanıcı arayüzü iş parçacığı, internetten veri almak için ağ yığınıyla ilgilenen ağ iş parçacığı, dosyalara erişimi kontrol eden depolama iş parçacığı ve daha fazlası bulunur. Adres çubuğuna bir URL yazdığınızda, girişiniz tarayıcı işleminin kullanıcı arayüzü iş parçacığı tarafından işlenir.

Basit bir gezinme

1. adım: Girişi işleme

Kullanıcı adres çubuğuna yazmaya başladığında, kullanıcı arayüzü iş parçacığı ilk olarak "Bu bir arama sorgusu mu yoksa URL mi?" sorusu olur. Chrome'da adres çubuğu aynı zamanda bir arama giriş alanıdır. Bu yüzden, kullanıcı arayüzü iş parçacığının sizi bir arama motoruna mı yoksa istediğiniz siteye mi yönlendireceğine karar vermesi gerekir.

Kullanıcı girişini işleme
Şekil 1: Girişin bir arama sorgusu mu URL mi olduğunu soran kullanıcı arayüzü iş parçacığı

2. Adım: Navigasyonu başlatın

Bir kullanıcı Enter tuşuna bastığında, kullanıcı arayüzü iş parçacığı site içeriğini almak için bir ağ çağrısı başlatır. Sekmenin köşesinde yükleme döner simgesi görüntülenir ve ağ iş parçacığı DNS araması ve istek için TLS Bağlantısı oluşturma gibi uygun protokollerden geçer.

Gezinme başlangıcı
Şekil 2: mysite.com'a gitmek için ağ iş parçacığıyla konuşan kullanıcı arayüzü iş parçacığı

Bu noktada ağ iş parçacığı HTTP 301 gibi bir sunucu yönlendirme başlığı alabilir. Bu durumda ağ iş parçacığı, sunucunun yönlendirme isteğinde bulunduğu kullanıcı arayüzü iş parçacığıyla iletişim kurar. Ardından, başka bir URL isteği başlatılır.

3. Adım: Yanıtı okuyun

HTTP yanıtı
Şekil 3: Gerçek veriler olan içerik türünü ve yükü içeren yanıt başlığı

Yanıt gövdesi (yük) gelmeye başladığında, ağ iş parçacığı gerekirse akışın ilk birkaç baytına bakar. Yanıtın Content-Type üstbilgisinde ne tür veri olduğu belirtilmelidir. Ancak eksik veya yanlış olabileceği için MIME Türü yoklama burada yapılır. Bu, kaynak kodda yorumlandığı gibi "sıralı bir işletmedir". Farklı tarayıcıların içerik türü/yük çiftlerini nasıl işlediğini görmek için yorumu okuyabilirsiniz.

Yanıt bir HTML dosyasıysa bir sonraki adım verileri oluşturucu işlemine aktarmaktır. Ancak bu bir zip dosyası veya başka bir dosyaysa bu bir indirme isteğidir ve verileri indirme yöneticisine iletmeleri gerekir.

MIME türü yoklama
Şekil 4: Yanıt verilerinin güvenli bir siteye ait HTML olup olmadığını soran ağ ileti dizisi

SafeBrowsing kontrolü de burada gerçekleşir. Alan ve yanıt verileri bilinen bir kötü amaçlı siteyle eşleşiyorsa ağ iş parçacığı bir uyarı sayfası gösterir. Buna ek olarak, siteler arası hassas verilerin oluşturucu işlemine ulaşmadığından emin olmak için Cs CdaClocking (C) kontrolü yapılır.

4. Adım: Oluşturucu işlemi bulun

Tüm kontroller tamamlandıktan ve Ağ iş parçacığı tarayıcının istenen siteye gitmesi gerektiğinden emin olduktan sonra, Ağ iş parçacığı kullanıcı arayüzü iş parçacığına verilerin hazır olduğunu bildirir. UI iş parçacığı daha sonra web sayfasının oluşturulmasına devam etmek için bir oluşturucu süreci bulur.

Oluşturucu bulma işlemi
Şekil 5: Kullanıcı arayüzü iş parçacığının Oluşturucu İşlemini bulmasını söyleyen ağ iş parçacığı

Ağ isteğine yanıt verilmesi birkaç yüz milisaniye sürebileceğinden, bu süreci hızlandırmak için bir optimizasyon uygulanır. Kullanıcı arayüzü iş parçacığı 2. adımda ağ iş parçacığına bir URL isteği gönderirken hangi siteye gittiğini zaten bilir. Kullanıcı arayüzü iş parçacığı, ağ isteğine paralel olarak bir oluşturucu işlemini proaktif bir şekilde bulmaya veya başlatmaya çalışır. Bu şekilde, her şey beklendiği gibi giderse ağ iş parçacığı veri aldığında oluşturucu işlemi zaten bekleme konumunda olur. Gezinme siteler arası yönlendirme yapıyorsa bu bekleme işlemi kullanılamayabilir. Bu durumda farklı bir işlem gerekebilir.

5. Adım: Gezinmeyi kaydedin

Veriler ve oluşturucu süreci hazır olduğuna göre gezinmeyi gerçekleştirmek için tarayıcı işleminden oluşturucu işlemine bir IPC gönderilir. Ayrıca, oluşturucu işleminin HTML verilerini almaya devam edebilmesi için veri akışını aktarır. Tarayıcı işlemi, oluşturucuda kaydetme işleminin gerçekleştiğine dair onayı duyduğunda gezinme tamamlanır ve belge yükleme aşaması başlar.

Bu noktada adres çubuğu güncellenir ve güvenlik göstergesi ile site ayarları kullanıcı arayüzü, yeni sayfanın site bilgilerini yansıtır. Sekmenin oturum geçmişi, geri-ileri düğmelerinin az önce gidilen sitede gezinmesini sağlayacak şekilde güncellenir. Bir sekmeyi veya pencereyi kapattığınızda sekme/oturum geri yüklemeyi kolaylaştırmak için oturum geçmişi diskte depolanır.

Gezinmeyi başlatın
Şekil 6: Tarayıcı ve oluşturucu işlemleri arasındaki IPC, sayfanın oluşturulmasını ister

Ekstra Adım: İlk yükleme tamamlandı

Gezinme tamamlandıktan sonra, oluşturucu işlemi kaynakları yüklemeye devam eder ve sayfayı oluşturur. Bu aşamada neler olduğuyla ilgili ayrıntıları bir sonraki gönderide ele alacağız. Oluşturucu işlemi, oluşturma işlemini "bittiğinde" tarayıcı işlemine geri bir IPC gönderir (bu, tüm onload etkinliklerinin sayfadaki tüm çerçevelerde tetiklenmesinden ve yürütülmesinden sonra gerçekleşir). Bu noktada, UI iş parçacığı sekmedeki yükleme döner simgesini durdurur.

"Bitti" diyorum çünkü istemci taraflı JavaScript yine de ek kaynaklar yükleyebilir ve bu noktadan sonra yeni görünümler oluşturabilir.

Sayfa bitişi yükleme
Şekil 7: Sayfanın "yüklendiğini" bildirmek için oluşturucudan tarayıcı işlemine IPC

Basit gezinme tamamlandı! Peki kullanıcı adres çubuğuna tekrar farklı bir URL eklerse ne olur? Tarayıcı işlemi, farklı siteye gitmek için aynı adımlardan geçer. Ancak bunu yapmadan önce, geçerli olarak oluşturulmuş siteyle iletişime geçerek beforeunload etkinliğini önemsiyor olup olmadığını kontrol etmesi gerekiyor.

Sayfadan çıkmaya veya sekmeyi kapatmaya çalıştığınızda beforeunload "Bu siteden çıkılsın mı?" uyarısı oluşturabilir. JavaScript kodunuz da dahil olmak üzere bir sekmenin içindeki her şey oluşturucu işlemi tarafından işlenir. Bu nedenle, yeni gezinme isteği geldiğinde tarayıcı işleminin mevcut oluşturucu sürecini kontrol etmesi gerekir.

beforeunload etkinlik işleyici
Şekil 8: Tarayıcı işleminden, farklı bir siteye gitmek üzere olduğunu belirten bir oluşturucu işlemine IPC

Gezinme, oluşturucu işleminden başlatıldıysa (ör. kullanıcının bir bağlantıyı tıklaması veya istemci taraflı JavaScript'in window.location = "https://newsite.com" çalıştırması) oluşturucu işlemi, ilk olarak beforeunload işleyicilerini kontrol eder. Daha sonra, tarayıcı işlemiyle başlatılan gezinmeyle aynı süreçten geçer. Tek fark, gezinme isteğinin oluşturucu işleminden tarayıcı işlemine başlatılmasıdır.

Yeni gezinme mevcut siteden farklı bir siteye yapıldığında, yeni gezinmeyi işlemek için ayrı bir oluşturma süreci çağrılır ve mevcut oluşturma işlemi unload gibi etkinliklerin işlenmesi için tutulur. Daha fazla bilgi için sayfa yaşam döngüsü durumlarına genel bakış ve Page Lifecycle API ile etkinliklere nasıl dahil olabileceğinizi inceleyin.

yeni gezinme ve kaldırma
Şekil 9: Bir tarayıcı işleminden yeni bir oluşturucu işlemine kadar 2 IPC, sayfanın oluşturulmasını söyler ve eski oluşturucu işleminin yüklemesini kaldırmasını söyler

Hizmet Çalışanı söz konusu olduğunda

Bu gezinme sürecinde kısa süre önce yapılan değişikliklerden bir tanesi de Service Worker özelliğinin kullanıma sunulmasıdır. Service Worker, uygulama kodunuza ağ proxy'si yazmanın bir yoludur. Bu sayede web geliştiricileri, nelerin yerel olarak önbelleğe alınacağı ve ağdan ne zaman yeni veri alınacağı konusunda daha fazla kontrole sahip olur. Service Worker sayfayı önbellekten yükleyecek şekilde ayarlanmışsa verileri ağdan istemeye gerek yoktur.

Unutulmaması gereken önemli nokta, Service Worker'ın bir oluşturucu işleminde çalışan JavaScript kodu olduğudur. Ancak gezinme isteği geldiğinde tarayıcı süreci sitede bir hizmet çalışanı olduğunu nasıl anlar?

Hizmet çalışanı kapsam araması
Şekil 10: Hizmet çalışanı kapsamını arayan tarayıcı işlemindeki ağ iş parçacığı

Hizmet çalışanı kaydedildiğinde hizmet çalışanının kapsamı referans olarak tutulur (bu Hizmet Çalışanı Yaşam Döngüsü makalesinde kapsam hakkında daha fazla bilgi edinebilirsiniz). Gezinme olduğunda, ağ iş parçacığı alanı kayıtlı hizmet çalışanı kapsamlarına göre kontrol eder. Bu URL için bir hizmet çalışanı kayıtlıysa kullanıcı arayüzü iş parçacığı, hizmet çalışanı kodunu yürütmek için bir oluşturucu işlemi bulur. Service Worker önbellekten veri yükleyerek ağdan veri isteme ihtiyacını ortadan kaldırabilir veya ağdan yeni kaynaklar isteyebilir.

hizmet çalışanı gezinmesi
Şekil 11: Hizmet çalışanlarını işlemek için oluşturucu işlemini başlatan bir tarayıcı işlemindeki kullanıcı arayüzü iş parçacığı; oluşturucu işlemindeki bir çalışan iş parçacığı, daha sonra ağdan veri ister

Tarayıcı işlemi ile oluşturucu işlemi arasındaki bu gidiş dönüş yolculuğun, hizmet çalışanının en sonunda ağdan veri istemeye karar vermesi durumunda gecikmelere neden olabileceğini görebilirsiniz. Gezinme Önceden Yükleme, kaynakları hizmet çalışanı başlatmasına paralel olarak yükleyerek bu süreci hızlandırmayı amaçlayan bir mekanizmadır. Bu istekleri üstbilgiyle işaretleyerek, sunucuların bu istekler için farklı içerik göndermeye karar vermesine olanak tanır (örneğin, tam bir belge yerine yalnızca güncellenmiş veriler).

Gezinme önceden yükleme
Şekil 12: paralel olarak ağ isteği başlatırken hizmet çalışanı işlemek için oluşturucu işlemi başlatan tarayıcı sürecindeki kullanıcı arayüzü iş parçacığı

Özet

Bu yayında, gezinme sırasında neler olduğuna ve yanıt başlıkları ve istemci taraflı JavaScript'in tarayıcıyla nasıl etkileşime girdiğine değindik. Tarayıcının ağdan veri almak için uyguladığı adımları bilmek, gezinme önceden yükleme gibi API'lerin neden geliştirildiğini anlamayı kolaylaştırır. Bir sonraki yayında, tarayıcının sayfaları oluşturmak için HTML/CSS/JavaScript'imizi nasıl değerlendirdiğini ele alacağız.

Gönderiyi beğendiniz mi? Gelecekteki gönderimizle ilgili sorularınız veya önerileriniz varsa aşağıdaki yorum bölümünden ya da Twitter'daki @kosamari adresinden bize ulaşabilirsiniz.

Sıradaki: Oluşturucu Sürecinin iç çalışmaları