TCP ve UDP Nedir? Portlar ve Bağlantılar Nasıl Çalışır?

TCP ile UDP arasındaki fark ne? Üç yönlü el sıkışma, sıra ve onay numaraları, yeniden gönderme, FIN ve RST ile kapanış; UDP'nin bağlantısız yapısı, port aralıkları, geçici portlar ve trafik akışlarını ayıran beşli bilgi.

Standartlar RFC 9293, 768, 6335, 1035, 7766, 2131, 9000, 9113, 9114; IANA Service Name and Port Number Registry
Resmi dokümana göre
İşletim sistemleri Microsoft Learn (Windows dinamik port aralığı); Linux man-pages (ip_local_port_range)
Resmi dokümana göre

OSI ve TCP/IP yazısında taşıma katmanını bir başlık olarak görmüştük: TCP 20 baytlık, UDP 8 baytlık bir başlık ekler. Bu yazı o başlıkların ne işe yaradığını anlatıyor. Bir bilgisayarın aynı anda onlarca uygulamayla nasıl konuştuğunu, TCP’nin veriyi göndermeden önce neden bir bağlantı kurduğunu, UDP’nin neden kurmadığını ve iki trafiğin birbirinden nasıl ayırt edildiğini göreceğiz.

Örneklerde sitenin adres planını kullanıyoruz: istemci 10.0.20.25, intranet sunucusu 10.0.30.10, DNS sunucusu 10.0.30.11.

Port: bilgisayarın içindeki adres

IP adresi paketi doğru bilgisayara getirir. Ama o bilgisayarda aynı anda bir tarayıcı, bir e-posta istemcisi ve bir güncelleme servisi çalışıyor olabilir. Gelen verinin hangi uygulamaya gideceğini port numarası söyler. TCP ve UDP başlıklarında bir kaynak port ve bir hedef port bulunur; her biri 0 ile 65535 arasında bir sayıdır.

Sunucu tarafındaki servisler bilinen portlarda dinler: HTTPS için 443, DNS için 53 gibi. İstemci ise bağlantıyı başlatırken kaynak port olarak o an boş olan bir numara seçer. Bu numaraya geçici (ephemeral) port denir; bağlantı bitince serbest kalır.

IANA’nın port kaydı numaraları üç aralığa ayırır:

Aralık IANA’daki adı Anlamı
0–1023 System Ports IETF süreçleriyle atanır; SSH, DNS, HTTPS gibi temel servisler
1024–49151 User Ports Başvuruyla atanabilir
49152–65535 Dynamic and/or Private Ports Hiçbir servise atanmaz

Geçici portların hangi aralıktan seçileceğine işletim sistemi karar verir ve bu aralık IANA’nın dinamik aralığıyla aynı olmak zorunda değildir. Microsoft’un belgesine göre Windows, Vista ve Server 2008’den beri IANA önerisine uyarak 49152–65535 aralığını kullanır; daha eski sürümler 1025–5000’i kullanıyordu. Linux’ta aralık ip_local_port_range ayarıyla belirlenir. Bu yazıdaki 51514 gibi kaynak portlar örnektir.

TCP: önce bağlantı, sonra veri

TCP bağlantı yönelimlidir: veri göndermeden önce iki taraf bir bağlantı kurar. Bu bağlantı üç yönlü el sıkışma ile kurulur:

  1. SYN: İstemci (10.0.20.25:51514) sunucuya (10.0.30.10:443) bağlantı kurmak istediğini bildirir.
  2. SYN-ACK: Sunucu isteği onaylar ve kendi tarafında da bağlantıyı başlatır.
  3. ACK: İstemci sunucunun SYN’ini onaylar. Bağlantı kurulmuştur, veri akabilir.
TCP · HTTPS UDP · DNS İstemci 10.0.20.25:51514 Sunucu 10.0.30.10:443 SYN SYN-ACK ACK veri ve ACK'ler FIN ACK sunucu bu yönde hâlâ gönderebilir FIN ACK kurulum veri kapanış İstemci 10.0.20.25:53007 DNS 10.0.30.11:53 sorgu yanıt El sıkışma ve bağlantı yok. Yanıt gelmezse DNS istemcisi yeniden sorar. TCP'de onaylanmayan veri yeniden gönderilir; iki yön ayrı ayrı FIN ile kapanır. UDP'de el sıkışma ve yeniden gönderme yoktur.
TCP veri göndermeden önce bağlantı kurar ve iki yönü ayrı ayrı kapatır; UDP doğrudan datagram gönderir. Kaynak portlar örnektir.

