TCP/UDP

OSI referans modelini anlatırken Taşıma/İletim Katmanında TCP ve UDP protokollerinin kullanıldığından bahsetmiştik. Bu yazımızda bu protokollerini ne işe yaradığından ve aralarındaki farklardan bahsedeceğiniz.

TCP(Transmission Control Protocol)

TCP/IP(Internet Protocol), bir bilgisayarın internete nasıl bağlanması gerektiğini ve nasıl veri aktarabileceğinizi belirlemenize yardımcı olur. Birden çok bilgisayar ağı bağlandığında sanal bir ağ oluşturmanıza yardımcı olur.

TCP/IP, İletim Kontrol Protokolü / İnternet Protokolü anlamına gelir. Güvenilmez(unreliable) bir ağ üzerinden son derece güvenilir ve uçtan uca byte akışı sunmak için özel olarak tasarlanan bir modeldir. HTTP, HTTPS, POP3, SSH, SMTP, Telnet ve FTP gibi internet’in kullanıcı açısından en popüler protokollerinin veri iletimi TCP vasıtasıyla yapılır.

UDP(User Datagram Protocol)

UDP(Kullanıcı Veribloğu İletişim Kuralları), Datagram odaklı bir protokoldür. Yayın(broadcast) ve çok noktaya yayın(multicast) türü ağ iletimi için kullanılır. Verileri bağlantı kurmadan yollar. Gelişmiş bilgisayar ağlarında paket anahtarlı bilgisayar iletişiminde bir datagram modu oluşturabilmek için UDP protokolü yazılmıştır. Bu protokol minimum protokol mekanizmasıyla bir uygulama programından diğerine mesaj göndermek için bir prosedür içerir. Bu protokol ‘transaction’ yönlendirmelidir. UDP’yi kullanan protokollerden bazıları DNS, TFTP, ve SNMP protokolleridir. Uygulama programcıları birçok zaman UDP’yi TCP’ye tercih eder, zira UDP ağ üzerinde fazla bant genişliği kaplamaz.

TCP Nasıl Çalışır?

TCP bağlantısı üçlü el sıkışma(three-way handshake) yardımı ile kurulur. TCP, bağlantı başlatma ve onaylama sürecidir. Bağlantı kurulduktan sonra veri aktarımı başlar ve aktarım işlemi bittiğinde, kurulan sanal devrenin kapatılmasıyla bağlantı sonlandırılır.

TCP Başlığı(Header)

TCP bağlantı tabanlı (connection-oriented) bir protokoldür. TCP bağlantı tabanlı bir protokol olduğu için iki bilgisayar, üçlü el şıkışma (3-way handshaking)yaptıktan sonra veri alışverişi yapmaya başlar.

TCP, taşıma katmanında verileri parçalara bölerek her bir parçanın önüne başlık bilgisi ekler. Başlık bilgisiyle birlikte bu veriye ‘TCP Segmenti’ denir.

Kaynak Port (Source Port): Veriyi gönderen makinenin kullandığı TCP portudur.

Hedef Port (Destination Port): Hedef makinenin TCP portudur.

Sıra Numarası (Sequence Number): TCP’nin verinin böldüğü her bir segmentine verdiği numaradır.

Onay Numarası (ACK Number): Alınan bir SYN paketine karşılık olan onay mesajı ACK biti ile gönderilir. En son alınan sequence paketinin bir fazlasıdır.

Başlık Uzunluğu (Header Length/Data Offset): TCP başlığının uzunluğunu gösterir.

Flags:

  • URG: Acil Biti
  • ACK: Acknowledge Biti
  • PSH: Push Biti
  • RST: Reset Biti
  • SYN: Sequence Biti
  • FIN: Bitirme Biti

Rezerve Edilmiş (Reserved): İleride kullanılmak üzere saklı tutulur.

Kod Bitleri ya da Bayraklar (Code Bits or Flags): Segment ile ilgili kontrol bilgilerini taşır.

