Bir veri paketinin, fiziksel olarak kusursuz olmayan bir ağın içinden geçerek karşı tarafta hatasız, sıralı biçimde yeniden ortaya çıkması — bu, insan zihninin en çarpıcı mühendislik başarılarından biri olmalı. Çünkü gerçek dünyada iletişim, Narnia’daki gibi düzgün ve öngörülebilir değildir. Kablolar kopar, sinyal bozulur, paketler yolda kaybolur, bazen aynı paket iki kez gelir. Yine de bir web sayfasının açılışında, bir e-postanın tesliminde ya da bir video akışının kesintisiz izlenmesinde, biz bu kaosu asla hissetmiyoruz. Bu sessizce çalışan mucize, 1981 yılında Jon Postel’in kaleme aldığı RFC 793 belgesinin sayfalarına kazınan kurallarda saklıdır ve bugün internetteki her bir veri alışverişinin omurgasını oluşturur.
## Güvenilmez Bir Yol üzerinde Güvenilir Bir Akış İnşa Etmek
Vint Cerf ve Bob Kahn, TCP/IP’nin fikir babaları olarak tarihe geçtiler; onlar, iki farklı ağ dünyasının — biri paket tabanlı, diğeri bağlantı kurulumu gerektiren — nasıl barışarak tek bir uyumlu sisteme dönüştürüleceğini hayal ettiler. Ancak tam işleyişi, onu kullanıma hazır hale getiren ve her durumu net biçimde tanımlayan Postel’in 1981 tarihli belgesidir. Bu belge, TCP’yi bir iletişim protokolü olmaktan çıkarıp, aslında iki uç nokta arasındaki bir sözleşme haline getirdi. Sözleşmenin en temel vaadi şudur: “Sizin gönderdiğiniz her bayt, benim de aynı sırayla, tek tek ve eksiksiz teslim alacağım bayttır.”
Güvenilmez bir ortamdaki bu güvenin temeli, iki kavramın iç içe geçmesindedir: **sıralama** ve **tespit edilebilirlik**. İnternet, veri paketlerini bağımsız olarak yönlendirir; bir paket başka birinden önce ulaşabilir. TCP’nin görevi, bu rastgeleliği bir hikâyeye dönüştürmektir. Her segmentin başına eklenen *Sequence Number*, yani Sıra Numarası, bayt akışının üzerinde yürünen saygılı bir kuyruktur. RFC 793’te bu numara 32 bitlik bir alan olarak tanımlanır ve 4 milyar değeri aştığında sıfırdan başlar — buna *sequence number wraparound* denir. Bu döngüsel yapı, zamanla bir tür zarif bir dansa dönüşür: uç noktalar, hangi numaranın tekrarlandığını anlamak için o dönemin tamamını hatırlamayı öğrenmek zorundadır.
## Üçlü El Sıkışma: Bir İlişkinin Doğuş Anı

İki nokta arasındaki bağlantının kurulması, RFC 793’te bir **durum makinesi** (state machine) olarak tanımlanır. Bu makine, her an bir durumda bulunur ve gelen bir paket ona göre durumu değiştirir. Durumlar arasında *CLOSED*, *LISTEN*, *SYN_SENT*, *ESTABLISHED* ve *TIME_WAIT* gibi aşamalar yer alır. Üçlü el sıkışma tam da bu makinenin en zarif anını temsil eder: iki tarafın birbirlerini gerçekten duyduklarını, aynı frekansta konuştuğunu kanıtlayan ritüel.
İşlem bir istemci (client) tarafından başlatılır. İstemci *CLOSED* durumundan çıkıp *SYN_SENT* durumuna geçer ve ağa tek taraflı bir *SYN* paketi gönderir. Bu paket, “Ben buradayım, sana bağlanmak istiyorum” mesajının dijital karşılığıdır. Ancak burada mühendisliğin asıl zekâsı ortaya çıkar: *SYN* paketine, sıradaki segmentin numarasını belirten bir alan eklenir ve bu sayı rastgele seçilir. Rastgelelik, güvenlik ve senkronizasyon açısından kritik öneme sahiptir — çünkü iki tarafın da aynı başlangıç noktasını paylaşıyor olması gerekir.
Karşı tarafa ulaşan sunucu (server), *LISTEN* durumundayken bu paketi alır ve durumu *SYN-RECV* olarak değiştirir. Sunucu, hem kendi *SYN*’ini yanıtlar hem de kendi sırasını bildirir; buna **SYN-ACK** denir. Bu aşamada iki taraf da birbirlerinin saydıklarıyla senkronize olmuştur: istemci sunucunun ne numaranın geldiğini bilir, sunucu ise istemcinin hangi noktadan başladığını öğrenmiştir. Ancak ilişki henüz tamamlanmamıştır — sadece birer el uzanmıştır.
Son adım, tamamen istemciden gelen **ACK** paketidir. İstemci, “Evet, senin SYN-ACK’ni de aldım, artık konuşmaya başlayabiliriz” mesajını gönderir ve durum *ESTABLISHED* olarak sabitlenir. İşte bu üçlü — **SYN, SYN-ACK, ACK** — bir el sıkışmasıdır: tek taraflı uzatılan ellerin, karşılıklı onayla tamamlanması. Neden yalnızca iki adım yeterli değil de üçü seçilmiştir? Cevap, ağın kusurlu doğasında yatar. Eğer sadece iki adımlı bir protokol olsaydı ve *SYN* paketi yolda kaybolup tekrar gönderilseydi, sunucu aynı *SYN*’i iki kez yanıtlardı; bu da istemciye sahte bir bağlantı kurulumu izlenimi yaratırdı. Üçüncü adım, bu tür çifte yanıt (duplicate ACK) durumlarını ortadan kaldıran koruyucu bir denge mekanizmasıdır. Bir el sıkışmasının güvenilir olması için, her iki tarafın da gerçekten karşısındakini duyduğunu kanıtlayan üçüncü dokunuş kaçınılmazdır.
## Sıra Numarasının Senkronizasyonu ve Durum Makinesinin Zarafeti
Üçlü el sıkışmanın ötesinde, TCP’nin kalbi *Sequence Number*’ın doğru yönetimiyle atar. Bağlantı kurulduktan sonra, her segment bir başlangıç numarasıyla yola çıkar; bu numara, o segmenti taşıyan baytların akış üzerindeki mutlak konumunu işaret eder. Karşı taraf, gelen segmentin numarasını kaydeder ve ardından gelen segmentlerin beklediği noktayı da hesaplar. Bu sayede, bir paket yolda kaybolursa alıcı, “Bu bayt henüz gelmedi” diyerek boşluğu tespit edebilir.
Durum makinesi burada tüm derinliğini gösterir. Örneğin *TIME_WAIT* durumu, bağlantının kapatılmasından sonra kısa bir süre korunmasını gerektirir. Neden mi? Çünkü son segment (FIN) ağa gönderildikten sonra, bu segment yolda takılıp tekrar gelebilir. Eğer bağlantı hemen tamamen kapanmaktaysa, o eski FIN, yeni bir bağlantı kurulumuyla çakışabilir — iki farklı bağlantının aynı saygacıda konuşması felaket demektir. Bu yüzden *TIME_WAIT*, kısa süreli bir hafızadır; sistemin kendine güvenini korumasını sağlayan bir önlemdir.