Bağlantı kurulduktan sonra TCP iki şeyi takip eder:

  • Sıra numarası: RFC 9293’e göre TCP’de gönderilen her baytın bir sıra numarası vardır. Alıcı, parçaları yanlış sırada alsa bile bu numaralarla doğru sıraya dizer ve eksik olanı fark eder.
  • Onay numarası: Alıcı, hangi noktaya kadar her şeyi eksiksiz aldığını onay (ACK) ile bildirir. Belirli bir süre içinde onaylanmayan veri yeniden gönderilir.

Bu sayede TCP, veriyi karşı taraftaki TCP’ye eksiksiz ve sırasıyla ulaştırmaya çalışır. Ama bu, uygulamanın işini başarıyla yaptığı anlamına gelmez. TCP baytları teslim eder; sunucu isteği reddedebilir ya da hata dönebilir. Ağ uzun süre kopuk kalırsa bağlantı da sonunda düşer. Kısacası TCP güvenilir bir taşıma sağlar, başarılı bir işlemi garanti etmez.

Bağlantıyı kapatmak: FIN ve RST

TCP bağlantısı iki yönlüdür ve RFC 9293’e göre iki yön birbirinden bağımsız kapanır.

  • FIN, “bu yönde gönderecek verim kalmadı” demektir. İstemci FIN gönderdiğinde yalnızca istemciden sunucuya giden yön kapanır. Sunucu, kendi yönünde göndermek istediği veriyi göndermeye devam edebilir. İşi bitince o da FIN gönderir ve istemci bunu onaylar. Yani normal bir kapanışta iki FIN ve iki onay görülür; tek bir FIN bağlantının iki yönünü birden anında kapatmaz.
  • RST ise bağlantıyı düzgün kapatmak değil, sonlandırmaktır. RFC 9293’e göre RST, gelen bir segment o bağlantıya ait görünmediğinde gönderilir ve RST alan taraf bağlantıyı hemen kapatır; bekleyen veri için bir kapanış süreci işlemez. Örneğin kapalı bir porta bağlantı isteği geldiğinde cevap çoğunlukla RST’dir.

Firewall’ların bu durumları nasıl izlediği ve yarım kalan el sıkışmanın sahadaki anlamı Stateful firewall ve zone tabanlı politika tasarımı yazısında; SYN paketlerinin saldırıda nasıl kullanıldığı DDoS yazısında.

UDP: bağlantı yok, sadece datagram

UDP bağlantısızdır. El sıkışma, sıra numarası ya da onay yoktur. Uygulama veriyi bir datagram olarak gönderir; UDP onu bir başlıkla (kaynak port, hedef port, uzunluk, sağlama toplamı) IP’ye verir. Datagram kaybolursa UDP bunu fark etmez ve yeniden göndermez.

Bu bir eksiklik değil, bir tercih. Kısa bir soru ve cevaptan oluşan işlerde bağlantı kurmak gereksiz bir gecikmedir. Bir DNS sorgusu bunun tipik örneğidir: istemci 10.0.20.25:53007’den DNS sunucusuna (10.0.30.11:53) tek bir datagramla sorar, sunucu tek bir datagramla cevap verir. Cevap gelmezse sorguyu tekrarlamak DNS istemcisinin işidir.

Güvenilirlik gerektiğinde bunu UDP’nin üstündeki uygulama da sağlayabilir. Buna en bilinen örnek QUIC’tir: RFC 9000’e göre QUIC paketleri UDP datagramlarının içinde taşınır ve QUIC güvenilir teslim için gereken geri bildirimi kendisi sağlar. HTTP/3 bu yüzden UDP üzerinde çalışırken güvenilir bir iletişim sunabilir. Yani “UDP güvenilmezdir” cümlesi UDP’nin kendisi için doğrudur; UDP kullanan her uygulama için değil.

