TCP Ne kadar güvenilir – 1

Bu yazımızda kısaca TCP protokolündeki bazı hususları irdeleyeceğiz.

TCP’yi okulda öğretilenden biraz daha farklı olarak tecrübelerle aktarmayı düşünüyorum. Muhtemelen TCP denince aklımıza reliable kavramı geliyordur. Ben bu detayların aksine günlük hayatta karşımıza çıkabilecek hatta çıkmış olsa bile bu problemi genellikle bir framework kullandığımız için farketmediğimiz durumları ifade etmeye çalışacağım.

Tahmin edileceği gibi bir adet sunucu var, istemci sayısı ise 3 olsun. Uygulamamız ise bir sohbet (chat) uygulaması olsun. Sohbeti gerçekleştiren kişiler biraz agresif karakterli kişiler olsunlar. Öyle kafaları kızınca sohbeti sonlandıran, sizi bloklayan hatta bilgisayarın ağ kablosunu, güç kablosunu çeken hatta bilgisayarı resetleyen cinsten karakterler. Böyle durumlara dayanıklı bir sunucu yazmak kolay değildir, inanın. Bunu her durum için küçük küçük python uygulamalarıyla göstermeye çalışacağım. Ancak ilk olarak teorik bilgi sonra bu durumun canlı uygulamasını sunmaya çalışacağım.

İki muhabbetçinin konuşması:
Muhabbetçiler sunucu aracılığıyla konuşacaklar daima. Yani ilk iletişim kurulduktan sonra sunucu aradan çekilmeyecek. Tasarımı buna göre yapalım. Yani Ali, Veli, Mustafa olsun ve sunucu yazılımının adı da “Lafçı” olsun.

Ali’nin Veli’ye mesaj gönderdiği durumda eğer Ali’nin Lafçı’ya bir TCP oturumu yoksa yeni bir bağlantı açacak ve veriyi bu soketten (bağlantı, oturum) gönderecektir. Lafçı verinin kime iletileceğini veriden çıkaracak ve veriyi eğer kendisine ilgili kullanıcıya ait bir oturum varsa o oturum üzerinden gönderecektir. Aksi halde yani ilgili kullanıcı çevrim içi değil ise ya veritabanına sonra gönderilmek üzere saklayacak veya /dev/null‘a (ne demek istediğimi anladınız*) gönderecektir.

Buraya kadar herşey yolundadır umarım. Şimdi Murphy konuşsun bakalım.

Problem 1:
a) Ali Veli’ye bir mesaj göndermek istiyor.
b) Ali mesajı yazdı ve gönder butonuna bastı.
c) Ali’nin bilgisayarından Lafçı’ya bir TCP oturum kuruldu.
d) Lafçı mesajı aldı, kime göndereceğine baktı ve Veli olduğunu gördü.
e) Veli’nin çevrim içi (online) olduğunu gördü.
f) Lafçı Veli’nin oturumuna (yani istemci soketine) veriyi yazmaya başladı.
g) Lafçı Veli’nin mesajını tam yazamadan Veli programı kapattı

Bu durumda Veli’nin programının kapanması Veli’nin oturumunun kapanmasına (soketin kapanmasına) sebep olur. Yani Lafçı tam mesajı yazamadan (mesela, 100 karakterlik bir mesaj ve 20inci karakteri henüz yazmış ve daha 80 karakter için işlem yapılması gerekirken) Veli soketi kapattı, soru: böyle bir durumda ne olur?

Eğer sunucu uygulamanız yani Lafçı bu durumu daha önceden algılayacak kodu barındırmıyorsa “broken pipe” hatası ile sonlanır. Sonlanır demek bir hafif oldu, aslına bakacak olursanız sunucu uygulamanız kırılır. C’de bu durumdan SIG_PIPE sinyalini bloklayarak kurtulabilirsiniz.

Peki bu hatanın alınması nasıl oldu?
Her iki bilgisayar (yani Lafçı’nın çalıştığı ve Veli’nin kullandığı) soket haberleşmesini TCP stack (yığın) aracılığıyla gerçekeştirmektedir. Lafçı’nın bilgisayarı soketin kapatıldığını Veli’nin bilgisayarındaki TCP stack’in söylemesi ile bilmektedir. Yani Veli’nin bilgisayarındaki program kapanınca Veli’nin bilgisayarındaki TCP stack Lafçı’nın bilgisayarındaki TCP stack’e artık bana yazamazsın demektedir. Karşı TCP stack’ten gelen bu bilgiyi alan Lafçı’nın TCP stack’i ise Lafçı uygulamasına ilgili hata sinyalini göndermektedir. Yani Lafçı arada bir Veli’nin bilgisayarına gidip arkadaş sen soketi kapattın mı dememekte tersine soketi kapatan taraf, arkadaş bak ben kapattım haberin olsun demektedir.

Özetle iki bilgisayar en alt seviyede soket haberleşmesini TCP stack ile yapmaktadır. İki bilgisayardaki soket durumları, paket akışı, window size, ACK almış paketler vb. hepsi TCP stack’lar tarafından kontrol edilmektedir. Bize ise herşeyden arındırılmış temiz bir akış (stream) sunulmaktadır.

Diğer durumlar için ilerleyen yazılarda incelememize devam edeceğiz.

Sağlıcakla kalınız

* /dev/null ile kasıt mesajın discard edileceğidir. /dev/null linux’te bir bir psudo aygıttır. Bu aygıta gönderilen herşey yok olur. Genellikle sistem yöneticileri veya bazı scriptler bazı mesajları baskılamak için mesajı bu aygıta yönlendirirler.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s