TCP-UDP Nedir?

Gökhan
8 min readAug 17, 2019

--

En popüler iki aktarım katmanına giriş yapıyoruz.

Aktarım Denetleme Protokolü (TCP) ve Kullanıcı Datagram Protokolü (UDP) en popüler iki aktarım katmanı protokollerindendir. Paketlerin hata olmadan, kayıpsız ve düzgün şekilde hedefe iletilmesi görevini üstlenirler. İkisi arasındaki fark ise, TCP’nin uygulamalara birden fazla çeşitte destek sağlarken, UDP’nin tek destek sağlamasıdır. Bu nedenle TCP, UDP’ye göre çok daha karmaşık bir yapıya sahiptir ve eğitimimiz TCP üzerine kuruludur. Yine de ikisinin karşılaştırmasını zaman zaman yapacağız.

Aktarım katmanı protokolleri

TCP de UDP de ulaştırma katmanında görevli protokollerdir. Peki neden iki protokole de ihtiyacımız var? Çünkü;

  • TCP oldukça yavaş ancak fazlasıyla güvenli
  • UDP oldukça hızlı ancak yeterince güvenilir değil.

Genelde web bağlantıları, e-posta istemcileri ve dosya yükleme gibi işlemlerde daha güvenilir olmak isteriz. Çünkü birkaç bozuk paket ve verinin bütün çalışmalarımızı mahvetmesini istemeyiz. TCP kullanılan durumlarda, bu veri kaybı yaşatan paketler kontrol edilecek ve tekrar gönderilecektir. Evet düşündüğünüz gibi, TCP veri güvenliği ve doğrusallığı açısından çok yararlı.

Ancak TCP yüksek veri güvenliğini sağlarken oldukça yüksek bir maliyet gerektiriyor.

TCP, paketlerin doğruluğunu ve güvenilirliğini sağlamak için onları parça parça ele alır ve uçtan uca kontrol eder. Bu nedenle paketler daha büyük boyutlara ulaşır ve bunları işlemek için daha büyük bant genişliği ve yüksek CPU gücü gerekir.

Her şeye rağmen UDP, TCP gibi bütün verilerin doğruluğunu garanti etmese de, ona nazaran daha hızlıdır. Çünkü paketleri parça parça inceleme ve denetleme amacıyla ekstra işlemler yapmaz. Peki hangi işlemlerin hıza daha çok ihtiyacı vardır?
Video (canlı yayın) veya ses buna örnek olarak gösterilebilir çünkü gerçek zamanlı akışlardır.
Örneğin arkadaşınızla konuştuğunuzu varsayalım. Görüntü ile eşzamanlı olarak sesinizin ulaşmasını istiyorsunuz. Gecikmeli gitseydi garip bir durum oluşurdu.

NOT: Segmentler, aktarım katmanındaki veri paketlerine verilen isimlerdir.

TCP, hedefe ulaştırılan paketlerin çok büyük ve yoğun olduğunu görürse, aktarımı yavaşlatıp kontrolleri güvene almak isteyebilir. Video konferanslarında TCP’nin sesinizi gecikmeli vermesini istemezsiniz. Örneğin siz video konferans sırasında bir açıklama yaparken ağır çekimde konuşuyor gözükmeniz, hiç hoş olmayacaktır.

Ses veya video paketlerinde ufak kayıplar göz ardı edilebilir. Örneğin siz “Merhaba” dediğinizde standart bir IP telefon bağlantısıyla yaklaşık 25 ile 100 arasında (tahmini değerlerdir) paket oluşturulur. Bunlardan birkaçının kaybolması durumunda yine de istenilen performans verilmiş olacaktır. Yani ortaya çıkan kayıpların çok büyük olmaması durumunda, iletimi engelleyebilecek hiçbir şey yoktur.

Bir sonraki bölümde TCP’nin temel mantığını öğreneceğiz.

TCP Üç Yönlü Bağlantı İsteği (iletişimi başlatmak için)