TCP ve UDP yan yana

TCP UDP
Bağlantı Önce el sıkışma ile kurulur Yok; datagram doğrudan gönderilir
Sıra ve onay Var Yok
Kayıpta TCP yeniden gönderir UDP fark etmez; gerekirse uygulama tekrarlar
Kapanış Her yön FIN ile ayrı kapanır; RST ile sonlandırılabilir Kapanacak bir bağlantı yok
Başlık En az 20 bayt 8 bayt

Hangi uygulama hangisini kullanır?

Uygulama Taşıma ve port Not
DNS UDP/53 ve TCP/53 Sorguların çoğu UDP’dir; RFC 7766’ya göre DNS yazılımları TCP’yi de desteklemek zorundadır. Zone transferleri ve UDP’ye sığmayan büyük yanıtlar TCP’yi kullanır.
DHCP UDP/67 ve UDP/68 İstemciden sunucuya 67, sunucudan istemciye 68 (RFC 2131).
SSH TCP/22
HTTPS (HTTP/1.1, HTTP/2) TCP/443
HTTP/3 Genellikle UDP/443 QUIC üzerinden; sunucu HTTP/3’ü başka bir UDP portundan da sunabilir (RFC 9114).
NTP UDP/123

Aynı numaranın TCP’de ve UDP’de ayrı portlar olduğunu unutmamak gerekir: TCP/443 ile UDP/443 iki farklı kapıdır. Bir firewall ya da ACL kuralında “443’e izin ver” yazarken hangi protokolün kastedildiği bu yüzden önemlidir; kuralların bu alanlarla nasıl yazıldığı ACL Nedir? Standart ve Genişletilmiş ACL yazısında.

Beşli bilgi: akışları birbirinden ayırmak

Aynı istemcinin aynı intranet sunucusuna iki ayrı TCP bağlantısı açtığını varsayalım. İki tarayıcı sekmesi her zaman iki bağlantı demek değildir; HTTP/2 aynı bağlantı üzerinde birden fazla isteği taşıyabilir. Bu örnekte bağlantılar gerçekten ayrıdır ve ikisinin de hedefi 10.0.30.10:443’tür. Sunucu ve aradaki cihazlar bunları neden karıştırmaz? Çünkü her trafik beş bilgiyle tanımlanır:

  1. Kaynak IP adresi
  2. Hedef IP adresi
  3. Kaynak port
  4. Hedef port
  5. Protokol (TCP ya da UDP)

İki bağlantı dört alanda aynıdır, ama kaynak portları farklıdır (51514 ve 51515). Bu tek fark, iki TCP bağlantısını birbirinden ayırmaya yeter.

İstemci 10.0.20.25 Intranet 10.0.30.10 DNS 10.0.30.11 Bağlantı 1 · TCP :51514 → :443 Bağlantı 2 · TCP :51515 → :443 DNS · UDP :53007 → :53 Akış Kaynak IP Hedef IP Kaynak port Hedef port Protokol Bağlantı 1 10.0.20.25 10.0.30.10 51514 443 TCP Bağlantı 2 10.0.20.25 10.0.30.10 51515 443 TCP DNS 10.0.20.25 10.0.30.11 53007 53 UDP Bağlantı 1 ve 2 yalnızca kaynak portta ayrılır; bu, iki TCP bağlantısını ayırmaya yeter. DNS satırı bir bağlantı değil, bir UDP akışıdır; yanıtta IP'ler ve portlar yer değiştirir.
Bir trafik beş bilgiyle tanımlanır: kaynak ve hedef IP, kaynak ve hedef port, protokol. TCP'de bu bir bağlantıyı, UDP'de bir akışı gösterir.

