Giriş
TCP protokolü çok uzun zamandır kullanılmasına rağmen, bu protokol nispeten karmaşık ve yakından bilinmeye değer bir protokoldür. Bu makale TCP sequence ve acknowledgement (sıra ve onay) numaralandırmalarını derinlemesine incelemek için hazırlanmıştır. Makale için segmentler WireShark paket analiz programı vasıtasıyla incelenmiştir.
Örnek veriler için bir web adresine girilmiş ve elde edilen veriler üzerinden analizler yapılmıştır. Aşağıdaki şekilde görüldüğü gibi iletimde; veri iletimi başlamadan önce bağlantı kurma aşaması (3’lü el sıkışma) yapılır, bağlantı kurulduktan sonra veri transferi işlemi ve en son olarak bağlantı kapatma işlemi (burada aktif kapatma resmedilmiştir, farklı türlü bağlantı kapatma olabilir) gerçekleştirilir.
Bu makalede, 3’lü el sıkışmayla ve sonrasında veri transferiyle sıra ve onay numaralarının nasıl değiştiği anlatılacaktır.
3’LÜ EL SIKIŞMA (Three-way Handshake)
Bağlantı durumunu kontrol
etmek için TCP başlığında bayraklar ya da 1 bit mantıksal bir kaç alan
kullanır. Bu makalede en çok ilgilendiğimiz iki bayrak şunlardır:
·
SYN:
Bir bağlantıyı ilklendirir (başlatır)
·
ACK:
Alınan verileri kabul ettiğini bildirir
Bağlantı kurulumu için istemciden
(Makine A) önce SYN bayrağı işaretli (syn:1) bir segment gönderilir. Bu sunucu
ile sıra numarasını senkronize etmek için gönderilen bir istektir. Bu istek üçlü
el sıkışmanın ilk bölümü olması nedeniyle onay numarası (ACK:0) sıfır olarak
ayarlanır. Aşağıda 19 numaralı SYN (Syn:1) segment içeriği görülmektedir.
Şekilde de görüldüğü gibi SYN segmentinde sıra numarası 339291796 olarak
belirlenmiştir.
19 0.584958000 192.168.20.5 193.140.108.92 TCP 66 50179→80 [SYN] Seq=339291796 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1 80
Sıra
numarası olan 339291796 rastgele
bir başlangıç sıra numarası (ISN = Initial Sequence Number) olarak üretilir. Bu
rakam üretiminde farklı algoritmalar kullanılabilmektedir. Şubat 2012 yılında
yayınlanan RFC6528 numaralı sıra numarası ataklarından korunmak adlı dokümanda
başlangıç sıra numarası belirlenmesinde bir algoritma önerilmektedir. Örnek
olması açısından bu algoritmadan kısaca bahsedelim.
ISN = M + F(localip, localport, remoteip,
remoteport, secretkey)
Denklemde verilen değerleri kısaca değinelim. M değeri 4
mikro saniye zamanlayıcı, F() sözde rastsal bağlantı fonksiyonudur. F() değeri
dışarıdan hesaplanamamalıdır. F değeri, bazı gizli veriler ile bağlantı
numarasının birleşiminin kriptografik bir özeti olabilir. Fakat daha güvenli olması
için saldırganın bilemeyeceği gizli anahtar ve/veya gerçek rastsal gibi değişik
bilgilerle oluşturulan bir değer olması önerilmektedir.
3’lü el
sıkışmanın 2. aşamasında SYN, ACK (SYN:1, ACK:1) bayrakları “1” değerine sahip
bir segment gönderilir. Burada da sunucu (Makine B) kendi ürettiği başlangıç
sıra numarasını gönderir. Aşağıda elde edilmiş 20 numaralı segment bilgileri
görülmektedir. Sunucu (Makine B) kendisi için başlangıç sıra numarasını (ISN) 2501784198
olarak belirlemiştir. Ayrıca istemci (Makine A) makinesine bir önceki segmenti
aldığına dair bir onay numarası döner. Bu numara istemci makinesinden aldığı
sıra numarasının “1” fazlası olan 339291797 (339291796+1) değeridir.
20 0.621642000 193.140.108.92 192.168.20.5 TCP 66 80→50179
[SYN, ACK] Seq=2501784198 Ack=339291797 Win=14600
Len=0 MSS=1412 SACK_PERM=1 WS=128 50179
Son aşamada
ise sunucu (Makine B) makineden istemci (Makine A) makineye gönderilenlerin
alındığına dair ACK (Ack:1) bayrağı “1” değerli bir segment gönderilir. Aşağıda
21 numara ile bu segment bilgileri gösterilmektedir. Burada istemci makinesi
sunucu makinesi tarafından gönderilen sıra numarasının “1” fazlası olan 2501784199
(2501784198+1) numarasını dönmüştür.
21 0.621749000 192.168.20.5 193.140.108.92 TCP 54 50179→80 [ACK] Seq=339291797 Ack=2501784199 Win=66304 Len=0 80
3’lü el
sıkışma tamamlandıktan sonra istemci ve sunucu makineler arasında veri iletimi
için bağlantı sağlanmış olur. Bundan sonraki iletimde belirlenmiş bu sıra
numaraları başlangıç olarak alınıp kullanılır.
Veri Transferi
3’lü
el sıkışma tamamlandıktan sonra 44 numara olarak aşağıda gösterildiği gibi
istemciden (192.168.20.5) sunucu (193.140.108.92) makinesine segment uzunluğu
513 olan bir HTTP Get isteği yapıldığı görülmektedir. Dikkat edildiği gibi sıra
ve onay numaraları 3’lü el sıkışmada belirlenen rakamlar olduğu görülmektedir.
44 1.002040000 192.168.20.5 193.140.108.92 HTTP 567 GET / HTTP/1.1 80
Transmission Control Protocol, Src
Port: 50179 (50179), Dst Port: 80 (80), Seq: 339291797, Ack: 2501784199, Len: 513
44
numaralı isteğe karşılık sunucu aldığını dair teyit bilgisini de barındıran 47
numaralı bir segment göndermiştir. Burada sıra numarası sabit kalırken istemciden
gönderilen 513 uzunluğundaki paketi aldığını teyit eden 339292310 numarası
döndürdüğü görülmektedir. Bu rakam kendisine gönderilen Sıra numarasının (Seq: 339291797)
gönderilen segment boyutu kadar eklenmiş olan halidir. Yani 339292310 = 339291797 + 513
47 1.040696000 193.140.108.92 192.168.20.5 TCP 54 80→50179 [ACK] Seq=2501784199 Ack=339292310 Win=15744
Len=0 50179
İnternet
tarayıcıları bir web sitesine erişirken birden fazla porttan sayfa içeriğine
ulaşmaktadırlar. Yine aynı şekilde aynı siteye bağlantısı kurulmuş tcp
haberleşmesinde sıra ve onay numaraları nasıl değişiyor gözlemleyelim.
1339 31.491546000 192.168.20.5 193.140.108.92 HTTP 700 GET
/ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js HTTP/1.1 80
Transmission
Control Protocol, Src Port: 50019 (50019), Dst Port: 80 (80), Seq: 4176971481,
Ack:
2256792393, Len: 646
1343 31.520661000 193.140.108.92 192.168.20.5 TCP 54 80→50019 [ACK] Seq=2256792393
Ack=4176972127 Win=16000 Len=0 50019
Transmission
Control Protocol, Src Port: 80 (80), Dst Port: 50019 (50019), Seq: 2256792393,
Ack:
4176972127, Len: 0
(4176972127
= 4176971481 + 646) [1339
numaralı paket len: 646]
1344 31.522969000 193.140.108.92 192.168.20.5 TCP 1466 [TCP
segment of a reassembled PDU] 50019
Transmission
Control Protocol, Src Port: 80 (80), Dst Port: 50019 (50019), Seq: 2256792393,
Ack:
4176972127, Len: 1412
(2256792393 = 2256792393 + 0) [1343
numaralı paket len: 0]
1345 31.524381000 193.140.108.92 192.168.20.5 TCP 1466 [TCP
segment of a reassembled PDU] 50019
Transmission
Control Protocol, Src Port: 80 (80), Dst Port: 50019 (50019), Seq: 2256793805,
Ack:
4176972127, Len: 1412
(2256793805 = 2256792393 + 1412) [1344 numaralı paket len: 1412]
Görüldüğü
üzere bağlantı kurulduktan sonraki veri iletimlerinde sıra ve onay numaraları,
başlangıçta belirlenen sıra numaralarına TCP segment uzunluğu eklenerek devam
eden bir şekilde artarak çalışmaktadır.
KAYNAKLAR
TCP/IP Illustrated Volume 1, The Protocols, Kevin R.Fall, W.
Richard Stevens
teşekkürler.. yakında hazırladığım diğer yazıları da paylaşacağım. Tabii vakit bulabilirsem:)
YanıtlaSil