<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TAHA TÜZEL</title>
    <description>The latest articles on DEV Community by TAHA TÜZEL (@tahatuzel).</description>
    <link>https://dev.to/tahatuzel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4105742%2F7f19128b-3348-431f-93ca-c247d1cdcc61.jpg</url>
      <title>DEV Community: TAHA TÜZEL</title>
      <link>https://dev.to/tahatuzel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tahatuzel"/>
    <language>en</language>
    <item>
      <title>URL'den Response'a: Tarayıcıda Ne Oluyor?</title>
      <dc:creator>TAHA TÜZEL</dc:creator>
      <pubDate>Sun, 27 Sep 2026 13:03:40 +0000</pubDate>
      <link>https://dev.to/tahatuzel/urlden-responsea-tarayicida-ne-oluyor-34l</link>
      <guid>https://dev.to/tahatuzel/urlden-responsea-tarayicida-ne-oluyor-34l</guid>
      <description>&lt;p&gt;Her gün interneti kullanıyorum; bir siteye erişmek için adresi yazıp Enter'a basıyorum. Projelerde frontend tarafında &lt;code&gt;fetch&lt;/code&gt; çağırıyorum, backend tarafında route tanımlıyorum. Bunlar sürekli kullandığım şeyler olsa da Browser ile Server arasında o kısa sürede tam olarak neler yaşandığı uzun süre benim için biraz ezberlenmiş bilgilerden ibaretti.&lt;/p&gt;

&lt;p&gt;İzlediğim eğitim videolarının ve okuduğum blog yazılarının büyük bölümü benzer bir şablon üzerinden ilerliyordu:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;DNS telefon rehberidir, IP bulunur, sayfa gelir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bu anlatım genel resmi anlamak için yeterli olsa da arka planda gerçekleşen süreci daha detaylı görmek istedim.&lt;/p&gt;

&lt;p&gt;Bu nedenle teorik konuları çalışırken birkaç küçük lab yaptım; &lt;code&gt;nslookup&lt;/code&gt; ve &lt;code&gt;curl&lt;/code&gt; gibi araçlarla Request'in geçtiği adımları incelemeye çalıştım. Bu yazıda hem çalışma sırasında çıkardığım notları hem de kullandığım terminal komutlarını ve aldığım çıktıları tek bir akış altında topladım.&lt;/p&gt;




&lt;h3&gt;
  
  
  Büyük Resim: Request Nereden Geçiyor?
&lt;/h3&gt;

&lt;p&gt;İlk olarak genel akışı oturtmak gerekiyor.&lt;/p&gt;

&lt;p&gt;Browser'a bir adres yazıp Enter'a bastığımızda süreç kabaca şu sırayla ilerliyor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;URL girilir&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS&lt;/strong&gt;, domain adını IP adresine çevirir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TCP connection&lt;/strong&gt; kurulur.&lt;/li&gt;
&lt;li&gt;HTTPS kullanılıyorsa &lt;strong&gt;TLS handshake&lt;/strong&gt; gerçekleştirilir.&lt;/li&gt;
&lt;li&gt;Client, &lt;strong&gt;HTTP request&lt;/strong&gt; gönderir.&lt;/li&gt;
&lt;li&gt;Server, &lt;strong&gt;HTTP response&lt;/strong&gt; döndürür.&lt;/li&gt;
&lt;li&gt;Browser gelen içeriği işleyerek &lt;strong&gt;sayfayı render eder&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kısaca:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;URL → DNS → TCP → TLS → HTTP Request → HTTP Response → Render&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu iletişimde temelde iki taraf bulunuyor.&lt;/p&gt;

&lt;p&gt;Request'i başlatan taraf &lt;strong&gt;Client&lt;/strong&gt;. Bu bir Browser, mobil uygulama veya terminalde kullandığımız &lt;code&gt;curl&lt;/code&gt; olabilir.&lt;/p&gt;

&lt;p&gt;Karşı tarafta ise Request'e Response üreten &lt;strong&gt;Server&lt;/strong&gt; bulunuyor. Bu Server tarafında Nginx, Apache, Go veya Node.js ile çalışan bir servis olabilir.&lt;/p&gt;

&lt;p&gt;Akış ilk bakışta oldukça basit görünüyor. Ancak her adımın içine girdiğimizde arka planda çok daha fazla mekanizmanın çalıştığını görüyoruz.&lt;/p&gt;




&lt;h3&gt;
  
  
  Adım 1: Yazdığımız URL Nelerden Oluşuyor?
&lt;/h3&gt;

&lt;p&gt;Süreci anlamak için önce Browser'a yazdığımız URL'nin yapısına bakalım.&lt;/p&gt;