Pencere (Window): Akış denetimi için kullanılır. Alıcının kaç paketi birden istediği bilgisi içerir.

Hata Kontrol Bitleri (Checksum): Segmentin hatalı ulaşıp ulaşmadığını kontrol etmek için kullanılır. Paketin bütünlüğünü doğrular.

Acil İşaretçisi (Urgent Pointer): Bir verinin acil olarak iletilmek istendiği durumlarda kullanılır. URG biti işaretlendiyse kullanılır.

Seçenek (Option): TCP segmentinin maksimum boyutunun bilgisini taşır.

Veri (Data):Verinin bulunduğu kısım

3 Way Handshake(3lü El Sıkışma)

TCP, Yeniden Taşımalı Olumlu Onay (Positive Acknowledgement with Re-transmission(PAR)) ile güvenilir iletişim sağlar. Taşıma katmanının Protokol Veri Birimi (The Protocol Data Unit(PDU)), segment olarak adlandırılır. PAR kullanan bir cihaz, bir ack bildirimi alana kadar veri birimi yeniden gönderir. Sunucuda(server) alınan veri birimi hasar görmüşse (Hata Algılama(Error Detection) için kullanılan taşıma katmanının checksum(Hata Kontrol Bitleri) ile verileri kontrol eder), ardından istemci(client) segmenti atar. Bu nedenle, gönderenin olumlu onay alınmayan(positive ack) veri birimini yeniden göndermesi gerekir. Yukarıdaki mekanizmadan, güvenilir bir TCP bağlantısının kurulması için gönderen(istemci) ve alıcı(sunucu) arasında üç segmentin değiş tokuş edildiğini anlayabilirsiniz. Bu mekanizmanın nasıl çalıştığını inceleyelim:

  • 1. Adım (SYN): İlk adımda, istemci(client) sunucuyla(server) bir bağlantı kurmak ister. Bu nedenle, sunucuyu istemcinin iletişime başlaması gerektiği ve hangi sıra numarasıyla(sequence number(seq)) segmentleri başlatacağı konusunda sunucuya bilgi veren SYN(Synchronize Sequence Number) ile bir segment gönderir.
  • 2. Adım (SYN + ACK): Sunucu, istemci talebine SYN-ACK sinyal bitleri seti ile yanıt verir. ACK(Acknowledgement), aldığı segmentin yanıtını belirtir ve SYN(Synchronize), segmentleri hangi sıra numarasıyla(sequence number) başlatacağını belirtir.
  • 3. Adım (ACK): Bu son adımda, istemci Sunucunun ACK yanıtını kabul eder ve ikisi de kararlı bir bağlantı oluşturur ve gerçek veri aktarım sürecini başlatır.

Örnek

İşte üç adımdan oluşan üç yönlü el sıkışma sürecinin basit bir örneği:

  • Host X, TCP SYN paketini host hedefine göndererek bağlantıya başlar. Paketler Host X’in iletmesi gereken veriler için sıra numaralarının(sequence number) başlangıcını gösteren rastgele bir sıra numarası içerir. Örneğimiz için sequence number SYN=4321’dir.
  • Bundan sonra, Sunucu paketi alacak ve sıra numarasıyla(sequence number) yanıt verecektir. Yanıt “1” artırılarak Host X’in sequence number olan alındı numarasını(acknowledgment number(ACK)) da içerir (Burada ACK=4322’dir). Yanı Host X’nin SYN+1 artırarak Serverın ACK değerini buluyoruz.
  • Host X, çoğunlukla sunucunun “1” artırılan sıra numarası(SYN) olan alındı numarasını(ACK) göndererek Sunucuya yanıt verir. Burada Server SYN=5501 “1” artırarak Host X ACK=5502 olarak buluyoruz.

Scapy ile TCP Paketi Nasıl Oluşturulur?

