
Open Systems Interconnection (OSI) referans modelinin dördüncü katmanı “Taşıma (Transport)” katmanıdır. Bu katmanın temel amacı, veriyi uygulama katmanına iletmek ve haberleşmenin takibini sağlamaktır. Taşıma katmanında iki önemli protokol bulunur: Transmission Control Protocol (TCP) ve User Datagram Protocol (UDP). Bu iki protokol, farklı trafik paternlerini taşımak için tasarlanmıştır.
TCP protokolü, ABD Savunma Bakanlığı’nın ARPANET projesi kapsamında geliştirilmiştir. İlk olarak askeri haberleşmenin eksiksiz ve güvenli iletimi için tasarlanmış, zamanla genel ağ iletişimi için standart bir protokol haline gelmiştir. TCP’nin temel amacı, veri iletimini güvenilir bir şekilde sağlamak ve hatasız veri aktarımını gerçekleştirmektir. Bu sayede, verinin kaybolma veya bozulma riski minimize edilir.
TCP protokolünün birçok özelliği bulunmaktadır. Bunlardan biri, haberleşmeye başlamadan önce iletişim kurulacak cihaz ile “Üçlü El Sıkışması” (Three-Way Handshake) yapmasıdır. Bu işlem, karşı tarafla tanışmak ve senkronizasyon sağlamak amacıyla gerçekleştirilir. UDP protokolünde bu şekilde bir sunucu ile ön tanışma yapılmaz.
TCP protokolü güvenilir teslimat sağlar. Bir paket yolda bozulduysa TCP protokolü bozulan paketi tekrar talep eder. Ayrıca paketler farklı yollardan gelebilir. Böyle bir durumda kimi paketler önce ulaşırken kimileri daha geç ulaşır. Bu durumda TCP bu paketleri tekrardan sıraya dizer yani “reordering” yapar. UDP protokolü, bozuk paketleri tekrar talep edemez ve farklı sırada gelen paketleri yeniden sıralamaz. Bu nedenle, veri iletiminde güvenilirlik ve sıralama garantisi sunmaz.
Bunun yanı sıra, TCP protokolü “Akış Kontrolü” (Flow Control) da gerçekleştirir. Bu özellik sayesinde, belirli durumlarda veri iletim hızını artırırken, diğer durumlarda hızı yavaşlatır. UDP protokolü ise bu özelliğe sahip değildir.
TCP başlık boyutu 20 byte’tır. Başlık içeriğini daha detaylı incelemek için aşağıdaki görsele bakabilirsiniz.

“Source Port” ve “Destination Port” bilgisi, “Transport” katmanı için en önemli değerlerdir. Bu bilgiler, hedef sunucudan alacağımız hizmeti belirler. Port numaraları 16 bittir, bu da “0-65535” arasında toplamda “65536” port olduğu anlamına gelir.
Port numaraları oldukça kritiktir. Bugün, port numaraları sayesinde bir sunucudan birden fazla hizmet alabiliyoruz. Örneğin, aynı sunucu üzerinde aynı anda “Web Sunucusu”, “FTP (File Transfer Protocol)” ve “NTP (Network Time Protocol)” gibi hizmetler kurabiliyoruz. Aynı şekilde, bilgisayarımızdan Youtube’da bir video izlerken diğer yandan online bir oyun da oynayabiliyoruz.
Sunucu tarafında gereksiz port açmak, belirli durumlar için riskli olabilir. Özellikle, eğer ilgili sunucu internet üzerinden herkesin erişebileceği bir sunucuysa ve kullanılmayan bir servis için bir port açılmışsa, bu durum tehlike oluşturabilir. Çünkü bir cihaz üzerinde port açmak, aslında kullanıcılar için bir kapı açmak anlamına gelir. Bu, ilgili port üzerinden sunucuya veri gönderebilecek kullanıcıların olacağı anlamına gelir ve bu durum risk teşkil edebilir.
Örneğin, bir sunucu üzerinde “Apache Web Sunucusu” kurduğumuzu varsayalım. Bu durumda 80 ve 443 portları açılacaktır. Eğer sunucunun güncellemelerini takip etmez ve bunları kaçırırsak, tehdit aktörleri sunucumuza çeşitli saldırı vektörleri kullanarak saldırabilirler. Bu saldırılardan biri, yetki yükseltme (Privilege Escalation) saldırılarıdır. Bu tür bir saldırıyı gerçekleştiren kullanıcı başarılı olursa, sistemdeki en yetkili kullanıcı haline gelir. Bu da bir sistem yöneticisi için istenmeyen bir durumdur.
Port numaraları sadece sunucular tarafından açılmaz; istemci cihazlar da bir hizmet almadan önce boş bir port numarasını açar ve ilgili sunucudan gelen cevapları bu port üzerinden kabul eder. İstemci tarafında port açmak genellikle riskli değildir. Normal bir kullanıcı, kendi isteğiyle bir port açamaz; bunun için ilgili bir servisi başlatması gerekir. Bu nedenle, istemci tarafında port açma işlemi, genellikle belirli bir kontrol altında gerçekleşir.
Port numaraları 0-65535 arasındadır. Bu port numaraları, “IANA” (Internet Assigned Numbers Authority) tarafından üç gruba ayrılmıştır.
- Well-Known Ports ( İyi Bilinen Portlar ) : Bu port numara aralığı 1-1023 arasındadır. Bu portlar, açık standart olan protokollere tahsis edilmiştir. Aşağıdaki protokoller bu gruba örnek teşkil etmektedir:

