TCP nasıl çalışır — 1?
Bu flood’da TCP (Transmission Control Protocol)
protokolünün nasıl çalıştığını anlatmaya başlayacağım. Bu bilgiler ilerleyen flood'larda anlatılacak konseptler için faydalı olacaktır.
TCP
, IP
katmanının üzerinde çalışan ve kullanıcılarına (HTTP
, SMTP
, vb) paket kayıplarına karşı güvenli bir iletim ortamı sunan bağlantı temelli (connection oriented
) yani iki partinin de bağlantıyı başlatıp birbirinin sağlığını gözlemlediği bir protokoldür.
İki parti arasında TCP
bağlantısı 3-Way Handshake
adı verilen bir proses ile başlar. 3-Way Handshake
ile kurulan TCP
bağlantısının parametreleri belirlenir. 3-Way Handshake
'in adımları Wireshark
'la aşağıda gösterilmiştir.
Yukarıdaki ekran çıktısından da görülebileceği gibi önce istemci sunucuya SYN
biti işaretlenmiş bir TCP
paketi gönderir, sunucu bu pakete karşılık SYN
ve ACK
bitleri ile işaretlenmiş cevabı iletir. Son adımda ise istemci ACK
ile TCP
bağlantı kurulumunu tamamlar.
Bir ağ paketinin İstanbul’dan Avustralya’ya ulaşma (Ping
) süresi yaklaşık 400ms
civarındadır. Bu da Avustralya ile TCP
bağlantısı kurmak için 3 paket x 400ms = 1200ms
geçeceği anlamına gelir. Anlaşılacağı üzere 3-Way Handshake
yeni bağlantı maliyetini yükseltir.
TCP
iki yönlü (bidirectional
) yani iki tarafın da eş zamanlı olarak birbirine data gönderebildiği full-duplex
bir yapıya sahiptir. Bu yapıyı sağlamak için her iki yönde de diğer tarafla bağlantının ayrı ayrı kurulması gerekir çünkü bağlantı parametreleri farklı olabilir.
3-Way Handshake
'in ikinci adımında ACKnowledgement
istemcinin SYNchronization
'ına karşılıktır ve bağlantının istemci -> sunucu bacağını kurar. Bu adımdaki SYN
bağlantının sunucu -> istemci bacağını kurmayı talep eder. Üçüncü adımdaki ACK
ile bu bacak da kurulmuş olur.
İstemci sunucu tarafından dinlenmeyen bir porta bağlantı kurmaya çalışırsa sunucu SYN + ACK
yerine RST + ACK
işaretli bir paket gönderir ve istemcinin bağlantı isteğini reddetmiş olur. ReSeT
biti bağlantı açılmış durumdayken bağlantıyı ansızın koparmak için de kullanılabilir.
Alıcı taraf göndericiye paketi aldığına dair 3-Way Handshake
'de de kullanılan ACK
işaretli bir paket gönderir. Alınan her paket için ACK
göndermek ve göndericinin yeni gönderim için ACK
paketini beklemesi verimsiz olacağı için burada TCP Windowing
tekniği kullanılır.
TCP Windowing
ile gönderici karşıdan ACK
beklemeden alıcının Window Size
'ı (byte
) toplamında paket göndermeye devam edebilir. Alıcı taraf paketler kendisine ulaştıkça ara ara en son aldığı paketin sekans numarasını içeren ACK
işaretli bir paketi karşı tarafa gönderir. Alıcının gönderdiği bu ACK
paketinde buffer
'ı dolmadan daha ne kadar veri alabileceğini içeren Window Size
bilgisi de bulunur. Gönderen taraf bu bilgiye bakarak yeterli yer varsa paketleri boca etmeye devam eder, Window Size
0
olduğunda ise gönderime ara verir.
Aşağıdaki ekran çıktısında bir dosyanın indirilmesi sırasındaki Window Size
değerleri Wireshark
ile gösterilmiştir.
Window Size
gönderici ve alıcı cihazların TCP/IP stack
'lerini yöneten işletim sistemi tarafından belirlenir. Window Size
aslında OS'in ilgili bağlantının receive
tarafı için çekirdekte ayırdığı hafıza alanı kadardır. Tipik mimarilerde veri genellikle sunucudan istemciye doğru aktığı için Window Size
istemcide büyük, sunucuda küçük olur. İlgili portu dinleyen uygulama veriyi TCP/IP Stack
'ten alıp işledikçe gönderilen paketlerdeki Window Size
değeri artar, uygulamada herhangi bir sebepten işleme durur ya da yavaşlarsa azalarak 0
olur.
İnternette dolaşılan 40–50 cihaz arasında paketler bazen kaybolur ve gecikir. TCP
, belirli bir süre boyunca ACK
gelmeyen paketlerin tekrar gönderilmesini tetikler. Bu prosese de TCP Retransmission
adı verilir. Gönderici alıcıya paketleri gönderdikçe gönderdiği paketi Retransmission Queue
'ya koyar ve bir timer
kurar. İlgili paketin de kapsandığı bir ACK
paketi aldığında ise zamanlayıcıyı iptal eder ve paketi Retransmission Queue
'dan siler. ACK
gelmeden timer
süresi dolarsa paket kuyruktan çekilerek karşı tarafa yeniden gönderilir.
Paketlerin gönderimi sırasında alıcı paketleri ACK
'ledikçe son alınan sekans numarasına ve Window Size
'a göre göndericinin göndermesi gereken paket listesi güncellenir. Aşağıda gösterimi yapılan bu işlem TCP Sliding Window
olarak adlandırılır.
Bir sonraki flood’da TCP
'nin nasıl çalıştığını en çarpıcı kısımları ile anlatmaya devam edeceğim.