Scapy Kali Linux’da var olan bir tooldur. Şimdi birlikte scapy üzerinden TCP paketi nasıl oluşturulur birlikte bakalım.

Öncelikle terminalde scapy komutuyla scapyi başlatıyoruz.

root@kali:~# scapy

Paketimizi oluşturmadan önce TCP ve IP başlıklarını oluşturmamız gerekiyor.

root@kali:~# ls(TCP)

komutunu kullanarak TCP başlığı oluştururken kullanmanız gereken birimleri listeleyebilirsiniz.

root@kali:~# tcpheader=TCP(sport=RandShort(), dport=80, flags="S") 

TCP başlığı oluştururken sport(yani kaynak makinenin portu)=RandShort() olarak belirledik yani random bir port ataması yaptık. Scapy pyhton kullanıldığından syntaxa dikkat etmelisiniz. dport(hedef makinenin portu)=80 olarak belirledik. (80 portu, yaygın olarak internet erişim protokolü HTTP (Hypertext Transfer Protocol) için kullanılan bir bağlantı noktası numarasıdır. 80. Port yardımıyla Web istemci bazlı (Web client-based) bilgisayar mesajları gönderilir veya alınır.) Ve son olarak SYN segmenti göndereceğimiz için flags=”S” olarak yazdık.

root@kali:~# ls(IP)

komutunu kullanarak IP başlığı oluştururken kullanmanız gereken birimleri listeleyebilirsiniz.

root@kali:~# ipheader=IP(src=RandIP(), dst="10.10.10.10")

IP başlığı oluştururken src(kaynak makinenin ipsi)=RandIP() yazdık yani random bir IP ataması yaptık. dst(hedef makinenin ipsi)=”X.X.X.X” tcp paketinin göndereceğiniz hedef makinenin ipsini girmeniz gerekiyor.

ipheader

root@kali:~# packet=ipheader/tcpheader

komutuyla paketinizi oluşturabilirsiniz.

root@kali:~# send(packet)

komutuyla ise oluşturduğunuz paketi hedef makineye gönderebilirsiniz.

root@kali:~# packet.show()

komutu ile oluşturduğunuz paketin içeriğini görebilirsiniz.

Yukarıda yaptığımız bütün işlemleri paket üzerinde görebilirsiniz.

Scapy TCP Paketi Wireshark İncelemesi

Şimdi de oluşturduğumuz paketi Wireshark üzerinden incelemesini yapalım.

En yukarıya baktığınızda source kısmında TCP paketini oluştururken atadığımız random IPiyi görebilirsiniz. Destination kısmında ise hedef makinenin IP adresi yer alıyor.

Biraz da paketin IP(Internet Protocol) ve TCP(Transmission Control Protocol) kısımlarını inceleyelim. Internet Protocol kısmında IPv4 olarak oluşturduğumuz source(src) ve destination(dst) IP adresleri yer alıyor. Paketimizin toplam uzunluğunun 40 ve ttl(Time to Live) değerini de 64 olduğunu görüyoruz. TCP protokolü olduğu da görebilirsiniz.

Transmission Control Protocol kısmında random olarak oluşturduğumuz source port(kaynak port) ve destination port(hedef port=80) görebilirsiniz. Sequence number(SYN) ve Acknowledgment number(ACK) değerini 0 olarak görebilirsiniz. SYN segmenti gönderidiğimiz için Flags=SYN(“S”)’dir.

UDP Nasıl Çalışır?

UDP ise (sipariş, güvenilirlik veya veri bütünlüğü için) üçlü el sıkışma(3 way handshake) diyalogları olmadan basit bir transfer yöntemi kullanır. UDP ayrıca, ağ arayüzü düzeyinde bu tür işlemlerin ek yükünden kaçınmak için uygulamada hata denetimi ve düzeltmesinin ve doğruluğunun önemli olmadığını veya gerçekleştirilmediğini varsayar. Aynı zamanda yayın(broadcast) ve çok noktaya yayın(multicast) paketleri ile uyumludur.

