TCP İletişiminin Kurulması & Sonlandırılması

Cem Topkaya
7 min readFeb 26, 2023

--

TCP Paketinin Yapısı

3‘lü El Sıkışarak TCP İletişimi Başlatmak * (TCP 3-Way Handshake Process)

İki makine arasındaki ilk TCP bağlantısı 3 hareketten oluşuyor.

  1. Paket (istek): “benimle senkronize olur musun?” (SYN),
  2. Paket (cevap)“Senkronize olmak mı! Elbette” (SYN-ACK),
  3. Paket (mühür)“Anlaştık ciğer parem” (ACK)

TCP, bir bağlantı açmak için üç durumlu bir sisteme sahiptir. Gönderilen paketlerin bir adı olduğu gibi tarafların durumları vardır. Örneğin A kişisi borç para ister (borç verilecek para=SYN paketi) ve durumu “isteyen” olurken parayı aldığı anda “borçlu” parayı veren ise “alacaklı” (SYN_SENT, SYN_RCVD ve ESTABLISHED) durumuna geçmiş olur.

  1. SYN Paketi ilk olarak, başlangıç ​​noktasından (A), hedefe (B) gönderilir. Bu durumda A makinesi embriyonik (yarı açık) TCP bağlantısı durumunda (A makinesi: SYN_SENT, B makinesi: SYN_RCVD durumunda) ve bir yanıt bekliyor.
  2. SYN-ACK paketini B makinesi A’ya cevap olarak gönderir.
  3. ACK mesajını A makinesi cevap olarak gönderir (her iki makine ESTABLISHED durumuna geçer)

Biraz daha ayrıntılı bakalım:

  1. İstemci gidip sunucuya der ki; “gel bir iletişim başlatalım” ve SYN (seq:100) gider.
  2. Sunucu der ki; “isteğini gördüm ve kabul ettim” ve SYN-ACK (seq:200) gönderir.
  3. İstemci der ki; “anlaştık” ve SYN (seq:101) gönderir.

“Normal” TCP bağlantısı koparılması 4 yönlü bir el sıkışma ile gerçekleştirilir. Özellikle, kurulu bir TCP bağlantısının sonlandırılması için aşağıdaki 4 TCP paket gönderilip alınır:

Tüm TCP Akışı

Synchronization (SYN)

Bağlantı kurma aşamasının ilk adımında veya iki ana bilgisayar arasında 3 yönlü el sıkışma işleminde kullanılır. Yalnızca göndericiden ve alıcıdan gelen ilk paket bu bayrak ayarına sahip olmalıdır. Bu, sıra numarasını senkronize etmek için, yani diğer uca hangi sıra numarasını hariç tutmaları gerektiğini söylemek için kullanılır.

Acknowledgement (ACK)

Ana bilgisayar tarafından başarıyla alınan paketleri onaylamak için kullanılır. Onay numarası alanı geçerli bir alındı ​​numarası içeriyorsa bayrak ayarlanır. Aşağıdaki diyagramda, alıcı, gönderene ilk paketini aldığını bildirmek için bağlantı kurulumunun ikinci adımında bir ACK = 1 ve SYN = 1 gönderir.

Finish (FIN)

Bağlantının sonlandırılmasını talep etmek için kullanılır, yani gönderenden daha fazla veri gelmediğinde, bağlantının sonlandırılmasını talep eder. Bu, gönderen tarafından gönderilen son pakettir. Ayrılmış kaynakları serbest bırakır ve bağlantıyı nazikçe sonlandırır.

Reset (RST)

RST göndericisi TCP bağlantısında bir sorun olduğunu veya görüşmenin olmaması gerektiğini düşündüğünde bağlantıyı sonlandırmak için kullanılır. Paket onu beklemeyen belirli bir ana bilgisayara gönderildiğinde alıcı tarafından gönderilebilir.

Push (PSH)

Aktarım katmanı varsayılan olarak uygulama katmanının maksimum segment boyutuna eşit yeterli veriyi göndermesini bekler, böylece ağ üzerinden iletilen paket sayısı en aza indirilir ki bu, etkileşimli uygulamalar gibi bazı uygulamalar tarafından istenmez (sohbet). Benzer şekilde alıcı ucundaki taşıma katmanı paketleri tamponlar ve belirli kriterleri karşılıyorsa uygulama katmanına iletir. Bu sorun PSH kullanılarak çözülür. Taşıma katmanı PSH = 1'i ayarlar ve uygulama katmanından sinyal alır almaz segmenti hemen ağ katmanına gönderir. Alıcı taşıma katmanı, PSH = 1 görüldüğünde verileri hemen uygulama katmanına iletir. Genel olarak, alıcıya bu paketleri arabelleğe almak yerine alındıkları gibi işlemesini söyler.

