Soru bankası · Altyapı

Ağ temelleri: TCP, DNS, HTTP, TLS

Backend geliştiricinin bilmesi gereken ağ konuları: katmanlar, TCP ve UDP, DNS çözümleme, HTTP/1.1-2-3, TLS el sıkışması, load balancer, proxy, CIDR ve NAT, timeout'lar ve bağlantı havuzları. Başlangıçtan ileri seviyeye mülakat soruları.

20 soru12 çoktan seçmeli
Konu özeti

Backend mülakatlarında ağ soruları genelde iki amaçla sorulur: "tarayıcıya adres yazınca ne olur" gibi bir soruyla adayın uçtan uca resmi görüp görmediğini anlamak, ve production'da karşılaşılan sorunları (timeout, bağlantı tükenmesi, yavaş DNS, TLS hatası) ağ katmanında düşünebiliyor mu diye bakmak. Ağ mühendisi kadar derin bilmen beklenmez; ama bir isteğin hangi katmanlardan geçtiğini ve her katmanda neyin bozulabileceğini anlatabilmen beklenir.

Katmanlar

Pratikte TCP/IP modeli kullanılır; OSI'nin yedi katmanı daha çok terminoloji için anılır ("L4 load balancer", "L7 proxy").

KatmanOSI karşılığıÖrnekAdresleme
UygulamaL7 (5-7)HTTP, gRPC, DNS, SMTPURL, host adı
TaşımaL4TCP, UDP, QUIC (UDP üstünde)Port
AğL3IP, ICMPIP adresi
BağlantıL2 (1-2)Ethernet, Wi-FiMAC adresi

TLS tam olarak bir katmana oturmaz: TCP'nin üstünde, HTTP'nin altında çalışır. Bu yüzden bir L4 load balancer şifreli trafiği açmadan iletebilir; L7 load balancer ise HTTP başlığını, path'i ya da cookie'yi okuyacaksa TLS'i sonlandırmak zorundadır.

TCP ve UDP

TCP bağlantı yönelimlidir: üçlü el sıkışma (SYN, SYN-ACK, ACK) ile bağlantı kurulur; veri sıralı, kayıpsız ve tekrarsız teslim edilir. Kayıp paket yeniden gönderilir, akış kontrolü (alıcının penceresi) ve tıkanıklık kontrolü (ağın kapasitesi) gönderim hızını ayarlar. Bunun bedeli gecikmedir: bağlantı kurmak en az bir tur (RTT) sürer, kayıp bir paket arkasındaki tüm verinin uygulamaya teslimini bekletir (head-of-line blocking).

UDP bağlantısızdır: paket gönderilir, teslim, sıra ya da tekrar garantisi yoktur. Bu yüzden hafif ve hızlıdır; DNS sorguları, video/ses akışı ve oyunlar UDP kullanır. Güvenilirlik gerekiyorsa uygulama kendisi sağlar. QUIC tam olarak budur: UDP üstünde güvenilirlik, akış başına sıralama ve dahili TLS 1.3; HTTP/3 QUIC üzerinde çalışır.

