TCP Üçlü Elsıkışma

Bugün TCP treeway handshake(3'lü elsıkışma) ve gönderilen/alınan datanın header kısmına bakacağız,
Wireshark'tan bir alıntıyı inceleyip Application katmanından bir örnek vereceğiz.


TCP Data Header

Datanın iletilirken, nereye gönderileceği, hangi porttan hangi porta iletileceği gibi bilgiler burada belirtilir.

Genel Bölümleri

16 bit - Source Port                   
16 bit - Destination Port            
32 bit - Sequence (SEQ) numarası     
32 bit - Acknowledgement (ACK)         
32 bit - Diğer Ayarlar               
16 bit - Urgent Pointer kısmı         
16 bit - TCP Checksum kısmı               
16 bit - Window Size                  
 4 bit - Header uzunluğu               
 3 bit - Resv alanı                  
 1 bit - SYN (Flag)                    
 1 bit - ACK (Flag)                     
 1 bit - URG (Flag)                      
 1 bit - FIN (Flag)                    
 1 bit - RST (Flag)                   
 1 bit - PSH (Flag)                  

Açıklama

Source Port: Datanın gönderiliğ/alındığı port numarası burada belirtilir. DHCP'nin dağıtmış olduğu her iç IP için, kullanılabilir 65535 port bulunur. Bu portlar 2 kısımda incelenebilir. 0-1024 arasındakilere erişim için administation yetkisi gereklidir.Genel itibariyle, protocoller bu kısımda yer alır. Bu kısımdaki bilinen portları öğrenmek için:
http://www.networksorcery.com/enp/Protocol/ip/ports00000.htm

Destination Port: Datanın gönderileceği hedefin port numarasıdır. Hedef cihazın ip adresi doğru yazılmış olsa bile, dinlediği port yanlış yazılırsa/kapalıysa, oturum başlatılamaz.

Sequence Number:  TCP yapı gereği datayı bölerek güvenli bir iletişim sağlamayı amaçlar. Bölünen data parçası, hangi parçanın önünde yada hangi parçadan sonra geliyor diye anlamak için bir sıra numarası verilmesi gerekir. Sıra numarası bu kısımda belirtilir.

Acknowledgement: Alıcı tarafından, bir sonraki verinin istenildiği kısımdır. Aynı zamanda bu kısımda gönderilmiş  bir SEQ deki veri tekrar istenerek, window size değeri ayarlanabilir. İlk iletişim anında, window size özelliği, göndericinin ağındaki MTU birimi sayesinde, kaç bitlik olacağı belirtilir. Genelde alıcı, windows size yi düşürmekistediyse, aldığı yoğunluk sebebiyle böyle bir şey yaptığı söylenebilir.

Checksum: TCP hatalarının algılanması için kullanılır. 4 adet bilgi tutar. 1-Source IP ; 2-Destination IP ; 3-TCP Protocol ; 4-TCP Lenght

Window Size: Yukarıda da dediğim gibi, bu kısımı ilk etapta, gönderen cihazın bulunduğu ağdaki MTU birimi belirler. Daha sonraları, iletişim kanallarındaki yoğunluk sebebiyle alıcı, gelen paket sayısını sınırlı tutabilir.


Örneğin:
Gönderici 1, 2, 3 SEQ numaralarına sahip 3 adet paketi alıcıya göndersin. Alıcı, ACK bilgisi olarak 3 değerini yollasın (SEQ 3, paketini tekrar istiyor demek). Bundan sonra gönderici 3 ve 4 SEQ numaralı paketleri yollar. İletişimin sonraki basamağı, alıcı tarafından ACK 5 paketi gönderilir, gönderici SEQ 5 ve 6 SEQ paketlerini yollar.

GÖSTERİM: (1-2-3)(SEQ) - (3)(ACK) - (3-4)(SEQ) - (5)(ACK) - (5-6)(SEQ)
Eğer alıcı, son gönderilen paketin numarasını tekrar yazıp, paket gönderimini 3 paketten 2'ye düşürmeseydi

GÖSTERİM:  (1-2-3)(SEQ) - (4)(ACK) - (4-5-6)(SEQ) - (7)(ACK)
olarak devam edecekti.


Resv Alanı:    İçi 0'larla doldurulmuş bir alandır. İhtiyaç halinde kullanılmak üzere ayrılmıştır.

SYN: SYN (Synchronize) özelliğine sahip ise 1 değerini alır. Treeway handshake'de kullanılır.

ACK:  ACK (Acknowledgement) özelliğine sahip ise 1 değerini alır. Treeway handshake ve paketlerin kontrollü bir şekilde iletildiğini anlamak için kullanılır.

URG: İletilmesi gereken önemli verilerde bu kısmın değeri 1'dir.

FIN: Transferin sonlandığını belirten pakettir. Sonlanan iletişimlerde, değeri 1 olur.

RST: RST (Reset) paketi ile, TCP oturumu yarıda kesilebilir, sonlanabilir. Treeway handshake'de gönderilmesi halinde, oturum açılmaz. (Port Scanner'lerin aktif kullandığı flag.)

PSH: Paket alıcısına, direk application layer e çıkmasını söyleyen data type dir.


Treeway Handshake

 TCP oturumunun başlayıp veri iletilmesi için, bu adımdan geçmesi gerekir. Genel olarak iletişim:

 (1) Gönderici ----(SYN)---> Alıcı
 (2) Gönderici <-(SYN-ACK)-- Alıcı
 (3) Gönderici ----(ACK)---> Alıcı