UDP Başlığı(Header)

UDP başlığı, her biri 16 bit uzunluğunda olmak üzere 4 alandan oluşur. IPv4’te Kaynak Port Numarası ve Kontrol Sayısı (Checksum) seçimlik alanlardır. IPv6’da ise sadece Kaynak Port Numarası seçimliktir.

Kaynak Port Numarası

Seçimlik bir alandır. Bir cevap alınmasının gerektiği durumlarda gönderenin port numarasını barındırır. Gönderici host’un istemci olması halinde port numarası geçici, sunucu olması halinde ise yaygın olarak bilinen bir port numarası olur. Bu alanın sıfır olması, gönderen hostun bir kaynak port numarasına sahip olmadığı anlamına gelir.

TCP Özellikleri

  • Teslimat alındı bildirimi
  • Yeniden iletim
  • Ağ yoğun olduğunda iletimi(transferi) geciktirir.
  • Kolay Hata Tespiti

UDP Özellikleri

  • Paket kaybını tolere eden bantgenişliği-yoğun uygulamaları destekler.
  • Daha az gecikme olur.
  • Paketlerin toplu miktarını gönderir.
  • Veri kaybı olasılığı vardır.
  • Küçük işlemlere(transaction) izin verir (DNS (lookup)araması)

TCP ve UDP Arasındaki Fark

TCP UDP
Bağlantı odaklı(connection-oriented) bir protokoldür. Bağlantı odaksız bir protokoldür
TCP, verileri byte akışları olarak okur ve mesaj segment sınırlarına iletilir. UDP mesajları, tek tek gönderilen paketleri içerir. Ayrıca varış saatinde bütünlüğü kontrol eder.
TCP mesajları internette bir bilgisayardan diğerine geçer. Bağlantı tabanlı değildir, bu nedenle bir program diğerine çok sayıda paket gönderebilir.
TCP, veri paketlerini belirli bir sırada yeniden düzenler. UDP protokolünün sabit bir sırası yoktur çünkü tüm paketler birbirinden bağımsızdır.
TCP hızı daha yavaştır. UDP'de hata kurtarma denenmediği için daha hızlıdır.
Header(başlık) boyutu 20 bytedir. Header(başlık) boyutu 8 bytedir.
TCP ağırdır. Herhangi bir kullanıcı verisinin gönderilebilmesi için TCP'nin bir soket bağlantısı kurmak için üç pakete ihtiyacı vardır. UDP hafiftir. Bağlantıyı takip etme, mesajları sıralaması vb. özellikleri yoktur.
TCP, hata denetimi(error checking) yapar ve ayrıca hata giderme(error recovery) işlemi yapar. UDP hata denetimi yapar, ancak hatalı paketleri atar.
Acknowledgment segments(Onay bölümleri) vardır. Acknowledgment segments yoktur.
SYN, SYN-ACK, ACK gibi handshake(el sıkışma) protokolünü kullanır. El sıkışma yok (yani bağlantısız protokol)
TCP, verilerin hedef yönlendiriciye(router) teslim edilmesini garanti ettiği için güvenilirdir. UDP'de verilerin hedefe teslimi garanti edilemez.
TCP, verilerin akış kontrolü ve onayını sağladığı için kapsamlı hata kontrol mekanizmaları sunar. UDP, sağlama toplamları(checksums) için kullanılan tek bir hata kontrol mekanizmasına sahiptir.

TCP Uygulamaları

TCP/IP modelinin kullanılma avantajları şunlardır:

  • Farklı bilgisayar türleri arasında bağlantı kurmanıza yardımcı olur.
  • İşletim sisteminden(OS) bağımsız çalışır.
  • Birçok yönlendirme(routing) protokolünü destekler.
  • Kuruluşlar arasında internet çalışmasını sağlar.
  • Bağımsız olarak çalıştırılabilir.
  • TCP, iki bilgisayar arasında bir bağlantı kurmak için kullanılabilir.