Urgent (URG)

Uygulama katmanına verilecek daha fazla veri olsa bile, URG = 1 bayrağına sahip bir segment içindeki veriler hemen uygulama katmanına iletilir. Diğer tüm paketleri işlemeden önce alıcıya acil paketleri işlemesini bildirmek için kullanılır. Alıcı, bilinen tüm acil veriler alındığında bilgilendirilecektir.

PS C:\> while(1) { netstat -n | grep 192.168.13.33; sleep 0.1 }
TCP 10.212.134.68:52631 192.168.13.33:22 SYN_SENT
TCP 10.212.134.68:52631 192.168.13.33:22 ESTABLISHED
TCP 10.212.134.68:52631 192.168.13.33:22 ESTABLISHED
TCP 10.212.134.68:52631 192.168.13.33:22 ESTABLISHED

Tabi bu hareket çekmeleri bayraklarla (flag) renklendirerek anlamlandırıyorlar. Peki nedir bu TCP bayrakları TCP paketinin başlığında nerededir ve ne anlama geliyorlar?

SYN — Senkronizasyon — Birlikte hareket etme anlamına gelen TCP bayrağıdır. Bir paketin başarılı bir şekilde alındığını onaylamak için kullanılır. Alıcı, göndericiye ilk paketini aldığını bildirmek için 3 işleminin ikinci aşamasında bir ACK ve bir SYN gönderir. Yani SYN istediğini aldım (ACK) ve ben de birlikte hareket etmek istiyorum (SYN)

FIN — “Tamamlandı” anlamına gelen FIN bayrağı gönderende daha fazla veri olmadığı anlamına gelir. Bu nedenle, göndericiden gönderilen son pakette kullanılır.

URG — URG bayrağı, diğer paketleri işlemeden önce acil paketleri işleme alması için alıcıyı bilgilendirmekte kullanılır. Bilinen tüm acil veriler alındığında alıcıya bildirilecektir. PSH ve URG farkını anlamak için tıklayınız.

PSH — Push anlamına gelen PSH bayrağı, URG bayrağına biraz benziyor ve alıcıya bu paketleri paketlemek yerine aldıkları gibi işleme koymasını söylüyor. URG durumunda, tüm veriler ağ katmanına (gönderen) ve uygulama katmanına (alan) gönderilmez, yalnızca acil baytlar aciliyetle ele alınırken, PSH durumunda, tüm veriler aciliyetle ele alınır. URG durumunda, veriler sırasız olarak iletilir, ancak PSH’de sırayla iletilir.

RST — Sıfırlama anlamına gelen RST bayrağı, bir paket beklemeyen belirli bir ana bilgisayara bir paket gönderildiğinde alıcıdan gönderene gönderilir.

ECE (ECHO) — Bu bayrak, TCP eşinin ECN yeteneğine sahip olup olmadığını göstermekle sorumludur .

CWR — Tıkanıklığın Azaltılması anlamına gelen CWR bayrağı, gönderen kişi tarafından ECE bayrağı ayarlanmış bir paket aldığını belirtmek için kullanılır.

raw — Paketlerin göndericiden yanlışlıkla kötü niyetli olan kişilerden gizlenmesini sağlamak için kullanılan deneysel bir bayraktır.

TCP Bağlantısını Sonlandırmak **

Bağlantı iki uçludur (A makinesiyle B makinesi arasında). Bağlantı iki türlü sonlandırılabilir:

  1. TCP RST: Sadece bir uç noktası için sonlandığı (yarı açık-half-open- TCP bağlantısı)
  2. RCP FIN: Her iki uç noktasının sonlandırdığı

Yarı açık (half-open) terimi, muhtemelen bir tarafın çökmesi nedeniyle, iletişim kuran iki ana bilgisayar arasındaki birlikte çalışamadıkları (senkronizasyon dışı) durumu anlatan TCP bağlantılarıdır.

RFC 793'e göre, bir TCP bağlantısının bir ucundaki ana bilgisayar çöktüğünde veya diğer uca haber vermeden bağlantıdan ayrıldığında TCP bağlantısına yarı açık TCP bağlantısı denir. Kalan uç boşta ise, bağlantı sonsuza kadar yarı açık durumda kalabilir.

