TCP ile hedef bağlantı sağlanabilmesi için ilk olarak bildiğiniz üzere 3’lü el sıkışma gerekli. 3’lü el sıkışması sonrasında da bağlantı durumlarını gözlemek isteyebilirsiniz. Bu yazımızda bu bağlantı çeşitlerine ve ne anlama geldiklerini uygulamalı olarak öğreneceğiz.
Bu çalışmamızda ağ bağlantılarını bizlere gösterebilecek bir araçtan faydalanacağız. Hem linux hem de windows tarafında builtin olarak bulunan netstat’ı kullanacağız. Öncelikle şunu belirteyim. Netstat parametreleri ve çıktıları Windows ve Linux tarafında ufak farklılıklar içerebilir. Bu ufak detaylara takılmamınızı önererim.
Netstat ile TCP bağlantı durumlarını görmek
State : LISTEN
Portun aktif olarak dinlendiğini belirtir.
Örneğin 24245 portunu netcat ile dinleyelim. netstat ile baktığınızda portun dinleme modunda olduğunu görebiliyoruz.
State : ESTABLISHED
3’lü el sıkışmanın tamamlandığını ve bağlantının kurulduğunu gösterir. Bağlantı sonlanana dek iki bağlantı arasında veri iletişimi gerçekleştirilebilir.
Örneğin yine netcat ile bir belirtilen portu dinlediğimde ve o porta bağlanmak istediğimde tcpdump ile 3 ‘lü el sıkışmanın tamamlandığını ve bağlantının kurulduğunu görebiliyoruz.
4’lü El Sıkışma
Established durumu TCP’de 3’lü el sıkışmanın yapıldığını ifade eder. Established durumundaki bağlantının düzgün bir şekilde sonlandırılması için ise aşağıdaki gibi iki tarafında birbirine karşılıklı olarak sonladırma ve onay mesajlarını göndermesi gerekir. Aşağıda açıklayacağımız state’ler için 4’lü el sıkışmanın ne olduğu bilinmelidir.
State : TIME_WAIT
Bağlantı kurulu durumdayken oturumu kapatmak için sinyal alan istemci (başlatan) sunucuya (alıcı) oturumu kapat bilgisini gönderir. Sunucu bunu onaylar ve ACK yollar. Sunucu da istemcide oturumu kapatmasını talep eder ve istemciye ACK yollar. İstemci sunucuya ACK mesajının gittiğini bilemez ve gittiğini garanti altına almak için bir süre bekler. Bu bekleme süresini kendiniz de yapılandırabilirsiniz.
Aşağıdaki örneği incelersek 24245 portuna bağlantı sağlanıyorken bir anda istemci tarafında CTRL+C diyerek bir interrupt (kesme) işlemi gerçekleştirdim. tcpdump ile baktığımızda 4lü el sıkışmadıki aşamalara uygun hareket ediyor ve iletişim istemcinin sunucuya ACK göndermesiyle sunucu tarafında ilgili soket hemen sonlanıyor. İstemci tarafındaki soket ise bir süre bekledikten sonra tamamiyle kapanıyor.
State : CLOSE_WAIT
İlk FIN paketi istemci (başlatılan) tarafından sunucuya (alıcı) gönderildiğinde sunucudan bir ACK paketi istemciye ulaşmıyorsa bu durumda sunucu tarafında bağlantının CLOSE_WAIT durumunda olduğu bilgisi çıkarılabilir.