&lt;p&gt;Örnek olarak biraz uzun bir URL'yi parçalarına ayıralım:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://api.example.com:443/products/5?category=tech&amp;amp;sort=asc#reviews&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://   api.   example   .com   :443   /products/5   ?category=tech&amp;amp;sort=asc   #reviews
│          │      │         │      │      │             │                         │
Scheme     Sub-   Domain    TLD    Port   Path          Query Parameters          Fragment
           domain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buradaki her parçanın farklı bir görevi var:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scheme (&lt;code&gt;https&lt;/code&gt;):&lt;/strong&gt; İletişimde hangi protocol'ün kullanılacağını belirtir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subdomain (&lt;code&gt;api&lt;/code&gt;):&lt;/strong&gt; Ana domain altında bulunan özelleşmiş servisi ifade eder. &lt;code&gt;app&lt;/code&gt;, &lt;code&gt;cdn&lt;/code&gt; veya &lt;code&gt;api&lt;/code&gt; gibi yapılar burada karşımıza çıkar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain (&lt;code&gt;example&lt;/code&gt;):&lt;/strong&gt; Ana domain adıdır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TLD (&lt;code&gt;.com&lt;/code&gt;):&lt;/strong&gt; Top-Level Domain bölümüdür. &lt;code&gt;.com&lt;/code&gt;, &lt;code&gt;.org&lt;/code&gt;, &lt;code&gt;.net&lt;/code&gt;, &lt;code&gt;.dev&lt;/code&gt; gibi uzantılar bu gruba girer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port (&lt;code&gt;:443&lt;/code&gt;):&lt;/strong&gt; Server üzerinde hangi port'a bağlanılacağını belirtir. HTTP için varsayılan port &lt;code&gt;80&lt;/code&gt;, HTTPS için ise &lt;code&gt;443&lt;/code&gt;'tür. URL içerisinde açıkça yazılmasa bile Browser bunu bilir. Lokal geliştirmede kullandığımız &lt;code&gt;localhost:3000&lt;/code&gt; adresindeki &lt;code&gt;3000&lt;/code&gt; de aynı kavramdır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path (&lt;code&gt;/products/5&lt;/code&gt;):&lt;/strong&gt; Server'dan istenen resource'un yolunu belirtir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query Parameters (&lt;code&gt;?category=tech&amp;amp;sort=asc&lt;/code&gt;):&lt;/strong&gt; Filtreleme veya sıralama gibi işlemler için kullanılan key-value çiftleridir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fragment (&lt;code&gt;#reviews&lt;/code&gt;):&lt;/strong&gt; Sayfa içerisindeki belirli bir bölümü ifade eder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Burada diğer URL bileşenlerinden ayrılan kısım &lt;strong&gt;Fragment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#reviews&lt;/code&gt; Server'a gönderilmez. Browser, sayfayı aldıktan sonra Fragment değerini Client tarafında kullanarak ilgili bölüme gider.&lt;/p&gt;

&lt;p&gt;Yani URL'de gördüğümüz her bölüm HTTP Request'in bir parçası değildir.&lt;/p&gt;




&lt;h3&gt;
  
  
  Adım 2: DNS Sorgusu
&lt;/h3&gt;

&lt;p&gt;URL'nin yapısından sonra sıradaki soru şu:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;wikipedia.org&lt;/code&gt; yazdığımızda bilgisayar karşıdaki Server'ı nasıl buluyor?&lt;/p&gt;

&lt;p&gt;Bilgisayarlar ve Router'lar bizim kullandığımız domain isimleri üzerinden iletişim kurmaz. Ağ üzerindeki cihazlara ulaşabilmek için IP adresleri kullanılır.&lt;/p&gt;

&lt;p&gt;Bu nedenle Browser'ın &lt;code&gt;wikipedia.org&lt;/code&gt; Server'ına ulaşabilmesi için önce bu domain'in arkasındaki IP adresini öğrenmesi gerekir.&lt;/p&gt;

&lt;p&gt;Bu işlemi &lt;strong&gt;DNS — Domain Name System&lt;/strong&gt; gerçekleştirir.&lt;/p&gt;

&lt;p&gt;Browser bir IP adresini bulmaya çalışırken süreç kabaca şu şekilde ilerler:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Önce kendi Cache'ini kontrol eder.&lt;/li&gt;
&lt;li&gt;Ardından işletim sisteminin Cache'ine ve yerel &lt;code&gt;hosts&lt;/code&gt; dosyasına bakılır.&lt;/li&gt;
&lt;li&gt;Burada sonuç bulunamazsa bilgisayarın ağ ayarlarında tanımlanmış &lt;strong&gt;DNS Resolver&lt;/strong&gt; kullanılır. Bu ISP'nin Resolver'ı olabileceği gibi &lt;code&gt;1.1.1.1&lt;/code&gt; veya &lt;code&gt;8.8.8.8&lt;/code&gt; gibi public DNS servisleri de olabilir.&lt;/li&gt;
&lt;li&gt;Resolver da cevabı bilmiyorsa Root DNS Server'lardan başlayarak ilgili TLD Server'a ve sonrasında domain'in Authoritative DNS Server'ına kadar uzanan sorgu süreci çalışır.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Burada önemli kavramlardan biri de &lt;strong&gt;TTL — Time To Live&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DNS record'larında bulunan TTL değeri saniye cinsinden tutulur ve DNS Response'unun Cache içerisinde ne kadar süre saklanabileceğini belirler.&lt;/p&gt;

