Bir tarayıcı sunucuya bağlandığında bağlantıyı kim yönetir: istemci mi, sunucu mu? HTTP ile WebSocket karşılaştırılırken sıkça “HTTP’de istemci, WebSocket’te iki taraf kontrol sahibidir” denir. Bu kullanışlı ama eksik bir özettir. Gerçekte TCP bağlantısının iki ucu, protokol kuralları, proxy zaman aşımı ve uygulama yaşam döngüsü birlikte söz sahibidir.

Devamı...
Adres çubuğundaki küçük kilit simgesi, tarayıcınız ile sunucu arasında görünmez ama oldukça hareketli bir tanışma gerçekleştiğini gösterir. TLS handshake adı verilen bu süreçte taraflar kullanılacak şifreleme yöntemini belirler, sunucu kimliğini kanıtlar ve oturuma özel anahtarlar üretir. Üstelik bütün bunlar çoğunlukla birkaç ağ turunda, siz daha sayfanın açılmasını beklerken tamamlanır.
Devamı...
Tarayıcıya bir adres yazıp Enter tuşuna bastığınızda veri hemen akmaya başlamaz. TCP kullanan istemci ile sunucu önce birbirlerini bulduklarını, iletişime hazır olduklarını ve başlangıç sıra numaralarını kabul ettiklerini doğrular. TCP üçlü el sıkışması denilen SYN, SYN-ACK ve ACK paketleri tam olarak bu hazırlığı gerçekleştirir.
Devamı...
Bir process kendi sanal adres alanında yaşayan, komşusunun değişkenlerine doğrudan dokunamayan küçük bir ada gibidir. Ancak gerçek uygulamalarda bu adaların veri paylaşması gerekir. İşte Inter-Process Communication (IPC) mekanizmaları, process’ler arasında köprü kurar. Pipe akış sunar, shared memory ortak bir çalışma masası sağlar, message queue ise düzenli bir posta kutusu gibi davranır.
Devamı...
Bir web sitesinin geç açılması, görüntülü görüşmenin robot sesine dönüşmesi veya çevrim içi oyunda karakterinizin duvara doğru koşmaya devam etmesi genellikle “internet yavaş” cümlesiyle açıklanır. Oysa ağ performansı tek bir hız göstergesinden ibaret değildir. Bant genişliği, gecikme, jitter ve paket kaybı birlikte çalışır; bunlardan yalnızca biri kötü olduğunda bile kullanıcı deneyimi dramatik biçimde değişebilir.
Devamı...
Evdeki bilgisayarınızın IP adresi 192.168.1.42, ziyaret ettiğiniz web sitesinin gördüğü adres ise bambaşka olabilir. Bu küçük ağ sihrinin arkasında NAT bulunur. NAT, aynı yerel ağdaki telefon, bilgisayar ve hatta akıllı buzdolabının tek bir genel IP adresini paylaşarak internete çıkmasını sağlar.

Devamı...

İnternete bağlanan her cihazın bir adrese ihtiyacı vardır. Bilgisayarlar, telefonlar, sunucular ve hatta akıllı ampuller, veri paketlerinin nereye gideceğini IP adresleri sayesinde bilir. IPv4 uzun yıllar bu görevi başarıyla yürüttü; ancak internet büyüdükçe 32 bitlik adres alanının sınırları görünür hâle geldi. IPv6’nın 128 bitlik adresleri, yalnızca “daha fazla cihaz bağlayalım” düşüncesinin değil, ölçeklenebilir ve daha düzenli bir internet tasarlama hedefinin sonucudur.
Devamı...

Bir web sayfası açıldığında tarayıcı yalnızca HTML indirmez; CSS, JavaScript, font, görsel ve API yanıtları gibi onlarca kaynağa ihtiyaç duyar. HTTP/1.1 döneminde bu kalabalığı yönetmek için birden fazla TCP bağlantısı açılırdı. HTTP/2 ise multiplexing sayesinde aynı bağlantıyı çok şeritli bir otoyola dönüştürür: farklı istek ve yanıtlar, birbirini tamamlamayı beklemeden eş zamanlı biçimde taşınabilir.
Devamı...

Linux dünyasında bir dosya açtığınızda, ağ bağlantısı kurduğunuzda veya iki süreç arasında pipe oluşturduğunuzda karşınıza küçük bir tamsayı çıkar: file descriptor, yani dosya tanımlayıcısı. İlk bakışta bir metin dosyasıyla ağ soketinin aynı sayı türüyle temsil edilmesi tuhaf görünebilir. Fakat bu yaklaşım, Unix felsefesinin en güçlü fikirlerinden birini uygular: Farklı kaynaklara ortak bir arayüz üzerinden erişmek.
Devamı...
Bilgisayarınızı açtığınızda tarayıcı hemen çalışır, mesajlar gelir ve internet sanki musluktan akan su gibi hazırdır. Oysa cihazınızın ağda konuşabilmesi için önce bir IP adresi, ağ maskesi, ağ geçidi ve DNS sunucusu edinmesi gerekir. Bu otomatik tanışma törenini yöneten protokolün adı DHCP, yani Dynamic Host Configuration Protocol’dür.
Devamı...
Bir veritabanı indeksi, kitabın sonundaki alfabetik dizine benzer: Aradığınız bilgiye bütün sayfaları okumadan ulaşmanızı sağlar. Ancak kitaba her yeni cümle eklendiğinde dizini de güncellemek zorunda olduğunuzu düşünün. İşte indekslerin karanlık tarafı burada ortaya çıkar: Okumayı hızlandırırken yazma işlemlerine ek maliyet yüklerler.
Devamı...