UDP Uygulamaları

  • UDP yöntemi, büyük ölçüde zamana duyarlı uygulamaların yanı sıra daha büyük bir istemci tabanından küçük sorguları yanıtlayan sunucular tarafından kullanılır.
  • UDP, tüm ağ üzerinden paket yayınlarıyla(broadcasts) gönderme ve çok noktaya yayın(multicasting) gönderme için uyumludur.
  • DNS(Domain Name System), IP üzerinden ses ve çevrimiçi oyunlarda da kullanılır.

TCP

TCP kullanmanın dezavantajları şunlardır:

  • TCP, hareket halindeki tüm veriler açıkça sorulmadan bir iletimi asla tamamlamaz.
  • Yayın(broadcast) veya çok noktaya yayın(multicast) iletimi için kullanamazsınız.
  • TCP’nin blok sınırları yoktur, bu nedenle kendi sınırlarınızı oluşturmanız gerekir.
  • TCP, istemediğiniz birçok özellik sunar. Bant genişliğini, zamanı veya çabayı boşa harcayabilir.
  • TCP / IP’deki protokolü değiştirmek kolay değildir.
  • Hizmetlerinden, arayüzlerinden ve protokollerinden net bir ayrım sunmaz.

UDP Dezavantajları

UDP kullanmanın dezavantajları şunlardır:

  • UDP protokolünde, bir paket iki kez teslim edilemez veya teslim edilemez. Sipariş dışında teslim edilebilir, bu nedenle hiçbir belirti almazsınız.
  • Yönlendiriciler(routers) UDP konusunda oldukça dikkatsizdir, bu nedenle çarpışması durumunda asla yeniden iletmezler.
  • UDP’de Tıkanıklık Kontrolü(Congestion Control) ve akış kontrolü(flow control) yoktur, bu nedenle uygulama bir kullanıcı uygulamasının işidir.
  • UDP çoğunlukla daha kötü paket kaybından muzdariptir.

UDP ve TCP Ne Zaman Kullanılır?

  • TCP ideal bir seçimdir ve bununla ilişkili ek yükleri olsa bile, ek yükün çoğu bağlantıda olduğunda, uygulamanız herhangi bir süre boyunca bağlı kalır.
  • UDP, VoIP(Video IP)-Video ve ses gibi multimedya ile kullanım için idealdir.
  • Hem istemci(client) hem de sunucu(server) o anda bağımsız olarak paket gönderirken TCP soketlerini kullanın; ara sıra bir gecikme kabul edilebilir. (ör. Online Poker)
  • Hem istemci hem de sunucu paketleri ayrı ayrı gönderebiliyorsa kullanıcı UDP’sini kullanmalısınız ve zaman zaman gecikme de kabul edilemez. (ör. Çok oyunculu oyunlar).

Son Sözler

Bir portu ya da servisi en iyi öğrenme yöntemi onunla linuxta oynamaktır. Siz üzerinde çalıştığınız bir portu linux ortamında oluşturup test ederseniz bu aklınızdaki birçok soru işaretinin ortadan kalkmasında yardımcı olur. Neden sonuç ilişkini daha iyi kavrayabilirsiniz. Sanal makineler üzerinde dilediğinizce deneme yapabilirsiniz. Bu konuda birden fazla sanal makineye ihitiyaç duyabilirsiniz. Kali Linux içerisinde birçok toolun yer aldığı(TCP paketini oluştururken kullandığımız “scapy” toolu ve Wireshark gibi) debian tabanlı GNU/Linux danıtığımıdır. Siber Güvenlik alanında bir şeyler yapmak istiyorsanız tercihen Kali/Linux kullanmanız sizin işinizi kolaylaştırır.


Yazara ait diğer yazılar

TCP/UDP
Siber Güvenlik Nedir?
CTF Nedir?
Linux Dosya Sistemi
Alternatif Özgür Yazılımlar