- Registered Ports (Kayıtlı Portlar): Bu port aralığı 1024-49151 arasındadır. Bu aralıktaki port numaraları, açık standart olmayan ancak farklı teknoloji firmaları tarafından geliştirilmiş protokoller için IANA tarafından verilmektedir. Örneğin, 1813 numaralı port, IANA tarafından Cisco’nun RADIUS protokolü için tahsis edilmiştir.
Hangi port numarasının hangi protokol için tahsis edildiğini aşağıdaki IANA’nın resmi sayfasından öğrenebilirsiniz:
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?&page=1
- Dynamic or Private Ports (Dinamik veya Özel Portlar): İstemci cihazların bir hizmet almak istediği zaman “Source-Port” olarak kullandığı port aralığıdır. Bu aralık 49152-65535 arasındadır.
İstemci cihazımızdan yaptığımız bağlantıları görüntülemek için kullanabileceğimiz araç “netstat”tır. Bu aracı komut satırı üzerinden kullanabiliriz. “Netstat” ile istemci cihazımızın hangi sunuculara bağlandığını, hangi kaynak portunun açıldığını ve sunucudaki hangi porta bağlandığımız gibi bilgileri görüntüleyebiliriz.
“netstat” aracının birçok parametresi bulunmaktadır. Sadece “neststat” yazmamız durumunda yaptığımız TCP bağlantıları listelenecektir.
C:\>netstat ( Sadece TCP bağlantılarını listeler. )
C:\>netstat -a ( Hem UDP hem de TCP bağlantılarını listeler. Bunun yanında cihazımızdaki açık portları görmemizi sağlar.
C:\>netstat -an ( Port numaralarını numerik olarak görmemizi sağlar. Örneğin https değilde 443 yazar. )
C:\>netstat -r ( İstemci cihazın yönlendirme tablosunu getirir. Bunun dışında "route print" komutu da aynı şekilde yönlendirme tablosunu getirmektedir. )TCP başlığındaki en önemli ikinci unsur, “Sequence” ve “Acknowledgment” numaralarıdır. Veri, taşıma katmanında parçalara ayrılır ve her parçaya bir sıra numarası atanır; bu numaraya “Sequence Number” denir. “Acknowledgment” değeri ise iletilen verinin onayını gösterir. TCP, eksiksiz iletim sağlayan bir protokoldür. Acknowledgment değeri, iletişimde bulunduğumuz sunucu tarafından gönderilir ve bu değer, sunucunun hangi paketleri aldığını bildirir. Örneğin, sunucu 1, 2, 3, 4 ve 5 numaralı “Sequence” numaralarına sahip segmentleri aldığını belirttiğinde, biz de 6 numaralı segmenti göndeririz. Bu mekanizma, TCP’nin güvenli ve eksiksiz veri iletimi sağlamasına yardımcı olur.
“Header Length” değeri, TCP başlığının boyutunu belirtir ve genellikle 20 bayt olarak tanımlanır. Bu nedenle, bu alana 20 yazılır. TCP başlığı, ek alanlar (örneğin, seçenekler) içerdiğinde bu boyut artabilir, ancak standart durumda 20 bayt olarak kabul edilir.
“Reserved”, TCP protokolünün gelecekteki sürümlerinde veya genişletmelerinde ek özelliklerin veya işlevlerin eklenebilmesi için yer tutucu olarak kullanılır. Şu anda genellikle 0 olarak ayarlanır, ancak gerektiğinde kullanılabilir. Bu mekanizma, protokolün esnekliğini artırır ve genişletilebilirliğini sağlar. Kısaca bu alan günümüzde kullanılmıyor.
TCP başlığındaki “Control Bits” (veya “Flags”), TCP bağlantısının durumunu ve kontrol bilgilerini belirlemek için kullanılır. Bu bitler, belirli bir işlemi veya durumu temsil eder ve iletişimin yönetiminde önemli rol oynar. İşte bazı temel kontrol bitleri ve işlevleri:
- URG ( Urgent ) : Tampon bellekte ön kayırma yapmak veya önceliklendirme yapmak için kullanılan bittir.
- ACK (Acknowledgment): Bu bit set edildiğinde, başlığın Acknowledgment numarasının geçerli olduğu ve alıcının önceki paketleri onayladığı anlamına gelir.
- PSH (Push): Alıcı tarafın veriyi hemen uygulamaya göndermesini ister. Bu bit set edildiğinde, veri uygulama katmanına hızla iletilir. ( Normalde gelen paketler direkt olarak uygulama katmanına çıkarılmaz belli bir boyuta ulaşana kadar bir bellekte bekler. )
- RST (Reset): Bağlantıyı sıfırlamak için kullanılır. Bu, beklenmeyen bir durum veya hata oluştuğunda iletişimi kesmek için yararlıdır.
- SYN (Synchronize): Yeni bir bağlantı kurulurken sıra numaralarının senkronizasyonunu sağlamak için kullanılır. TCP bağlantı kurulumunun üç aşamalı el sıkışma sürecinin ilk adımında yer alır.
- FIN (Finish): Bağlantının kapatılacağını belirtir. Bu bit set edildiğinde, veri gönderimi tamamlanmış ve bağlantı sonlandırılmak isteniyor demektir.
Bu kontrol bitleri, TCP’nin güvenilir ve düzenli bir iletişim sağlamasına yardımcı olur.
“Window” başlığı, akış kontrolünde kullanılan bir alandır. Bu değer, onay alınmadan (ACK) iletilebilecek maksimum veri boyutunu belirtir. “Window” değeri, alıcının mevcut kapasitesini göz önünde bulundurarak arttırılıp azaltılabilir. Bu mekanizma, veri akışını düzenleyerek ağ üzerindeki tıkanıklığı önlemeye ve iletişimin verimliliğini artırmaya yardımcı olur.
TCP başlığındaki “Checksum”, iletilen verinin bütünlüğünü sağlamak için kullanılan bir hata kontrol mekanizmasıdır. Bu alan, gönderilen TCP segmentinin başlığı ve verisi üzerinde hesaplanan bir toplamı içerir. Alıcı taraf, aldığı segmentin checksum değerini yeniden hesaplayarak, verinin iletim sırasında bozulup bozulmadığını kontrol eder.
Eğer hesaplanan checksum değeri, başlıkta belirtilen değerle eşleşiyorsa, veri bütünlüğü sağlanmış demektir. Eğer eşleşmiyorsa, bu durumda veri hatalı kabul edilir ve genellikle yeniden iletim talep edilir. Bu mekanizma, TCP’nin güvenilir veri iletimi sağlamasında önemli bir rol oynar.
TCP başlığındaki “Options” alanı, protokolün belirli özelliklerini genişletmek veya özelleştirmek için kullanılan bir alandır.
TCP protokolünde haberleşmeye başlamadan önce Üçlü El Sıkışması ( Three Way Handshake ) gerçekleştirilir. Burada istemci ve sunucu birbirlerine “Sequence” numaralarını öğretirler. Bu süreç istemci cihaz tarafından başlatılır. Üçlü el sıkışması sürecinde herhangi bir data taşınmaz. Yani 7,6 ve 5. katman başlıkları bulunmaz.

Süreç, istemci cihazın “SYN” göndermesi ile başlar. SYN biti ile istemci, “Sequence” numarasının başlangıç değerini sunucuya iletir. Sunucu, istemciden gelen “SYN” bitini aldığında, “SYN ve ACK” bitlerini gönderir. Sunucu, “SYN” biti ile kendi sıra numarasının başlangıç değerini istemciye bildirir (Sıra numaraları 0’dan başlamaz). Ayrıca, istemcinin gönderdiği sıra numarasını aldığını onaylamak için “ACK” biti gönderir. Örneğimizde ACK biti içinde 101 yazmaktadır; bu, sunucunun istemcinin gönderdiği 100 numaralı segmenti aldığını ve 101 numaralı segmenti beklediğini gösterir.
Daha sonra istemci cihaz, sunucunun gönderdiği sıra numarasını aldığını belirten bir “ACK” biti gönderir. Örneğimizde bu değerin 301 olması, sunucunun “Sequence” numarasının 300’den başladığı anlamına gelir. İstemci, bu numarayı aldı ve 301 numaralı segmenti talep etmektedir. Bu işlem tamamlandığında bağlantı kurulmuş olur ve veri aktarımı başlayabilir. Her TCP oturumunda bu süreç gerçekleşmektedir. Bu aslında verinin güvenli iletilmesini sağlamaktadır. Eğer iletim sırasında bir segment bozulursa, istemci ve sunucu birbirlerine bu segmentin alınmadığını bildirir ve eksik olan segmentin yeniden gönderilmesini talep eder. Bu özellik, TCP protokolünün güvenli ve eksiksiz veri iletimi yapmasını sağlar. Günümüzde TCP bu şekilde çalıştığı için eksik yüklenmiş bir web sayfası görmeyiz veya parçalanmış bir e-posta almayız.
** Three-Way-Handshake sürecinde gönderilen paketlerde herhangi veri taşınmaz.
TCP haberleşmesini sonlandırmak için de “FIN” bitleri kullanılmaktadır.

Haberleşmeyi sonlandırmak isteyen taraf, karşı tarafa bir “FIN” biti gönderir. Karşı taraf bu “FIN” bitini aldığında, bunu aldığını belirten bir “ACK” biti ile yanıt verir. Ardından, karşı taraf da bir “FIN” biti gönderir. İlk cihaz, bu “FIN” bitini aldığında, aldığına dair bir “ACK” mesajı göndererek bitirme sürecini onaylar. Böylece “TCP” oturumu sonlandırılmış olur.
** TCP haberleşmesini başlatmak ve bitirmek için toplamda 7 paket kullanılmaktadır.
Her ne kadar TCP güvenli ve eksiksiz bir haberleşme sağlasa da yapısı gereği bazı güvenlik açıkları barındırmaktadır. Bu açıkların başında, “SYN Flood” olarak bilinen saldırı gelmektedir. Temelde bir “Servis Dışı Bırakma” (DoS) saldırısı olan bu saldırıda, TCP’nin üç yönlü el sıkışma süreci kötüye kullanılarak hedef sistemin çalışamaz hale getirilmesi amaçlanır.

Saldırgan cihaz, sunucuya bir “SYN” mesajı göndererek Üçlü El Sıkışma sürecini başlatır. Karşı taraftaki sunucu, yanıt olarak “SYN,ACK” mesajı gönderir. Normal şartlarda, istemcinin bir “ACK” göndererek bu süreci tamamlaması gerekir. Ancak saldırgan, bu “ACK” mesajını göndermez ve sunucu, bu yanıtı belirli bir süre boyunca bekler. Bu sırada saldırgan, farklı cihazlar kullanarak bu işlemi tekrar tekrar başlatarak sunucunun bağlantı kuyruğunu doldurur. Sunucuların sınırlı kapasitesi olduğundan, bu kapasite dolduğunda sunucu normal trafiğe yanıt veremez hale gelir ve saldırı amacına ulaşır.
Günümüzde siber güvenlik teknolojilerinin gelişmesiyle birlikte, sunucu önüne güvenlik cihazları konumlandırılmaktadır. Bu cihazlar, kullanıcılardan gelen “Three-Way Handshake” süreçlerini kendi üzerinden yanıtlar ve süreç tamamlanmadan trafiği sunucuya iletmez. Bu sayede saldırılar etkisiz hale getirilir. Örneğin, Cloudflare gibi güvenlik sağlayıcılar, bu tür saldırıları engelleyebilecek şekilde tasarlanmıştır.
TCP, eksik bir paket aldığında o paketin yeniden gönderilmesini talep eder. Ayrıca, farklı sırada gelen segmentleri doğru sıralamaya koyarak veri bütünlüğünü sağlar. Bu özellikler, TCP’nin güvenilir bir veri iletimi sağlamasına yardımcı olur.

Eskiden bu süreç yukarıdaki gibi çalışmaktaydı. Örneğin, A cihazı sırayla 1,2,3,4,5,6,7,8,9 ve 10 numaralı segmentleri gönderdi. B cihazı ise bu segmentlerden yalnızca “1,2,5,6,7,8,9,10” numaralı segmentleri aldı, ancak 3 ve 4 numaralı segmentleri almadığını varsayalım. Bu durumda, B cihazı 3 ve 4 numaralı segmentlerin eksik olduğunu A cihazına bildirecektir. Eski işletim sistemlerinde 3 ve 4 numaralı segmentler eksik olduğunda, sonraki segmentler geçerli sayılmıyordu. Yani, 3,4,5,6,7,8,9 ve 10 numaralı segmentlerin tamamı yeniden gönderilmek zorundaydı. Bu da zaman kaybına ve gereksiz tekrar gönderimlere yol açıyordu.
Bu süreç yeni nesil işletim sistemleri ile değişti.

Süreç artık yukarıdaki gibi çalışmaktadır. Yine, 3 ve 4 numaralı segmentlerin bozulduğunu, 1, 2, 5, 6, 7, 8, 9 ve 10 numaralı segmentlerin hedefe ulaştığını varsayalım. Bu durumda, B cihazı 3 ve 4 numaralı segmentleri yeniden talep ederken, yanına “SACK (Selective ACK)” bitini ekler. Bu, B cihazının 5, 6, 7, 8, 9 ve 10 numaralı segmentleri aldığını ve bu segmentlerin yeniden gönderilmesine gerek olmadığını belirtir. Bu sayede zaman kaybı ortadan kalkar ve gereksiz tekrar gönderim sorunları çözülür.
Ancak eski nesil bir IoT cihazı, ilk yöntemle çalıştığı için gönderilen “Selective ACK (SACK)” bitini görmezden gelebilir.

TCP, akış kontrolü sağlar ve bunun için “Window” (Pencere) adı verilen bir bölüm kullanılır. Bu bölüm, karşı tarafa onaysız (ACK ile onay almadan) maksimum ne kadar veri gönderebileceğimizi gösterir. Eğer bu değer olmasaydı, her bir segment gönderildiğinde bir “ACK” beklenmesi gerekecekti; bu da zaman kaybına yol açardı.
Akış kontrolü, bu pencere değerinin arttırılması veya azaltılması ile gerçekleştirilir. Eğer pencere değeri azaltılırsa, daha fazla onay gerekeceğinden gönderim hızı yavaşlar. Pencere değeri arttığında ise daha az onay gerekeceğinden gönderim hızı artar. Bu pencere değeri, çeşitli nedenlere bağlı olarak iletişim sırasında TCP tarafından dinamik olarak arttırılıp azaltılabilir.
UDP (User Datagram Protocol), güvenilir ve eksiksiz veri iletiminden ziyade hızlı teslimatı öncelikli hedef olarak alır. Bu protokol, özellikle gerçek zamanlı haberleşme uygulamalarında tercih edilmektedir. Örneğin, Webex gibi platformlardaki ses ve görüntü paketleri genellikle UDP üzerinden iletilir. Bu durumda, temel amaç hızdır; bu nedenle veri kaybı veya hata düzeltme mekanizmaları yerine iletim süresi ön planda tutulur. UDP protokolü, tek bir paket ile çözülebilen bazı protokoller için tercih edilmektedir. Bu protokollere örnek olarak DNS (Domain Name System) ve DHCP (Dynamic Host Configuration Protocol) verilebilir. Bu protokoller, yapıları gereği çok az sayıda paket kullanarak çözüme ulaşır, bu nedenle UDP kullanımı avantajlıdır.
** DNS protokolü, istisnai olarak hem TCP hem de UDP üzerinden çalışmaktadır. Normalde, kullanıcı bir DNS sorgusu yaptığında bu trafik UDP üzerinden gerçekleşir. Ancak, bazı durumlarda DNS sunucuları, bilgilerini birbirlerine kopyalamak için iletişim kurar. Bu gibi durumlarda, iletilen veri boyutları büyük olabileceğinden eksiksiz iletim sağlanması istenir. Bu nedenle, bu tür durumlarda DNS protokolü TCP üzerinden çalışır.
UDP başlığı 8 bayt boyutundadır ve içeriği aşağıdaki gibidir:

UDP protokolünde amaç hız olduğu için eksik paketler tekrar talep edilmez. Örneğin, Webex üzerinde bir toplantıda olduğunuzu düşünün; burada ses ve görüntü paketleri UDP ile iletilmektedir. Karşı taraf konuşurken, arada bazı sesler size ulaşmıyorsa, yani ses paketleri yolda kaybolmuşsa, UDP bu eksik paketleri yeniden istemez. Bu durumda, karşı tarafın söylediklerini duyamazsınız. Ancak, insanları TCP’ye benzetebiliriz; çünkü duyamadığınız anlarda karşınızdaki kişiden söylediklerini tekrar etmesini isteyebilirsiniz.
Daha fazla bilgisayar-ağları içeriği için takipte kalın…

Leave a Reply