TCP nasıl çalışır — 1?

Gökhan Şengün
3 min readDec 24, 2018

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.

--

--

Gökhan Şengün

Full stack dad of two and just curious about things. Stories are from my twitter floods @gokhansengun. Main blog is www.gokhansengun.com