Ancak günümüzde, yarı açık bağlantı terimi çoğunlukla embriyonik bir bağlantıyı, yani kurulma sürecinde olan bir TCP bağlantısını tanımlamak için kullanılmaktadır.

Her iki uç noktası için bağlantı sonlandırma, bağlantının her iki tarafının anlaşmalı olarak dört yönlü bir el sıkışma yöntemiyle (four-way handshake) bağlantıyı sona erdirmesinde kullanır.

İlk FIN’i gönderen taraf, son ACK ile yanıt verdikten sonra, bağlantıyı nihai olarak kapatmadan önce bir zaman aşımı için bekler, bu sırada yerel bağlantı noktası yeni bağlantılar için kullanılamaz; bu, sonraki bağlantılar sırasında iletilen gecikmiş paketler nedeniyle karışıklığı önler.

İncelikli/Barışçıl Sonlandırma (Graceful Termination)

Bir TCP bağlantısı, iki yönlü akıştır. Örneğin, ana bilgisayarlar A ve B arasında bir TCP bağlantısı varsa, bir akış A’dan B’ye ve diğer akış B’den A’ya doğru olur.

TCP güvenilir bir protokoldür (yani herhangi bir aşamada mesaj kaybı olmaz), bu nedenle mesaj kaybı olmadan bağlantıyı sonlandırmak için bir protokol prosedürü gerektirir. Çünkü iki taraf için (A ve B bilgisayarları örneğindeki gibi) bağlantının dostça kapatılması gerekir tıpkı bir telefon konuşmasında her iki tarafın birbirine “güle güle” dediğini duyması gibi.

  • Veri gönderen taraf, “akış bitti, bağlantıyı kapatmak istiyorum” diyerek bağlantıyı kapatmak isteyebilir.
  • Veya veriyi alan taraf “artık gönderme, bağlantıyı kapatmak istiyorum” diye FIN-ACK talebi gönderebilir.
  • Sonlandırma isteği gönderen taraf ARTIK VERİ GÖNDEREMEZ!
  • Sonlandırma talebini alan uç nokta ACK ve FIN-ACK paketlerini gönderirse, o da artık veri gönderemez hale gelir ve bağlantı kapanır.
  • Ancak FIN-ACK isteği alan uç nokta da sonlandırma isteği göndermeyip veri göndermeye devam edebilir. Bu durumda bağlantı yarı açık (half-open) veya yarı kapalı (half-closed) TCP bağlantısı olarak tanımlanır.
  • Bitiş talebi FIN yahut FIN-ACK paketiyle başlar *. Her iki şekilde kapanış yapılabilir.
  • Sonunda bağlantının 2 FIN ve 2 ACK ile sonlandığını görmelisiniz. Bazen bir tarafın bağlantıyı oldukça sert bir sıfırlama bayrağıyla kapattığı FIN — ACK — RST’yi de görürsünüz. Yalnızca bir FIN bayrağınız varsa (ve RST yoksa) bağlantınız teknik olarak hala açıktır.
  1. FIN veya FIN-ACK Paketi A bilgisayarından B’ye gönderildiğinde, B “artık A’nın bana gönderecek verisi kalmamış” diye anlar ve
  2. ACK paketi göndererek “seni anladım” der. Ardından B bilgisayarı
  3. FIN veya FIN-ACK paketi göndererek “benim de söyleyecek sözüm kalmadı” der.
  4. ACK paketiyle A bilgisayarı B’ye “seni anladım” der.

Yukarıda alış verişi yapılan paketleri gördük. Bu paket değişimlerinde tarafların durumları da değişir tıpkı birinden borç aldığınızda siz “borçlu” karşı taraf ise “alacaklı” durumuna gelirken, siz borcunuzu ödediğinizde her iki tarafın durumlarının/tanımlarının değişmesi gibi. Netstat komutuyla durum değişimlerini gözlemleyebilirsiniz.

Ani Kapanma (RST)

Bağlantının ev sahibi (sunucu) 8889 portunda ncat uygulaması (soldaki komut satırı) ve bağlanan istemci 55964 portunda (sağdaki komut satırı) çalışan ncat uygulaması. İstemci makine Ctrl+C ile aniden bağlantıyı kopardığında sunucuya RST paketi gidiyor.

--

--

Cem Topkaya
Cem Topkaya

Written by Cem Topkaya

Evlat, kardeş, ağabey, eş, baba, müzik sever, öğrenmek ister, paylaşmaya can atar, iyi biri olmaya çalışır, hakkı geçenlerden helallik ister vs.

No responses yet