## Kayan Pencere: Belleği Taşırma Sanatı
Bir veri akışı, tek başına sıralı olması yetmez; aynı zamanda kontrollü bir hızda aktmalıdır. İşte **kayan pencere** (sliding window) mekanizması devreye girer. Alıcı, belirli bir anda ne kadar veri alabileceğini belirten bir kapasiteye sahiptir — bu, onun bellek arabelleğinin (buffer) gücüdür. Eğer gönderici, alıcının arabelleğini aşırı yükleyerek tüm veriyi tek seferde göndermeye çalışırsa ne olur? Arabellek taşar, veri kaybolur ve sistem çöker. Bu, bir kuyumcu dükkanına bir anda binlerce müşteri akması gibidir: dükkanın kapasitesi sınırlıdır, fazla gelenler dışarıda beklemek zorundadır.
TCP’nin çözümü, *Window Size* (Pencere Boyutu) adı verilen dinamik bir ayarlama mekanizmasıdır. Gönderici, alıcının her ACK’sini sayar ve bu onayların üzerinden geçen veri miktarına göre penceresini öne kaydırır — buradan da “kayan pencere” ifadesinin kökeni gelir. Alıcı yavaşlarsa, ACK’leri gecikir; gönderici bunu fark edip penceresini küçültür. Alıcı hızlıysa ise tersine büyütür. Bu, iki uç nokta arasındaki bir iletişim dansının matematiksel karşılığıdır: her adım, karşı tarafın durumuna göre şekillenir.
Pencere boyutu, bayt cinsinden ifade edilir ve genellikle belirli bir maksimum değere kadar ölçeklenebilir. Bu değer, hem alıcının bellek kapasitesine hem de ağın taşıyabileceği maksimum veriye (Maximum Segment Size ile ilişkili) bağlıdır. Kayan pencere, aslında bir *rate* (hız) ayarlayıcıdır: veriyi ne kadar hızlı gönderebileceğinizi, karşı tarafın alım kapasitesine göre anlık olarak belirler. Bu mekanizma olmadan, günümüzün yüksek hızlı bağlantılarında veri taşmaları ve sistem çökmeleri kaçınılmaz olurdu.
## Tıkanıklık Kontrolü: Ağın Nabzını Dinlemek
Kayayan pencere alıcının belleğini korurken, **tıkanıklık kontrolü** (congestion control) ağın kendisini korur. Bir ağ, bir yol gibi düşünülebilir; çok fazla araç aynı anda yola girerse trafik tıkanıır ve herkes yavaşlar. TCP, bu tıkanıklığı algılar ve kendini sınırlar. Bu alan, aslında RFC 793’ten sonra en büyük gelişmeleri yaşamıştır.
Van Jacobson’un katkılarıyla başlayan bu yol
Bu Gelişmeyi Toplulukta Değerlendirin
Haber hakkındaki düşüncelerinizi, donanım deneyimlerinizi ve teknik sorularınızı topluluk üyeleriyle anlık olarak tartışın.
Bir yanıt yazın