Bağlantı kapanırken önce kapatan taraf TIME_WAIT durumunda bir süre bekler (Linux'ta 60 saniye). Saniyede binlerce kısa ömürlü bağlantı açıp kapatan bir servis, istemci tarafında ephemeral port'larını (Linux'ta varsayılan 32768-60999) tüketebilir. Çözüm genelde kernel ayarı değil, bağlantıyı yeniden kullanmaktır: HTTP keep-alive ve bağlantı havuzu.

DNS

DNS, api.example.com gibi bir adı IP adresine çevirir. Akış: uygulama işletim sisteminin resolver'ına sorar; o önce kendi cache'ine ve /etc/hosts'a bakar, sonra recursive resolver'a (şirket DNS'i, ISP ya da 8.8.8.8) gider. Recursive resolver cache'inde yoksa sırayla root sunucusuna, .com TLD sunucusuna ve alan adının authoritative sunucusuna sorar ve cevabı TTL süresince cache'ler.

KayıtAnlamı
A / AAAAAd → IPv4 / IPv6 adresi
CNAMEAd → başka bir ad (takma ad)
MXE-posta sunucusu
TXTDoğrulama, SPF, DKIM gibi metin kayıtları
NSBu alanın authoritative sunucuları

TTL bir ödünleşimdir: uzun TTL daha az sorgu ve daha hızlı çözümleme demektir ama IP değişikliği (failover, taşıma) geç yayılır. Planlı bir taşımadan önce TTL düşürülür. Java tarafında bir tuzak var: JVM DNS cevaplarını kendi içinde de cache'ler (networkaddress.cache.ttl). Load balancer IP'leri değişen bir ortamda bu değerin makul olması gerekir.

HTTP sürümleri

SürümTaşımaÖne çıkan özellikKalan sorun
HTTP/1.1TCPKeep-alive ile bağlantı yeniden kullanımıBir bağlantıda aynı anda tek istek; tarayıcılar alan başına ~6 bağlantı açar
HTTP/2TCPTek bağlantıda çoklu akış (multiplexing), ikili çerçeveler, başlık sıkıştırma (HPACK)TCP seviyesinde head-of-line blocking: bir paket kaybı tüm akışları bekletir
HTTP/3QUIC (UDP)Akışlar birbirinden bağımsız, el sıkışma daha hızlı, bağlantı göçü (IP değişse de devam)Bazı kurumsal ağlar UDP'yi kısıtlar; o zaman HTTP/2'ye düşülür

gRPC HTTP/2 üzerinde çalışır; uzun ömürlü tek bağlantı kullandığı için L4 load balancer'da yükü dengesiz dağıtabilir (bkz. İleri seviye soru).

TLS ve HTTPS

TLS üç şey sağlar: gizlilik (şifreleme), bütünlük (veri yolda değişmedi) ve kimlik doğrulama (karşı taraf gerçekten o sunucu). TLS 1.3 el sıkışması bir turda (1-RTT) biter: istemci desteklediği şifre takımlarını ve anahtar paylaşımını gönderir; sunucu kendi anahtar paylaşımını ve sertifikasını gönderir. İstemci sertifika zincirini güvendiği kök otoritelere (CA) kadar doğrular ve sertifikadaki adın bağlandığı adla eşleştiğini kontrol eder. Oturum anahtarı Diffie-Hellman ile türetilir; bu sayede sunucunun özel anahtarı ileride çalınsa bile geçmiş trafik çözülemez (forward secrecy).

mTLS'te sunucu da istemciden sertifika ister. Servisler arası iletişimde ve bankacılıkta kurum-kurum entegrasyonlarında sık görülür; service mesh'ler (Istio, Linkerd) bunu otomatikleştirir. Sertifikaların süresi dolar: production kesintilerinin klasik sebeplerinden biri yenilenmeyen sertifikadır, bu yüzden bitiş tarihi izlenir ve yenileme otomatikleştirilir.

Load balancer, proxy ve CDN

  • Forward proxy istemcinin önünde durur, istemci adına dışarı çıkar (kurumsal çıkış proxy'si).
  • Reverse proxy sunucuların önünde durur: TLS sonlandırma, yönlendirme, sıkıştırma, cache, rate limiting (Nginx, Envoy).
  • L4 load balancer IP ve port'a bakar, TCP bağlantısını bir hedefe iletir; hızlıdır, içeriği görmez (AWS NLB).
  • L7 load balancer HTTP'yi anlar: path ya da host'a göre yönlendirme, başlık ekleme, istek bazında dağıtım (AWS ALB, Nginx).
  • CDN statik içeriği (ve bazen API cevaplarını) kullanıcıya yakın uç sunuculardan servis eder; gecikmeyi ve origin yükünü azaltır.

Load balancer arkasındaki uygulama istemcinin gerçek IP'sini X-Forwarded-For başlığından öğrenir. Bu başlık istemci tarafından da gönderilebildiği için yalnızca güvenilen proxy'lerin eklediği değer okunmalıdır (Spring Boot'ta server.forward-headers-strategy).

IP adresleme, CIDR ve NAT

10.0.0.0/16 gösteriminde /16, ilk 16 bitin ağı tanımladığını söyler; geriye 16 bit, yani 65.536 adres kalır. /24 256 adres demektir. Özel (internette yönlendirilmeyen) aralıklar RFC 1918'de tanımlıdır: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16. Özel ağdaki makineler internete NAT üzerinden çıkar: NAT kaynak adresi kendi genel adresiyle değiştirir ve dönen cevabı doğru makineye geri iletir. İçeriden dışarı bağlantı açılabilir, dışarıdan içeri açılamaz.

Timeout'lar ve bağlantı havuzları

Bir HTTP çağrısında en az üç ayrı süre vardır: connect timeout (TCP ve TLS bağlantısı kurulamıyor), read/response timeout (bağlantı var ama cevap gelmiyor) ve havuzdan bağlantı alma timeout'u (havuz dolu, sıra bekleniyor). Hiçbirinin sonsuz bırakılmaması gerekir: yavaş bir bağımlılık thread'leri tutar, thread'ler tükenir ve hata zincirleme yayılır (bkz. Kitap Bölüm 14). Bağlantı havuzu (HikariCP, Apache HttpClient, Reactor Netty) el sıkışma maliyetini bir kez öder; havuz boyutu ve bekleme süresi, yük altında davranışı doğrudan belirler.

Sorular (20)

01BaşlangıçTahminidnstcptlshttp

Tarayıcıya bir adres yazıp Enter'a bastığında neler olur?

02BaşlangıçTahminitcpudptasima-katmani

TCP ile UDP arasındaki fark nedir? Hangisini ne zaman kullanırsın?

03BaşlangıçTahminitcphandshake

TCP üçlü el sıkışması nasıl çalışır, neden üç adım?

04BaşlangıçTahminidnsttlcache

DNS nasıl çalışır? TTL ne işe yarar?

05BaşlangıçTahminihttpstlssertifika

HTTP ile HTTPS arasındaki fark nedir? TLS ne sağlar?

06OrtaTahminihttp2http3quicmultiplexing

HTTP/1.1, HTTP/2 ve HTTP/3 arasındaki farklar nelerdir?

07BaşlangıçTahminiproxyreverse-proxyload-balancer

Forward proxy, reverse proxy ve load balancer arasındaki fark nedir?

08OrtaTahminiload-balancerl4l7alb

L4 ve L7 load balancer arasındaki fark nedir?

09BaşlangıçTahminicidrsubnetip

CIDR gösterimi nedir? 10.0.0.0/16 kaç adres içerir?

10BaşlangıçTahmininatozel-iprfc1918

NAT nedir, özel IP adresleri neden var?

11OrtaTahminitimeouthttp-clientdayaniklilik

Connect timeout ile read timeout arasındaki fark nedir? Neden ikisini de ayarlamalısın?

12OrtaTahminikeep-aliveconnection-poolperformans

Keep-alive ve bağlantı havuzu neden önemli?

13OrtaTahminiwebsocketsselong-pollinggercek-zamanli

WebSocket, Server-Sent Events ve long polling arasındaki fark nedir?

14İleriTahminitlshandshakesertifikaforward-secrecy

TLS el sıkışması adım adım nasıl işler?

15İleriTahminitcptime-waitephemeral-porturetim-sorunu

TIME_WAIT nedir? Bir servisin ephemeral port'ları neden tükenir?

16İleriTahminigecikmetroubleshootingdnstls

Sistemin gecikmesi aniden arttı. Ağ tarafında neleri kontrol edersin?

17İleriTahminiconnection-resetkeep-aliveidle-timeouturetim-sorunu

Servis içinde bir HTTP isteği neden "connection reset by peer" ile düşer?

18OrtaTahminicdncacheedge

CDN ne işe yarar, API'ler için de kullanılır mı?

19OrtaTahminidnsttlmigrationcutover

Bir DNS kaydını değiştirerek trafiği yeni sunucuya taşıyacaksın. Nasıl planlarsın?

20İleriTahminimtlszero-trustservice-meshsertifika

Servisler arası iletişimde mTLS neden kullanılır, maliyeti nedir?

Çoktan seçmeli (12)

01Başlangıç

DNS sorguları neden çoğunlukla UDP kullanır?

Tek doğru cevap var.

02Başlangıç

10.0.0.0/24 aralığında toplam kaç IP adresi vardır?

Tek doğru cevap var.

03Başlangıç

Aşağıdakilerden hangileri RFC 1918'de tanımlı özel IP aralıklarıdır?

Birden fazla doğru olabilir.

04Başlangıç

HTTPS'te sertifika doğrulamasının asıl amacı nedir?

Tek doğru cevap var.

05Başlangıç

Reverse proxy için hangisi doğrudur?

Tek doğru cevap var.

06Orta

HTTP/2'de tek bir TCP paketinin kaybolması ne sonuç doğurur?

Tek doğru cevap var.

07Orta

Kubernetes'te gRPC istemcisi, L4 load balancer arkasındaki üç pod'dan sadece birine trafik gönderiyor. En olası sebep nedir?

Tek doğru cevap var.

08Orta

Bir HTTP istemcisinde hangi süre sınırları ayrı ayrı ayarlanmalıdır?

Birden fazla doğru olabilir.

09Orta

Bir servis birkaç dakika boşta kaldıktan sonraki ilk istekte 'connection reset' alıyor. En olası sebep nedir?

Tek doğru cevap var.

10İleri

TLS 1.3 hakkında hangileri doğrudur?

Birden fazla doğru olabilir.

11İleri

Bir istemcide çok sayıda TIME_WAIT bağlantısı ve 'cannot assign requested address' hatası görülüyor. İlk yapılması gereken nedir?

Tek doğru cevap var.

12İleri

Kimlik doğrulamalı bir API cevabının CDN üzerinden başka kullanıcılara sızmasını önlemek için hangileri doğru önlemlerdir?

Birden fazla doğru olabilir.

Kaynaklar

  • RFC 9293: Transmission Control Protocol (TCP)
  • RFC 1918: Address Allocation for Private Internets
  • RFC 1034 / RFC 1035: Domain Names
  • RFC 9110: HTTP Semantics; RFC 9113: HTTP/2; RFC 9114: HTTP/3; RFC 9000: QUIC
  • RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3
  • MDN Web Docs: Server-sent events, WebSockets API, HTTP caching
  • Kitap Bölüm 14 (dayanıklılık), Bölüm 15 (Kubernetes ve gözlemlenebilirlik), Bölüm 18 (REST API tasarımı)