Ana bilgisayar olan A sisteminin, B sistemiyle bağlantı kurmak istediğini varsayalım. Bir veri aktarımı başlamadan önce bağlantı isteği sağlanmalıdır. Gelin nasıl yapıldığına bakalım.

1- İlk olarak A sistemi bir SYN mesajı gönderir (Senkronize nin kısaltılmış hali: SYN) . Bu SYN mesajı B sistemi ile bağlantı kurma isteğini içerir. Bu mesaj bir sıra numarası (SEQ) içerebilir. Bu sıra numarası herhangi bir 32 bitlik sayı olabilir (0'dan 232'ye) . Dolayısıyla bunu temsilen “X” kullanabiliriz.

2- A sisteminden SYN mesajı alındıktan sonra, B sistemi SYN-ACK mesajıyla bir cevap oluşturur (ACKnowledge = istek kabul). Bu mesaj bir SYN sıra numarası ve bir ACK numarasını kapsar:
*SYN sıra numarası (“y” ile gösterilir) rastgele bir sayı olabilir ve A sistemiyle bir ilgisi olmayacaktır.
* ACK numarası, A sistemindeki SYN numarasının bir değer üstündedir. Dolayısıyla bunu “x+1” şeklinde gösterebiliriz.

SYN-ACK mesajı, B sisteminin A sistemiyle iletişimi kabul ettiğini gösterir(ACK aracılığıyla). Ayrıca SYN aracılığıyla A sisteminin hala bağlantı kurmak isteyip istemediğini sorar.

3- A sistemi, SYN-ACK mesajını aldıktan sonra geri iletim gerçekleştirir. SYN sıra numarasına ekleme yaparak hala bağlantı kurmak istediğini iletir (“y+1” ile gösterebiliriz).

Grafiksel olarak göstermek gerekirse (x=1 , y=50):

Bu süreçte ise üç farklı mesajın sürekli olarak sistemler arasında dolaşması gerekmektedir. Bu nedenle buna üç yönlü bağlantı isteği diyoruz.

A sistemi, üç yönlü bağlantı isteğinden sonra B sistemine veri göndermeye başlayabilir.

Sırada iletişimi sonlandırma var. İletişimi sonlandırmak gerektiğinde TCP, dört yönlü bir iletişim kullanır.

TCP Dört Yönlü Sonlandırma (İletişimi kesmek için)

A sisteminin, B sistemiyle bağlantıyı sonlandırmak istediğini varsayalım. A sistemi bir FIN (FINISH = bitiş) iletisi yollayacaktır. FIN mesajının ana amacı, TCP’nin kurulu olan mevcut bir bağlantıyı güvenle sonlandırmasını sağlamaktır. A sistemi daha sonrasında FIN-WAIT durumuna geçecektir. Bu durumda A sistemi, B sisteminden hala TCP paketleri almaya devam eder ancak veri akışı kesilir.

B sistemi, FIN mesajını bir ACK aracılığıyla aldığını doğrular (“x+1” ile). Bu noktada B sistemi, A sisteminden veri almayı kesecektir. Fakat B sistemi, A sistemine veri göndermeye devam edebilir. Eğer ki B sisteminin de, yollayacağı bir veri yoksa FIN mesajını onaylayarak iletir ve bağlantıyı kesebilir.

TCP protokolü, bağlantı kurulmasından önce ve sonra ön talep gerektirir. Bu da bağlantıların güvenli şekilde kurulmasını, ancak yavaşlamasını sağlar. Ancak UDP bunu gerektirmez.

Terimleri şöyle tanımlayabiliriz:

Connection-oriented protocol: Veriler iletilmeden önceki iki süreçte kurulacak mantıksal bir bağlantı gerektirir.
Connectionless protocol: Süreçler arasında bir bağlantı kurulmadan verilerin değiştirilmesine izin verir.

Sonuç olarak, TCP bir bağlantının kurulmasını ( üç yönlü bağlantı isteği) ve güvenli olarak sonlandırılmasını (4 yönlü sonlandırma) sağlar.