UDP’de bağlantı olmadığı için beşli bilgi bir bağlantıyı değil, bir trafik akışını tanımlar: aynı beşli bilgiye sahip datagramlar aynı akışa aittir. DNS sorgusunun beşli bilgisi (10.0.20.25:53007 → 10.0.30.11:53, UDP) ile yanıtınınki birebir aynı değildir: yanıtta kaynak ve hedef IP’ler ile portlar yer değiştirir (10.0.30.11:53 → 10.0.20.25:53007). İki yön aynı karşılıklı iletişimin parçası olarak eşleştirilir; ama arada TCP’deki gibi kurulmuş bir bağlantı yoktur. DNS ayrıca kendi başlığındaki 16 bitlik Transaction ID alanından yararlanır: RFC 1035’e göre bu değeri sorguyu üreten program atar ve sunucu yanıta kopyalar; istemci aynı anda bekleyen birden fazla sorgunun yanıtlarını bu değerle doğru sorguya bağlar. Firewall’lar da UDP’yi bu akışlar üzerinden ve bir zaman aşımıyla takip eder.

Sık karıştırılanlar

  • Port, switch portu değildir. Switch’in önündeki fiziksel portlar kabloların takıldığı yerlerdir. TCP ve UDP portu ise bir bilgisayarın içindeki uygulamayı gösteren bir sayıdır; aynı kelime iki farklı şeyi anlatır.
  • Açık port, kendi başına bir açık değildir. Bir portun açık olması, o portta bir servisin dinlediği anlamına gelir. Risk, o servisin kime açık olduğuna ve ne kadar güncel olduğuna bağlıdır; bu yüzden gereksiz servisler kapatılır, gerekli olanlara erişim firewall ve ACL kurallarıyla sınırlanır.

Kendinizi deneyin

Alıştırma 1: Bir paketin başlık bilgileri: kaynak 10.0.20.25:52011, hedef 10.0.30.11:53, protokol UDP. Bu hangi trafik? İstemci hangi taraf? Sunucunun cevabının beşli bilgisi ne olur? Bu iki paket arasında bir TCP bağlantısı var mı?

Cevap ve açıklama
  • Hangi trafik: Hedef port UDP/53, yani bir DNS sorgusu.
  • İstemci: 10.0.20.25. 52011 bir geçici port; istemci sorguyu başlatırken seçmiş. Hedef ise bilinen DNS portu 53.
  • Cevabın beşli bilgisi: Sorgununkiyle birebir aynı değildir; kaynak ve hedef yer değiştirir: kaynak 10.0.30.11:53, hedef 10.0.20.25:52011, protokol UDP. İstemci yanıtı bu ters eşleşmeyle ve DNS başlığındaki Transaction ID ile sorgusuna bağlar.
  • TCP bağlantısı var mı? Hayır. Trafik UDP; el sıkışma ve bağlantı yok. İki datagram, yönleri ters olan aynı karşılıklı UDP iletişiminin parçasıdır.

Alıştırma 2: İki durum için hangi taşıma protokolünün kullanıldığını ve nedenini söyleyin: (a) bir dizüstü bilgisayar intranet sunucusundan HTTPS üzerinden HTTP/2 ile bir dosya indiriyor; (b) aynı bilgisayar ağa ilk bağlandığında DHCP ile IP adresi alıyor.

Cevap ve açıklama
  • (a) TCP/443. HTTPS HTTP/2 ile TCP üzerinde çalışır. Dosyanın eksiksiz ve doğru sırayla gelmesi gerekir; TCP’nin sıra ve onay numaraları ile yeniden gönderme bu işi yapar.
  • (b) UDP/67 ve UDP/68. DHCP UDP kullanır: istemci sunucunun 67 numaralı portuna, sunucu istemcinin 68 numaralı portuna gönderir. TCP bir bağlantıyı iki belirli uç arasında kurar; ağa yeni katılan ve henüz IP adresi olmayan bir istemci, adresini bilmediği bir sunucuyla önce TCP bağlantısı kuramaz. Kısa soru ve cevaplardan oluşan bu iş için UDP yeterlidir; cevap gelmezse DHCP istemcisi isteği tekrarlar.

Kaynaklar

#temeller#tcp#udp#portlar

Kemal Keleş

Network & Security Engineer · CCNA · HCSA · NSE 3

Switching, routing, firewall ve kampüs ağlarında presales ve saha deneyimimi, teknik araştırmalarımı ve üretici dokümantasyonlarını bir araya getirerek pratik, üreticiden bağımsız içerikler hazırlıyorum.

Aynı konudan