Bir uygulamayı tek sunucudan çıkarıp dünyanın farklı bölgelerindeki sunuculara dağıttığınızda işler hızlanabilir, sistem daha dayanıklı olabilir ve kullanıcılar uygulamaya daha kolay ulaşabilir. Ancak ağ bağlantıları koptuğunda önemli bir seçim kapıyı çalar: Sistem doğru cevabı mı beklemeli, yoksa elindeki bilgiyle hemen cevap mı vermeli? CAP teoremi, dağıtık sistemlerin bu tatsız fakat kaçınılmaz ikilemini açıklar.
Devamı...
Bilgisayarınız aynı yerel ağdaki bir sunucuya paket göndermek istediğinde hedefin IP adresini biliyor olabilir; fakat Ethernet çerçevesini teslim edebilmek için bir de fiziksel, yani MAC adresine ihtiyaç duyar. İşte ARP (Address Resolution Protocol), “Bu IP adresi kimde ve MAC adresi nedir?” sorusunu ağdaki cihazlara sorarak iki adresleme dünyası arasında köprü kurar.

Devamı...
Bir IP adresini genellikle tek bir sunucunun internet üzerindeki ev adresi gibi düşünürüz. Oysa Anycast dünyasında aynı IP adresi İstanbul, Frankfurt, Singapur ve New York’taki sunucularda eş zamanlı olarak bulunabilir. Kullanıcı bu adresle bağlantı kurduğunda paketler sihirle çoğalmaz; internetin yönlendirme sistemi, kullanıcıyı ağ açısından en uygun noktaya götürür.
Devamı...

Bir banka hesabından diğerine para gönderdiğinizi düşünün. Para sizin hesabınızdan çıktı ama karşı tarafa ulaşmadıysa sistemin hızlı çalışması pek teselli olmaz. Veritabanlarının katılığı tam burada anlam kazanır: ACID, işlemlerin yalnızca çalışmasını değil, hata, elektrik kesintisi ve eşzamanlı kullanıcı baskısı altında bile doğru kalmasını sağlayan ilkeler bütünüdür.
Devamı...

Bir programın onlarca gigabayt bellek kullanıyormuş gibi davranabilmesi, bilgisayarınızda gerçekten o kadar RAM bulunduğu anlamına gelmez. İşletim sistemi, virtual memory (sanal bellek) adı verilen bir illüzyon kurar: Her süreç kendisine ait, düzenli ve geniş bir adres alanı görür. RAM yetersiz kaldığında ise disk, sayfa tabloları ve page fault mekanizması sahneye çıkar.
Devamı...

Ekranda tek parça görünen bir harfin bellekte de tek parça olduğunu düşünmek son derece doğal. Ne var ki bilgisayarlar için “karakter” şaşırtıcı derecede belirsiz bir kavramdır. Bir harf; kod noktası, kod birimi, byte veya kullanıcı tarafından algılanan sembol anlamına gelebilir. Emoji ailesini saymaya kalktığınızda işler tam bir Unicode korku filmine dönüşür.
Devamı...
Bir program bellekteki bir değişkene eriştiğinde işlemci çoğunlukla fiziksel adresi doğrudan kullanmaz. Önce sanal adresin fiziksel bellekte nereye karşılık geldiğini bulması gerekir. Bu çeviri her erişimde baştan yapılsaydı, ışık hızında çalışan işlemcimiz adres defterini karıştıran dalgın bir postacıya dönüşürdü. Translation Lookaside Buffer, yani TLB, yakın zamanda kullanılan adres çevirilerini saklayarak bu sorunu çözen küçük fakat kritik bir önbellektir.
Devamı...
Klasik bir işlemciyi her çevrimde tek iş yapan bir aşçı gibi düşünebiliriz. Superscalar işlemci ise aynı mutfakta birden fazla çalışma tezgâhı kullanır: biri toplama yaparken diğeri bellekten malzeme getirir, bir başkası koşulu kontrol eder. Böylece uygun komutlar, tek bir saat çevrimi içinde farklı yürütme birimlerinde eş zamanlı olarak ilerleyebilir.

Devamı...

Bir işlemciye aynı toplama komutunu binlerce sayı için tekrarlatmak, kasadaki görevliye ürünleri tek tek uzatmaya benzer. SIMD ise ürünleri banda dizip birkaçını birlikte işleme fikridir. Görüntü işleme, oyun motorları, bilimsel hesaplama ve yapay zekâ gibi alanlarda doğru kullanıldığında ciddi hız kazandırır; ancak “tek komut” ifadesi, bütün işin sihirli biçimde tek saat çevriminde biteceği anlamına gelmez.
Devamı...