&lt;p&gt;Bunun pratikte önemli olduğu senaryolardan biri Server migration işlemidir.&lt;/p&gt;

&lt;p&gt;Bir proje başka bir Server'a taşınıyor ve IP adresi değişiyorsa geçişten önce TTL değerinin düşürülmesi faydalı olabilir. Aksi durumda eski IP adresi bazı DNS Cache'lerinde kalmaya devam edebilir ve kullanıcıların bir bölümü eski Server'a yönlenebilir.&lt;/p&gt;

&lt;h4&gt;
  
  
  Terminal Denemesi: &lt;code&gt;wikipedia.org&lt;/code&gt; IP Adresini Bulmak
&lt;/h4&gt;

&lt;p&gt;DNS çözümlemesinin terminalde nasıl göründüğünü incelemek için PowerShell üzerinde &lt;code&gt;nslookup&lt;/code&gt; kullanılabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nslookup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;wikipedia.org&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Server:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;one.one.one.one&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Address:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;1.1.1.1&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Non-authoritative&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;answer:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Name:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;wikipedia.org&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Addresses:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;2a02:ec80:600:ed1a::1&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="mf"&gt;185.15&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;58&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;224&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Çıktıda birkaç önemli bilgi bulunuyor.&lt;/p&gt;

&lt;p&gt;İlk olarak kullanılan DNS Resolver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server:  one.one.one.one
Address: 1.1.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada sorgu Cloudflare'ın &lt;code&gt;1.1.1.1&lt;/code&gt; DNS Resolver'ına gönderiliyor.&lt;/p&gt;

&lt;p&gt;Bir diğer önemli satır:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Non-authoritative answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;1.1.1.1&lt;/code&gt;, Wikipedia'nın Authoritative DNS Server'ı değil. İlgili cevabı öğrenip Client'a ileten Resolver rolünde.&lt;/p&gt;

&lt;p&gt;Response içerisinde iki farklı IP adresi de bulunuyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2a02:ec80:600:ed1a::1
185.15.58.224
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;İlk adres IPv6 tarafındaki &lt;strong&gt;AAAA record&lt;/strong&gt;, ikinci adres ise IPv4 tarafındaki &lt;strong&gt;A record&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Bu kayıt türlerini örnek bir site üzerinden inceleyelim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A record:&lt;/strong&gt; &lt;code&gt;benimsitem.com&lt;/code&gt; adını doğrudan sunucunun IPv4 adresine bağlar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AAAA record:&lt;/strong&gt; A record'un IPv6 adresleri için kullanılan karşılığıdır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CNAME record:&lt;/strong&gt; &lt;code&gt;www.benimsitem.com&lt;/code&gt; adını bir IP adresine değil, &lt;code&gt;benimsitem.com&lt;/code&gt; adına bağlar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Böylece biri &lt;code&gt;www.benimsitem.com&lt;/code&gt; adresini yazdığında DNS önce &lt;code&gt;benimsitem.com&lt;/code&gt; adını, ardından onun A kaydındaki IP adresini bulur. &lt;code&gt;www&lt;/code&gt; için aynı IP adresini ikinci kez yazmam gerekmez. CNAME bir HTTP yönlendirmesi yapmaz; tarayıcıdaki URL değişmez.&lt;/p&gt;

&lt;h4&gt;
  
  
  DNS'e URL Verirsek Ne Oluyor?
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;nslookup&lt;/code&gt; ile şu sorguyu çalıştırdığımızı düşünelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nslookup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http://http.badssl.com/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Server:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;one.one.one.one&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Address:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;1.1.1.1&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="o"&gt;***&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;one.one.one.one&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;can&lt;/span&gt;&lt;span class="s1"&gt;'t find http://http.badssl.com/: Non-existent domain
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buradaki problem DNS'e yalnızca domain vermek yerine bütün URL'nin gönderilmesi.&lt;/p&gt;

&lt;p&gt;DNS'in görevi HTTP ile ilgilenmek değil; domain name resolution yapmaktır.&lt;/p&gt;

&lt;p&gt;Bu nedenle &lt;code&gt;http://&lt;/code&gt; ve sondaki &lt;code&gt;/&lt;/code&gt; domain'in bir parçası değildir.&lt;/p&gt;

&lt;p&gt;Sadece hostname sorgulandığında sonuç alınabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nslookup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http.badssl.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Non-authoritative&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;answer:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Name:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;http.badssl.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Address:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;104.154.89.105&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu küçük deney URL ile domain arasındaki farkı oldukça net gösteriyor.&lt;/p&gt;




&lt;h3&gt;
  
  
  Adım 3: TCP ve UDP
