İnternet üzerindeki çoğu kritik servis TCP üzerinde çalışıyor. HTTP, HTTPS, SSH, mail trafiği… Hepsi bir noktada TCP bağlantısı kuruyor.
Ama TCP sadece veri gönderen bir protokol değil. Önce bağlantı kuruyor, sonra veri iletiyor, sonra düzgün şekilde kapatıyor. Arka planda ciddi bir kontrol mekanizması var.
Bu yazıda TCP 3-Way Handshake sürecini, TCP header yapısını, connection state mantığını ve bağlantı sonlandırma sürecini gerçek bir örnek üzerinden anlatacağım.

TCP Header Yapısı
Bir TCP paketi gönderildiğinde header kısmında bazı kritik alanlar bulunur. Bu alanları bilmeden handshake’i anlamak zor.
En önemli alanlar şunlar:
Source Port ve Destination Port
Sequence Number
Acknowledgment Number
Flags alanı

Source ve Destination port, bağlantının hangi uygulamalar arasında kurulduğunu belirler. Örneğin bir istemci web sunucusuna bağlanıyorsa hedef port genellikle 80 veya 443’tür. İstemci tarafında ise rastgele bir geçici port kullanılır.
Sequence Number, gönderilen verinin sırasını takip etmek için kullanılır. TCP’de her byte numaralandırılır. Bu yüzden veri kaybolursa tekrar gönderilebilir.
Acknowledgment Number ise “şu ana kadar aldım, sıradaki byte’ı bekliyorum” anlamına gelir.
Flags alanı ise bağlantı kontrolünü sağlar. Özellikle SYN, ACK ve FIN bitleri bu yazının konusu açısından kritik.
Basit Bir Senaryo Üzerinden Gidelim
Bir istemcinin bir web sunucusuna bağlandığını düşünelim.
İstemci: 192.168.1.10
Sunucu: 192.168.1.20
Sunucu portu: 80
İstemci portu: 50000
Bu bağlantı şu şekilde tanımlanır:
192.168.1.10:50000 → 192.168.1.20:80
TCP bu bağlantıyı kurmadan önce 3-Way Handshake yapar.
3-Way Handshake Nasıl Çalışır?
İlk adımda istemci bir SYN paketi gönderir.
Bu pakette SYN flag set edilir. Sequence Number alanında istemcinin başlangıç numarası bulunur. Diyelim ki bu değer 1000.
Bu noktada istemci “bağlantı başlatmak istiyorum, başlangıç numaram 1000” demiş olur.
Sunucu bu paketi aldığında hem SYN hem ACK flag’i set edilmiş bir paket gönderir. Diyelim ki sunucunun başlangıç numarası 4000.
Sunucu şunu söyler:
“Senin 1000 olan başlangıç numaranı aldım (1001 olarak onaylıyorum). Benim başlangıç numaram 4000.”
Son adımda istemci sadece ACK flag set edilmiş bir paket gönderir ve sunucunun 4000 olan numarasını 4001 olarak onaylar.
Bu aşamadan sonra iki taraf da ESTABLISHED durumuna geçer. Artık veri aktarımı başlayabilir.

SYN Flag Ne Yapar?
SYN bayrağı bağlantı başlatma işaretidir ama asıl amacı sequence numaralarını senkronize etmektir.
SYN set edildiğinde Sequence Number alanı bağlantının başlangıç referansını taşır. Bu numara rastgele üretilir.
Neden rastgele? Çünkü tahmin edilebilir olsaydı bağlantı ele geçirme gibi saldırılar mümkün olurdu.

Initial Sequence Number Mantığı
TCP’de veri byte byte numaralandırılır. Bu sayede:
- Kayıp veri tespit edilir
- Sıra bozulursa düzeltilir
- Tekrar gönderim yapılır
Initial Sequence Number, bu numaralandırmanın başlangıç noktasıdır. Handshake sırasında iki taraf da kendi başlangıç numarasını bildirir ve karşı tarafın numarasını onaylar.
Bu senkronizasyon olmadan güvenilir veri iletimi mümkün değildir.



TCP Connection State Mekanizması
TCP bağlantısı bir durum makinesi ile yönetilir.
Başlangıçta sunucu LISTEN durumundadır.
İstemci SYN gönderdiğinde SYN_SENT durumuna geçer.
Sunucu SYN-ACK gönderdiğinde SYN_RECEIVED olur.
Son ACK ile birlikte her iki taraf ESTABLISHED durumuna geçer.
Bağlantı sonlandırılırken ise farklı durumlar devreye girer. FIN_WAIT, CLOSE_WAIT, LAST_ACK ve TIME_WAIT gibi.
Bu durum geçişleri TCP’nin kontrol mekanizmasını oluşturur.

Half-Open Connection Nedir?
Handshake tamamlanmazsa bağlantı yarım açık kalır.
Örneğin istemci SYN gönderir, sunucu SYN-ACK gönderir ama istemci son ACK’i göndermezse sunucu bağlantıyı SYN_RECEIVED durumunda tutar.
Bu tür bağlantılar half-open connection olarak adlandırılır.
Sunucu belirli bir süre sonra bu bağlantıyı zaman aşımı ile kapatır.
SYN Flood Nedir?
SYN flood saldırısı, half-open bağlantıları hedef alır.
Saldırgan çok sayıda SYN paketi gönderir ama son ACK’i göndermez. Sunucu her SYN için kaynak ayırır ve bağlantı kuyruğu dolar.
Sonuç olarak gerçek kullanıcılar bağlantı kuramaz.
Bu soruna karşı geliştirilen yöntemlerden biri SYN cookies’tir. SYN cookies sayesinde sunucu handshake tamamlanana kadar bağlantı durumu tutmaz.
Bağlantı Nasıl Kapatılır?
Bağlantı kurulurken üç adım varken kapanış genellikle dört adımdır.
Bir taraf FIN gönderir.
Karşı taraf ACK ile onaylar.
Daha sonra karşı taraf kendi FIN’ini gönderir.
Son olarak diğer taraf bunu ACK ile onaylar.
Bunun nedeni TCP’nin çift yönlü veri iletmesi. Her yön ayrı ayrı kapatılır.

TIME_WAIT Neden Var?
Bağlantı kapandıktan sonra aktif kapatan taraf genellikle TIME_WAIT durumuna girer.
Bunun iki temel sebebi vardır.
Birincisi, gecikmiş paketlerin yeni bağlantıyla karışmasını önlemek.
İkincisi ise son ACK’in karşı tarafa ulaştığından emin olmak.
TIME_WAIT süresi genellikle maksimum segment ömrünün iki katı olarak belirlenir.
TCP Handshake Özeti
Önce SYN paketi gelir. Flags kısmında yalnızca SYN set edilir.
Ardından SYN-ACK gelir. Hem SYN hem ACK set edilir.
Son olarak ACK paketi gelir ve bağlantı kurulmuş olur.
Sequence ve Acknowledgment numaralarını adım adım takip ettiğimizde senkronizasyon net şekilde görülür.
Sonuç
TCP 3-Way Handshake sadece üç paketlik bir başlangıç değildir. Sequence numaralarının senkronizasyonu, bağlantı kontrolü ve güvenilir iletimin temelidir.
Connection state mekanizması ise bağlantının tüm yaşam döngüsünü yönetir. Half-open bağlantılar, SYN flood saldırıları ve TIME_WAIT gibi kavramlar TCP’nin neden bu şekilde tasarlandığını anlamak açısından önemlidir.
TCP’yi gerçekten anlamak, ağ trafiğini okumayı öğrenmektir.


Bir yanıt yazın