TCP’nin Özellikleri

Burada öğreneceğimiz bazı popüler TCP özellikleri: Port numaralarını kullanarak çoğullama, Windowing kullanarak akış denetimi ve Güvenilirlik (Hata Tespiti ve Hata kurtarma)

Port numaralarını kullanarak çoğullama

Farzedin ki, aynı anda hem web tarayıcı, hem e-posta iletişimi hem de FTP yüklemesi için bir dizüstü bilgisayar kullanıyorsunuz. Bunların hepsi kullanırken, dizüstü bilgisayarınızda sadece bir (ethernet kartı ile) IP adresi olduğundan TCP’ye ihtiyaç duyar, buna göre dizüstü bilgisayarınız internetten hangi paketin hangi uygulama için geldiğini nereden anlıyor?

Yukarıdaki soru port numaraları ile çözüldü. Her bir uygulama, dış dünya ile iletişim için farklı ve mevcut port numarası kullanır. Örneğin dizüstü bilgisayarınız web tarayıcı için 50000 portunu, e-posta iletişimi için 50001 portunu ve son olarak da FTP yüklemesi için de 50002 portunu seçebilir.

Port numaraları üç aralıktadır.

+Tanınmış port numaraları (0 ila 1023): Sistemlerin sunduğu kilit veya temel hizmetlere atanmış olanlar.

+Kayıtlı port numaraları (1024 ila 49151): Esdüstri uygulamaları veya işlemlerine atanmış olanlar. Örneğin: 1433 portu Microsoft SQL Server işlemine atanmıştır.

+Dinamik port numaraları (49152 ila 65535): Özel iletişim için geçiri port olarak kullanılır. Dizüstü bilgisayarlarımız iletişim için bu portları kullanabilir.

Aşağıdaki tabloda bazı tanınmış servislerin TCP portlarını görebilirsiniz:

Not: Bazı diğer tanınmış portlar yukarıdaki listede bulunmuyor. Bütün tanınmış portlar İnternet Atanmış Numaralar Otoritesi (IANA) tarafından 0 ila 1023 sayıları arasında atanmıştır.

Multiplexing (Çoğullama) bir sokete dayanmaktadır ve bu üç şeyden oluşmaktadır:

+Bir IP Adresi
+Bir iletim protokolü
+Bir port numarası

Şimdi bir dizüstü bilgisayarımızdaki IP adresini 123.1.1.1 olarak varsayarsak ve 50000 portlu bir web sunucusuna erişmek için TCP kullandığını düşünürsek, soketi başarıyla yazabiliriz.
Her bilgisayardaki soket eşsizdir. Bu sebeple iki farklı soket arasındaki bağlantıyı da benzersiz olarak tanımlayabiliriz. Bu sayede aynı sistemde birden çok uygulamayı aynı anda kullanabilirsiniz.

Şu ana dek kaynak bağlantı noktalarından bahsettik. Ancak TCP’nin hem kaynak hem de hedef bağlantı noktası gerektirdiğini unutmayın. Bu, dizüstü sistemin bir web sunucusuna bağlanması sırasında bir hedef bağlantı noktası istediği anlamına gelir. Bu durumda hedef web sunucusunun bağlantı noktası 80'dir. Web sunucusundan yanıt verildiği taktirde, sistem bunu hedef bağlantı noktası olarak kabul eder.

NOT: Hem TCP, hem de UDP’de çoklama kullanılır.

Windowing ile akış kontrolü

TCP aktarımında rol oynayan bir başka etmen ise windowing. Bir window gönderilen bağlantının ileti başlığını temsil etmektedir.
TCP bağlantısı kurulduktan sonra, hem istemci hem de sunucu, bu window bağlantısı aracılığıyla ana sisteme kaç byte veri almak istediğini sorar. İletilebilecek veri miktarı window boyutuyla doğru orantılıdır. Yani window boyutu ne kadar büyükse iletilebilecek veri de o kadar büyüktür.