&lt;/h3&gt;

&lt;p&gt;DNS üzerinden IP adresini bulduk.&lt;/p&gt;

&lt;p&gt;Artık hangi Server'a ulaşmak istediğimiz belli. Sıradaki konu ise verinin iki cihaz arasında nasıl taşındığı.&lt;/p&gt;

&lt;p&gt;Transport Layer'da en sık karşılaşılan iki protocol:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TCP&lt;/li&gt;
&lt;li&gt;UDP&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  TCP: Reliable Connection
&lt;/h4&gt;

&lt;p&gt;Web tarafında sık karşılaştığımız protocol'lerden biri TCP.&lt;/p&gt;

&lt;p&gt;Bir HTML dosyasının, API Response'unun veya başka bir verinin yalnızca bir bölümünün ulaşması yeterli değildir. Gönderilen verinin eksiksiz ve doğru sırada karşı tarafa ulaşması gerekir.&lt;/p&gt;

&lt;p&gt;TCP bunu sağlayabilmek için veri transferinden önce Client ve Server arasında bir &lt;strong&gt;Connection&lt;/strong&gt; oluşturur.&lt;/p&gt;

&lt;p&gt;Bu süreç &lt;strong&gt;3-Way Handshake&lt;/strong&gt; olarak adlandırılır:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    autonumber
    participant C as Client (Sender)
    participant S as Server (Receiver)
    C-&amp;gt;&amp;gt;S: SYN
    S-&amp;gt;&amp;gt;C: SYN-ACK
    C-&amp;gt;&amp;gt;S: ACK&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Akış şu şekilde ilerler:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client, Server'a &lt;code&gt;SYN&lt;/code&gt; göndererek Connection başlatmak istediğini bildirir.&lt;/li&gt;
&lt;li&gt;Server, &lt;code&gt;SYN-ACK&lt;/code&gt; ile cevap verir.&lt;/li&gt;
&lt;li&gt;Client, &lt;code&gt;ACK&lt;/code&gt; gönderir ve Connection kurulmuş olur.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Connection kurulduktan sonra veri tek parça halinde gönderilmez. Büyük veri, ağ üzerinde taşınabilecek daha küçük bölümler halinde iletilir.&lt;/p&gt;

&lt;p&gt;TCP burada &lt;strong&gt;sequence number&lt;/strong&gt; kullanır.&lt;/p&gt;

&lt;p&gt;Sequence number'lar Receiver'ın gelen verinin hangi sıraya ait olduğunu anlamasını sağlar. Böylece veri farklı zamanlarda ulaşsa bile doğru sıraya yerleştirilebilir.&lt;/p&gt;

&lt;p&gt;Basitleştirilmiş olarak şöyle düşünebiliriz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sender

Data
 ↓
[1] [2] [3] [4] [5]
 ↓   ↓   ↓   ↓   ↓
Network
 ↓
Receiver
 ↓
[1] [2] [3] [4] [5]
 ↓
Original Data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Network üzerinde her bölümün aynı anda veya aynı sırada ulaşması garanti değildir.&lt;/p&gt;

&lt;p&gt;Örneğin veri şu şekilde ulaşabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 → 2 → 4 → 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada &lt;code&gt;3&lt;/code&gt; numaralı bölüm eksik.&lt;/p&gt;

&lt;p&gt;TCP'nin reliability mekanizmaları sayesinde eksik veri tespit edilir ve gerekli bölüm yeniden gönderilebilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 → 2 → 4 → 5
        ↑
        3 missing

Sender
  ↓
retransmission
  ↓
3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu sayede Receiver yalnızca gelen veriyi almakla kalmaz; eksik veya sırası bozulmuş veriyi de doğru şekilde işleyebilir.&lt;/p&gt;

&lt;p&gt;REST API çağrıları, dosya indirme işlemleri veya database connection'ları gibi senaryolarda TCP kullanılmasının temel nedenlerinden biri bu &lt;strong&gt;reliability&lt;/strong&gt; mekanizmasıdır.&lt;/p&gt;

&lt;h4&gt;
  
  
  UDP: Daha Hafif Bir Yaklaşım
&lt;/h4&gt;

&lt;p&gt;UDP farklı bir çalışma modeline sahiptir.&lt;/p&gt;

&lt;p&gt;TCP'deki gibi Connection kurulmaz ve 3-Way Handshake yapılmaz.&lt;/p&gt;

&lt;p&gt;Packet gönderilir ancak karşı tarafa ulaşıp ulaşmadığına dair TCP seviyesinde bir garanti bulunmaz.&lt;/p&gt;

&lt;p&gt;Packet kaybolduğunda otomatik retransmission garantisi de yoktur.&lt;/p&gt;

&lt;p&gt;İlk bakışta bu bir dezavantaj gibi görünse de bazı kullanım alanlarında istenen davranış tam olarak budur.&lt;/p&gt;