(1)
Gönderici SYN paketine rasgele bir sayı olarak SEQ ekler. Bu sayı, 10 olsun. Header de SYN kısmının değeri 1'dir.
İletişim isteği bu kısımda başlatılır.
Alıcı, göndericinin gönderdiği SYN paketini alır.

(2)
Alıcı, paketteki SEQ değerini okur. Bu değerin bir fazlasını (Bir sonraki paketi gönder dercesine) ACK kısmına yazar ve kendisine SEQ için rasgele
bir sayı oluşturur. Bu sayı 50 olsun, ACK'de yazan sayıda 11 olur. Alıcı, SYN ve ACK data type değerlerini 1 yaparak göndericiye, SYN-ACK paketi yolar.
Gönderici, alıcının gönderdiği SYN-ACK paketini alır.

(3)
Göndericiye gelen paket okunur, ACK ve SYN kısımlarındaki numaralar alınır. Göndericinin bir önceki gönderdiği SEQ no 10'du. Alıcı,
SEQ 10'u aldığını bildiren ve bir sonrakini isteyen ACK 11'i yollamıştır. Gönderici, SEQ değeri 11 olan, karşı tarafın isteğinin
sonraki adımını olduğunu bildiren ACK değeri 51 olan ACK paketini, alıcıya yollar. (Bu adımda, sadece ACK type si 1 dir.
SEQ değeri olsa bile, SYN type sinin değeri 0'dır.).
Alıcı, gelen ACK 51, SYN 11 paketini alınca, TCP oturumu başlamış olur.


PEKI BÖYLE OLMAZSA
2. adımda, alıcının port adresinin kapalı olduğunu düşünelim. Eğer port adresi kapalıysa, göndericiye RST paketi yollanır. RST paketi,
göndericinin iletişim için belirlediği destination portun kapalı olduğunu gösterir. Yada hiç bir paket gönderilmeyedebilir.
Filtrelenmiş veya kapalı portlardan RST paketi geri döner, yada her hangi bir paket gönderilmez ve bağlantı zaman aşımına uğrar.
3. adımda diyelim ki, alıcı normal bir şekilde SYN-ACK döndürdü. Bizim de bu durumda ACK ile treeway handshake'yi sonlandırıp
TCP oturumunu başlatmamız gerekir. Fakat istersek RST paketini bizde gönderebiliriz. Eğer RST paketini gönderirsek oturum başlatılmaz ve
alıcı cihazda log tutulmaz. N-Map gibi port scanner ler, server log tutmasın diye bu 3. adımda RST data typeyi 1 yaparak paketi yollar.


AYRICA - Bağlantı Engelleme
Firewall rule yazılarak, belirtilen IP adresinden iletişim sağlanması engellenebilir. Unutulmamalıdır ki, IP bazlı firewall rulelerinde, ilgili IP bir hosting sağlayıcısına aitse, hostta ki tüm domainlerin engelleneceğidir.

Application Layerinden Örnek

HTTP protocolüne bir örnek vererek konunun anlaşılırlığını artıralım.
Firefox'u açalım ve her hangi bir siteye istek gönderelim. Host ile haberleşmek için
Firefox, source ve destination portları oluşturur. Source port, random olarak belirlenir ve her Firefox
window içindeki doom'da farklılaşır. HTTP Protokolünde default bağlantı portu 80'dir. Dolayısıyla
kurulacak bağlantının destination portu 80'dir. Firefox üzerinden bu port, www.site.com:OzelPortNumarası
şeklinde bir URL girilerek değiştirilebilir. Fakat dediğim gibi, default dinlenilen HTTP Protokol portu 80'dir.
Basit olarak, client'ten bir web request gider, server'den bir web response gelir.
Önce bağlanılacak domain, DNS servisi kullanılarak 32 bitlik IP adresine dönüştürülür,
sonra 16 bitlik destination portu belirlenip paket yola çıkar.

Wireshark'dan Alıntı

Firefox kullanarak yaptığım web request in response sini, Wireshark kullanarak yakaladım.
Örnek olması, neye benzediğinin görülmesi bakımından burada paylaşıyorum.
Wireshark üzerinde source kısmında, iletişime geçtiğiniz hostun IP adresi bulunur. Destination kısmında ise, routherin size vermiş olduğu iç IP adresi belirtilir.

Source Port: 00 50 (HTTP kullanıldığı için default 80'e tekabul eder.)
Destination Port: d5 80 (54656. port olarak belirlenmiş. Firefox'un ürettiği random port numarasıdır.)
SEQ number: ee 13 c1 39
Acknowledgement: 71 ea fd cd
Flags: 18 (PSH ve ACK ayarlanmış sadece)
Window Size: 01 1d
Checksum: ac f7

Bunlar, header kısmındaki standart TCP bilgileri.
Ayrıca, bunun bir web response olduğunu bildiğimiz için, bize gönderdiği (HTTP Protocolü [Server ve durum bilgileri] kapsamında)
bilgileri, hexadecimal ve binary olarak Wireshark'tan öğrenebiliriz.

Aşağıda serverin durum bilgisi ve hexadecimal karşılığını, örnek vermek amacıyla paylaşıyorum.

[DURUM]= HTTP /1.1 200 OK
[HX]= 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d 0a





Yorumlar