9.10. TCP – güvenilir bir bayt akışı¶
TCP, yani İletim Denetim Protokolü (Transmission Control Protocol), IP üzerinde çalışan diğer taşıma katmanı hizmetidir. UDP en iyi şekilde “bir paket gönder ve ümit et” olarak tarif edilebilirken, TCP “iki uç nokta arasında bir bağlantı aç ve bunu, karşı tarafın kesinlikle, sırayla ve tam olarak bir kez aldığı çift yönlü bir bayt borusu gibi değerlendir” anlamına gelir. İnternet trafiğinin çoğu bunu kullanır ve kameranın ağ üzerinde yaptığı işlerin çoğu da bunu kullanır.
9.10.1. TCP’nin IP’ye eklediği şeyler¶
TCP, UDP’den çok daha fazlasını yapar. Şunları ekler:
Bir bağlantı. Herhangi bir veri akmadan önce, iki uç nokta konuştuklarını teyit etmek için kısa bir el sıkışma gerçekleştirir. Bağlantının her iki tarafın da izlediği bir durumu vardır: “açık”, “yarı kapalı”, “kapalı”.
Güvenilir teslimat. Gönderenin koyduğu her bayt, alıcı tarafından onaylanır. Bir zaman aşımı içinde onaylanmayan her şey yeniden gönderilir. Uygulama hiçbir zaman kaybolan bir bayt görmez; yalnızca protokol yeniden gönderirken bir gecikme görür.
Sıralı teslimat. Baytlar, gönderildikleri sırayla varır. Paketler alıcıya sırasız ulaşsa bile, TCP onları uygulama okumadan önce yeniden sıralar.
Akış denetimi. Alıcı yavaşsa, gönderene yavaşlaması bildirilir; bağlantı zayıf uçtaki hıza uyum sağlar.
Tıkanıklık denetimi. Aradaki ağ paket düşürmeye başlarsa, gönderen durum düzelene kadar geri çekilir. Bu, herhangi bir tek bağlantının doygun bir bağlantıyı çökertmesini engeller.
Tüm bunlar otomatiktir. Uygulamanın kullandığı Python API’si yalnızca send(bytes) ve recv(n)‘dir; TCP, altta kalan her şeyi halleder.
9.10.2. El sıkışma¶
Bir TCP bağlantısı, herhangi bir verinin geçmesine izin verilmeden önce üç yönlü bir alışverişle açılır:
Üç yönlü el sıkışma. Her iki taraf da onayladıktan sonra bağlantı açılır ve veri akabilir.¶
İstemci, açılış isteyen bir SYN (senkronize) paketi gönderir. Sunucu, kabul ederek SYN-ACK (senkronize + onay) ile yanıt verir. İstemci, teyit etmek için son bir ACK gönderir. Bu gidiş gelişin ardından, her iki taraf da bağlantının açık olduğu konusunda hemfikir olur ve hangi baytların gönderilip alındığını izlemek için sayaçlarını senkronize etmiştir.
El sıkışma, ilk faydalı bayt geçmeden önce bir gidiş-dönüş süresi kadar gecikmeye mal olur. Yerel ağlar için bu bir milisaniyedir; kıtalararası bağlantılar için yaklaşık 100 ms’dir. Bu, TCP’nin başlıca maliyetidir ve kısa, tek seferlik mesajların bazen bunun yerine UDP kullanmasının daha iyi olmasının nedenidir.
9.10.2.1. Kapanış el sıkışması¶
TCP bağlantıları da bir alışverişle kapanır (her taraftan bir FIN). Her iki uç da bağlantının kendi yarısını bağımsız olarak kapatabilir; bir tarafın göndermeyi bitirdiği ancak diğerinin hâlâ konuştuğu bir yarı kapalı durum, yaygın olmasa da geçerlidir. Uygulama normalde sadece close() çağırır ve kapatma sırasını protokolün halletmesine izin verir.
9.10.3. TCP’nin garanti etmediği şeyler¶
TCP’nin bazen yaptığı varsayılan ancak yapmadığı birkaç şey:
Mesaj sınırları. Uygulama bir mesaj akışı değil, bir bayt akışı gönderir. İki
send(b"hello")çağrısı,b"hellohello"şeklinde tek birrecv()olarak ya da değişen boyutlarda ikirecv()olarak varabilir. Uygulama mesaj çerçeveleme istiyorsa, çerçevelemeyi kendisi eklemek zorundadır (bir yeni satır, bir uzunluk öneki, ne olursa olsun). Örneğin, TCP üzerinden JSON belgeleri göndermek, her belgenin bir yeni satır ya da başka bir işaretle ayrılmasını gerektirir.Şifreleme. TCP, uygulamanın verdiği baytları açık şekilde, sonuna kadar taşır. İçeriğin gizli kalması gerekiyorsa, uygulamanın bağlantıyı TLS ile sarmalaması gerekir (bkz. Şifreli soketler ve TLS).
Kimlik doğrulama. TCP, baytların bozulmadan vardığından emin olur. Kim tarafından gönderildiği hakkında hiçbir şey söylemez. Kimlik doğrulama da daha üst katmanın işidir.
Sessiz bir bağlantıda canlılık. Hiçbir taraf uzun süre veri göndermezse, bağlantı teknik olarak hâlâ açıktır ancak diğer ucun çöktüğünü ya da kaybolduğunu tespit edemez. Bu önem taşıdığında, sorunu çözmek için soket üzerinde Keepalive sondaları etkinleştirilebilir.
9.10.4. TCP ne zaman kullanılmalı¶
TCP, “istemci bir sunucuya bağlantı açar, biraz bayt alışverişi yaparlar, iş bitince bağlantı kapanır” şekline uyan hemen hemen her konuşma için doğru cevaptır. HTTP ve HTTPS istekleri, SSH oturumları, veritabanı sorguları, dosya transferleri, görüntü yüklemeleri – hepsi TCP üzerindendir.
UDP’ye yalnızca konuşma bu şekle uymadığında başvurun: kaybın kabul edilebilir olduğu bağımsız, kendi kendine yeten mesajlar, çoklu yayın (multicast) trafiği, zaman senkronizasyonu, ad aramaları ya da el sıkışma maliyetinin caydırıcı olduğu aşırı gecikmeye duyarlı durumlar.
Portlar, UDP ve TCP’nin tümü masada olunca, taşıma katmanı hikâyesi tamamlanmış olur. Her ikisini de açığa çıkaran Python API’si bir sonraki sayfadadır: Soket nesneleri.