&lt;p&gt;Örneğin canlı yayın, online oyun veya görüntülü görüşme sırasında yarım saniye önce gönderilmiş bir Packet'ın tekrar ulaşması her zaman anlamlı olmayabilir. Güncel verinin düşük latency ile ulaşması daha önemli olabilir.&lt;/p&gt;

&lt;p&gt;Bu nedenle bu tür senaryolarda UDP tercih edilebilir.&lt;/p&gt;




&lt;h3&gt;
  
  
  Adım 4: HTTP, HTTPS ve TLS
&lt;/h3&gt;

&lt;p&gt;TCP Connection kurulduktan sonra HTTP Request gönderilebilir.&lt;/p&gt;

&lt;p&gt;Burada HTTP ve HTTPS arasındaki farkı ayrı ele almak daha anlaşılır.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTTP Request Gönderirsek Ne Oluyor?
&lt;/h3&gt;

&lt;p&gt;HTTP tarafında Client ile Server arasındaki trafik TLS ile şifrelenmez.&lt;/p&gt;

&lt;p&gt;Bu nedenle Request ve Response içerisinde taşınan bilgiler ağ üzerinde plaintext olarak görülebilir.&lt;/p&gt;

&lt;p&gt;Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /login HTTP/1.1
Host: example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;gibi bir Request HTTP üzerinden gönderildiğinde aradaki trafik şifreli değildir.&lt;/p&gt;

&lt;p&gt;Bu yalnızca verinin okunabilmesi anlamına gelmez. HTTP trafiği aynı zamanda iletişim sırasında değiştirilmesine karşı da TLS seviyesinde bir koruma sağlamaz.&lt;/p&gt;

&lt;p&gt;HTTPS kullanılmasının temel amacı burada ortaya çıkıyor.&lt;/p&gt;

&lt;p&gt;HTTPS aslında tamamen farklı bir HTTP protocol'ü değil. Temelde:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP
  +
TLS
  =
HTTPS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;şeklinde düşünülebilir.&lt;/p&gt;

&lt;p&gt;TLS, HTTP iletişimine üç önemli özellik kazandırır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encryption:&lt;/strong&gt; Client ile Server arasındaki trafiğin üçüncü kişiler tarafından okunmasını zorlaştırır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrity:&lt;/strong&gt; Trafiğin iletişim sırasında değiştirilip değiştirilmediğinin kontrol edilmesini sağlar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; Client'ın gerçekten ulaşmak istediği Server ile iletişim kurduğunu doğrulamasına yardımcı olur.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wikipedia'ya özellikle HTTP üzerinden bir Request gönderelim:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-I&lt;/code&gt; seçeneği &lt;code&gt;GET&lt;/code&gt; yerine &lt;code&gt;HEAD&lt;/code&gt; isteği gönderir; böylece yanıtın yalnızca durum satırını ve Header'larını görürüz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;curl.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-I&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http://wikipedia.org&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;HTTP/1.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;301&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Moved&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Permanently&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;content-length:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;location:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://wikipedia.org/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;server:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HAProxy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;x-cache:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cp6014&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;int&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;x-cache-status:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;int-tls&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;connection:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada Wikipedia HTTP Request'i kabul edip sayfanın içeriğini göndermek yerine Client'ı HTTPS adresine yönlendiriyor.&lt;/p&gt;

&lt;p&gt;Bunu Response'un ilk satırında görebiliyoruz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 301 Moved Permanently
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;301 Moved Permanently&lt;/code&gt;, istenen resource'un başka bir adrese taşındığını belirtiyor.&lt;/p&gt;

&lt;p&gt;Nereye gidilmesi gerektiği ise &lt;code&gt;Location&lt;/code&gt; Header içerisinde bulunuyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location: https://wikipedia.org/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Akış kabaca şu hale geliyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  │
  │ HTTP Request
  │ http://wikipedia.org
  ▼
Server
  │
  │ 301 Moved Permanently
  │ Location: https://wikipedia.org/
  ▼
Client
  │
  │ HTTPS Request
  ▼
Server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yani Browser'a &lt;code&gt;http://wikipedia.org&lt;/code&gt; yazılmış olsa bile Server, Client'ı HTTPS endpoint'ine yönlendiriyor.&lt;/p&gt;




&lt;h4&gt;
  
  
  HTTPS Tarafında TLS Devreye Giriyor
&lt;/h4&gt;

&lt;p&gt;HTTPS kullanıldığında HTTP iletişiminden önce &lt;strong&gt;TLS Handshake&lt;/strong&gt; gerçekleşir.&lt;/p&gt;

&lt;p&gt;HTTP Request henüz gönderilmeden önce Client ve Server güvenli iletişim için gerekli adımları tamamlar.&lt;/p&gt;

&lt;p&gt;TLS'in ilk görevlerinden biri Client'ın bağlandığı Server'ın identity'sini doğrulamaktır.&lt;/p&gt;

&lt;p&gt;Burada &lt;strong&gt;TLS Certificate&lt;/strong&gt; devreye girer.&lt;/p&gt;