Fakat her segmentin ardından ACK’yi beklemek hem sistem için hem de bağlantı için çok yavaşlatıcı olurdu. Bu sebeple TCP, window boyutunu 3'e çıkararak veriyi yukarı çekmeye çalışır. Bu da alındı iletisinin yollanmadan önce üç baytın alınabileceği anlamına gelir.

Görüldüğü üzere window boyutuna bağlı olarak daha az ACK’nın aktarılması gerekiyordu. Bu sayede daha verimli bir bağlantı sağlanabilirdi. Ancak belirtelim, window boyutu sonsuza kadar arttırılamaz. Alıcı bir ACK yollamadığında veya window boyutu maksimum değere ulaştığında TCP, window boyutunu yükseltebilir. Bağlantıda kopmalar ve gecikmeler yaşanırsa window boyutu düşürülür.

Window boyutu bağlantının ömrü boyunca değişkenlik gösterir. Bu nedenle buna “sliding window” diyebiliriz.

Gönderici, ACK’yı beklenen zamanda almazsa paketlerin yeniden gönderilmesi gerektiğini ve bağlantının yavaşlatılması gerektiğini iletir.

Güvenlik (Hata Tespiti)

Bu özellik en önemli TCP özelliğidir. Bağlantı öncesinde hata olarak algılanmış içeriklerin kurtarılması gerekir. Öncelikle hata algılama ve hata kurtarma arasındaki farkı anlayalım:

+Hata tespit: İletim sırasındaki hataların tespiti. Bu aşama yalnızca hataları tespit eder. Onarım yapmaz.
+Hata kurtarma: İletim sırasında tespit edilen hataların onarımı.

Hataları algılamak için, TCP, bazı veri sağlayıcılarına ve checksum toplamı adı verilen verilere ekstradan bit ekler. Elde edilen bu 16bitlik değer, alıcının elde ettiği değerler ile karşılaştırılacaktır. Değerler eşleşirse, alıcı bu değerlerin doğru olduğunu onaylayabilir. Değerler eşleşmezse, alıcı bir hata olduğunu belirtir.

Hata kurtarmanın gerçekleşmesi için, TCP, başlıkta bulunan sıra numarasını ve onay alanlarını kullanır. Bu iki etken de, kayıp ve istikrarsız bölümleri bulmak için kullanılır.

“B sisteminden gönderilen ACK kaybolması durumunda ne olur?” diye sorabilirsiniz. Aslına bakarsanız, her segmentin iletimi sonrasında A sistemi ACK kaybolmasına karşılık yeniden iletim zamanlaması ayarlar. Bu sayede kaybolan paketler tekrar gönderilerek veri kaybı önlenir.

NOT: UDP yalnızca hata tespitini destekler. Hata kurtarmayı desteklemez. Bir hatayla karşılaşması durumunda sadece bağlantıyı keser.

Genel anlamda özetlememiz gerekirse;

TCP ve UDP ortak özellikleri:

+İkisi de aktarım katmanında çalışmaktadır.
+İkisi de port numaralarıyla çoklamayı kullanmaktadır.

Farkları:
TCP, güvenli bir bağlantı sağlarken UDP hızlı ancak güvensiz bir bağlantı sağlar.
TCP, bağlantıya eğilimli iken, UDP yalnızca birden fazla bağlantı isteği gelirse işlem yapar.
TCP, windowing ve yeniden iletim akış kontrollerini desteklerken, UDP hiçbirini desteklemez.
TCP, iletişim kurmadan önce üç yönlü bağlantı isteği sağlarken UDP iletişimden önce bağlantı isteğine gerek duymaz.
TCP, iletişimi sonlandırırken dört yönlü sonlandırma kullanırken, UDP iletişimi keserken ekstra bağlantı kullanmaz.

Son olarak,TCP ve UDP öğreticisinin dışında farklı alanlar da mevcut.

Görseller 9tut.com sitesinden alınmıştır.

--

--

Gökhan

Information Security Specialist / Computer Engineer