&lt;p&gt;Server, TLS Handshake sırasında Client'a Certificate'ını gönderir.&lt;/p&gt;

&lt;p&gt;Certificate içerisinde diğer bilgilerin yanında hangi domain veya domain'ler için geçerli olduğu bilgisi bulunur.&lt;/p&gt;

&lt;p&gt;Client daha sonra kabaca şu kontrolleri yapar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server Certificate
        ↓
Certificate güvenilir bir CA tarafından imzalanmış mı?
        ↓
Certificate geçerlilik süresi içinde mi?
        ↓
Certificate bağlanılan domain için geçerli mi?
        ↓
Validation başarılı
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buradaki &lt;strong&gt;CA — Certificate Authority&lt;/strong&gt;, Certificate'ların güvenilirliğini doğrulayan yapılardır.&lt;/p&gt;

&lt;p&gt;Browser ve işletim sistemleri önceden güvendikleri Root CA'ların listesini tutar. Server'ın gönderdiği Certificate'ın güven zinciri bu trusted root'lardan birine kadar doğrulanabiliyorsa Certificate güvenilir kabul edilebilir.&lt;/p&gt;

&lt;p&gt;Domain kontrolü de bu sürecin önemli bir parçasıdır.&lt;/p&gt;

&lt;p&gt;Örneğin Client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://www.wikipedia.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;adresine bağlanıyorsa gelen Certificate'ın &lt;code&gt;www.wikipedia.org&lt;/code&gt; için geçerli olup olmadığını kontrol eder.&lt;/p&gt;

&lt;p&gt;Certificate, Server'ın &lt;strong&gt;public key&lt;/strong&gt;'ini de içerir; eşleşen &lt;strong&gt;private key&lt;/strong&gt; ise Client'a gönderilmez. Server, TLS Handshake sırasında private key'e sahip olduğunu dijital imzayla kanıtlar; Client bu imzayı public key ile doğrular. Böylece anahtar çifti Server'ın kimliğini doğrulamada kullanılır.&lt;/p&gt;

&lt;p&gt;Client ve Server, Handshake sırasında ortak bir sır üzerinde anlaşarak &lt;strong&gt;simetrik session key&lt;/strong&gt;'ler türetir. Sonraki HTTP iletişimi bu key'lerle şifrelenir; her Request public key ile ayrı ayrı şifrelenmez.&lt;/p&gt;

&lt;p&gt;Basitleştirilmiş akış şu şekilde düşünülebilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  │
  │ TCP Connection
  ▼
Server
  │
  │ TLS Handshake
  │ Certificate
  ▼
Client
  │
  │ Certificate Validation
  ▼
TLS Session Keys
  │
  ▼
Encrypted HTTP Request / Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu noktadan sonra network üzerinde taşınan HTTP içeriği doğrudan plaintext olarak görülmez.&lt;/p&gt;

&lt;p&gt;Yani HTTPS yalnızca "HTTP'nin şifreli hali" demekten biraz daha fazlasını sağlar.&lt;/p&gt;

&lt;p&gt;Client açısından iki önemli soru cevaplanmış olur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Doğru Server ile mi konuşuyorum?
        ↓
Certificate Authentication

Aradaki trafik okunabilir veya değiştirilebilir mi?
        ↓
Encryption + Integrity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yapıdan sonra IP adresine doğrudan HTTPS Request gönderdiğimizde neden Certificate hatası aldığımızı inceleyebiliriz.&lt;/p&gt;

&lt;h4&gt;
  
  
  IP Adresine Doğrudan HTTPS Request Gönderirsek Ne Oluyor?
&lt;/h4&gt;

&lt;p&gt;DNS sorgusundan Wikipedia'nın IP adreslerinden birini elde etmiştik:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;185.15.58.224
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IP adresini bildiğimize göre doğrudan HTTPS Request göndermeyi deneyebiliriz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;curl.exe&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;https://185.15.58.224&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ancak Request başarılı olmuyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl: (60) schannel: SNI or certificate check failed: SEC_E_WRONG_PRINCIPAL (0x80090322) - Hedef asıl adı yanlış.

curl failed to verify the legitimacy of the server and therefore could not establish a secure connection to it. 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada problem TCP Connection'dan farklı bir katmanda oluşuyor.&lt;/p&gt;

&lt;p&gt;IP adresine ulaşabiliyoruz ancak TLS Certificate doğrulaması başarısız oluyor.&lt;/p&gt;

&lt;p&gt;Server tarafından kullanılan Certificate, &lt;code&gt;wikipedia.org&lt;/code&gt; gibi domain isimleri için düzenlenmiş durumda.&lt;/p&gt;

&lt;p&gt;Client ise şu adrese bağlanmaya çalışıyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://185.15.58.224
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;curl&lt;/code&gt;, Server'ın gönderdiği Certificate ile ulaşmaya çalıştığımız adresi karşılaştırıyor.&lt;/p&gt;

&lt;p&gt;Certificate içerisindeki geçerli isimlerle IP adresi eşleşmediği için TLS doğrulaması başarısız oluyor ve HTTPS Connection devam etmiyor.&lt;/p&gt;




&lt;h4&gt;
  
  
  Aynı Request'i Domain ile Gönderirsek
&lt;/h4&gt;

&lt;p&gt;Bu kez Request'i IP yerine domain üzerinden gönderelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;curl.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://www.wikipedia.org&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;DOCTYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"no-js"&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu durumda TLS doğrulaması başarılı oluyor ve Response alınabiliyor.&lt;/p&gt;

&lt;p&gt;Burada &lt;strong&gt;SNI — Server Name Indication&lt;/strong&gt; da devreye giriyor.&lt;/p&gt;

&lt;p&gt;TLS Handshake sırasında Client, hangi domain'e ulaşmak istediğini Server'a bildiriyor.&lt;/p&gt;

&lt;p&gt;Basitleştirilmiş olarak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  │
  │ TLS Handshake
  │ SNI: www.wikipedia.org
  ▼
Server
  │
  │ Certificate for wikipedia.org
  ▼
Client
  │
  │ Certificate validation
  ▼
HTTPS Connection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Böylece Server doğru Certificate'ı sunabiliyor ve Client Certificate doğrulamasını gerçekleştirebiliyor.&lt;/p&gt;

&lt;p&gt;Burada DNS, TCP ve TLS'in farklı görevleri olduğu daha net görülüyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DNS
→ Hangi IP adresine gideceğiz?

TCP
→ Server ile reliable Connection nasıl kuracağız?

TLS
→ Bağlandığımız Server'ı nasıl doğrulayacağız ve trafiği nasıl şifreleyeceğiz?

HTTP
→ Hangi resource'u isteyeceğiz?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Adım 5: Tek IP Adresinde Birden Fazla Site Nasıl Çalışıyor?
&lt;/h3&gt;

&lt;p&gt;Tek bir IP adresi birden fazla web sitesine hizmet verebilir. HTTP/1.1 Request'indeki &lt;code&gt;Host&lt;/code&gt; Header'ı, Server'ın hangi site için yanıt üreteceğini belirlemesine yardımcı olur. Bunu &lt;code&gt;http.badssl.com&lt;/code&gt; için bulduğumuz &lt;code&gt;104.154.89.105&lt;/code&gt; adresiyle üç şekilde inceleyelim.&lt;/p&gt;

&lt;h4&gt;
  
  
  Yalnızca IP Adresine Request
&lt;/h4&gt;

&lt;p&gt;Önce &lt;code&gt;Host&lt;/code&gt; değerini ayrıca belirtmeden IP adresine gidelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;curl.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;104.154.89.105&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Welcome&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;/title&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Welcome&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada &lt;code&gt;curl&lt;/code&gt;, URL'deki IP adresini &lt;code&gt;Host&lt;/code&gt; değeri olarak kullanır. &lt;code&gt;http.badssl.com&lt;/code&gt; istenmediği için BadSSL sayfası yerine Nginx'in karşılama sayfası döner.&lt;/p&gt;

&lt;h4&gt;
  
  
  IP Adresine Manuel &lt;code&gt;Host&lt;/code&gt; Header ile Request
&lt;/h4&gt;

&lt;p&gt;Şimdi aynı IP adresine bağlanıp hangi siteyi istediğimizi ayrıca belirtelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;curl.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;104.154.89.105&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-H&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Host: http.badssl.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;http.badssl.com&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;/title&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"font-size: 8vw;"&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;http.badssl.com&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ağdaki hedef hâlâ &lt;code&gt;104.154.89.105&lt;/code&gt;. Değişen şey HTTP Request'indeki &lt;code&gt;Host: http.badssl.com&lt;/code&gt; başlığı. Server bu bilgiyi kullanarak BadSSL sayfasını döndürüyor. Bu, &lt;strong&gt;Virtual Host&lt;/strong&gt; mantığını somutlaştırıyor.&lt;/p&gt;

&lt;h3&gt;
  
  
  URL ile Request ve &lt;code&gt;curl -v&lt;/code&gt; Çıktısı
&lt;/h3&gt;

&lt;p&gt;Son olarak IP yerine URL'yi kullanalım. &lt;code&gt;-v&lt;/code&gt; seçeneği bağlantı bilgisini, giden Request'i ve gelen Response'u görmemizi sağlıyor. Ham çıktının ilgili satırları şöyle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;curl.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http://http.badssl.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http.badssl.com:80&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;was&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;resolved.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IPv4:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;104.154.89.105&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;Trying&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;104.154.89.105:80...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Established&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http.badssl.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;104.154&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;89&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;105&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.168.18.51&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;57300&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HTTP/1.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Host:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http.badssl.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;User-Agent:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;curl/8.21.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Accept:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;/&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HTTP/1.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OK&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Server:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx/1.10.3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Ubuntu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Content-Type:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;text/html&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Content-Length:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;483&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cache-Control:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;no-store&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;DOCTYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;http.badssl.com&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;/title&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;*&lt;/code&gt; ile başlayan satırlar adın IP adresine çözülmesini ve bağlantıyı gösteriyor. &lt;code&gt;&amp;gt;&lt;/code&gt; işaretli satırlar giden HTTP Request'i: &lt;code&gt;curl&lt;/code&gt;, URL'deki &lt;code&gt;http.badssl.com&lt;/code&gt; adını alıp &lt;code&gt;Host&lt;/code&gt; Header'ına otomatik eklemiş. &lt;code&gt;&amp;lt;&lt;/code&gt; işaretli satırlar ise gelen Response'un status ve header bilgileri. &lt;code&gt;200 OK&lt;/code&gt; yanıtından sonra HTML içeriği geliyor.&lt;/p&gt;

&lt;p&gt;Üç isteğin ulaştığı IP aynı; dönen sayfayı değiştiren, HTTP seviyesinde hangi host'un istendiği. DNS IP adresini bulurken &lt;code&gt;Host&lt;/code&gt; Header'ı Server'ın doğru siteyi seçmesine yardımcı oluyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Adım 6: Gelen Yanıt Tarayıcıda Nasıl Görünüyor?
&lt;/h2&gt;

&lt;p&gt;Şimdiye kadar Request'in Server'a ulaşmasını ve Response'un geri dönmesini inceledik. Peki Response Body içerisinde HTML geldiğinde Browser bunu nasıl gördüğümüz sayfaya dönüştürüyor?&lt;/p&gt;

&lt;p&gt;Browser HTML'i okuyarak sayfanın yapısını temsil eden &lt;strong&gt;DOM&lt;/strong&gt;'u oluşturur. HTML içinde bağlantısı verilen CSS, JavaScript ve görseller gibi dosyalar için de gerektiğinde yeni HTTP Request'ler gönderir. CSS kurallarını işleyip hangi öğelerin nasıl görüneceğini belirler; ardından öğelerin ekrandaki yerini hesaplar ve sayfayı çizer. JavaScript çalıştığında DOM'u değiştirebilir, yeni veriler isteyebilir ve sayfanın yeniden güncellenmesine yol açabilir.&lt;/p&gt;

&lt;p&gt;Bu adımlar her zaman birbirini bekleyen tek bir sıra halinde gerçekleşmez. Browser, HTML'in tamamı gelmeden bazı kaynakları indirmeye ve sayfanın bir bölümünü göstermeye başlayabilir.&lt;/p&gt;

&lt;p&gt;Terminalde kullandığımız &lt;code&gt;curl&lt;/code&gt; ile Browser arasındaki fark da burada belirginleşir: &lt;code&gt;curl&lt;/code&gt; bize Response'un içeriğini gösterir; Browser ise bu içeriği ve diğer kaynakları işleyerek ekranda gördüğümüz sayfayı oluşturur.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kendime Notlar
&lt;/h2&gt;

&lt;p&gt;Bu konuları çalışmadan önce networking tarafındaki birçok kavram birbirinden bağımsız başlıklar gibi görünüyordu.&lt;/p&gt;

&lt;p&gt;DNS ayrı bir konu, TCP ayrı bir konu, TLS ayrı bir konu, HTTP ayrı bir konu.&lt;/p&gt;

&lt;p&gt;Terminal üzerinde Request'in geçtiği adımları incelemeye başladığımda bunların aslında aynı iletişim sürecinin farklı aşamaları olduğu daha görünür hale geldi.&lt;/p&gt;

&lt;p&gt;Frontend tarafında &lt;code&gt;fetch()&lt;/code&gt; çağrısı yaparken veya backend tarafında bir route tanımlarken bütün bu katmanları sürekli düşünmek gerekmiyor.&lt;/p&gt;

&lt;p&gt;Ancak Request beklediğimiz gibi çalışmadığında arka plandaki akışı bilmek problemin hangi noktada oluştuğunu anlamayı kolaylaştırıyor.&lt;/p&gt;

&lt;p&gt;Bir HTTP Request artık yalnızca:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  ↓
Server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;şeklinde düşünülmek zorunda değil.&lt;/p&gt;

&lt;p&gt;Arka plandaki akış daha çok şu şekilde ilerliyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;URL
 ↓
DNS
 ↓
IP
 ↓
TCP
 ↓
TLS
 ↓
HTTP
 ↓
Response
 ↓
Browser'da işleme ve render
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu çalışmadan çıkan en faydalı alışkanlıklardan biri de şu oldu:&lt;/p&gt;

&lt;p&gt;Bir Request beklediğim gibi çalışmadığında yalnızca Browser Console'a veya backend log'larına bakmak yerine terminal üzerinden Request'in kendisini de incelemek.&lt;/p&gt;

</description>
      <category>software</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
