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:
- SYN: İstemci (10.0.20.25:51514) sunucuya (10.0.30.10:443) bağlantı kurmak istediğini bildirir.
- SYN-ACK: Sunucu isteği onaylar ve kendi tarafında da bağlantıyı başlatır.
- ACK: İstemci sunucunun SYN’ini onaylar. Bağlantı kurulmuştur, veri akabilir.
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:
- Kaynak IP adresi
- Hedef IP adresi
- Kaynak port
- Hedef port
- 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.
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
- RFC 9293: Transmission Control Protocol (TCP)
- RFC 768: User Datagram Protocol
- IANA: Service Name and Transport Protocol Port Number Registry (RFC 6335 port aralıkları)
- RFC 1035: Domain Names, Implementation and Specification (DNS başlığındaki ID alanı)
- RFC 7766: DNS Transport over TCP, Implementation Requirements
- RFC 2131: Dynamic Host Configuration Protocol
- RFC 9000: QUIC, A UDP-Based Multiplexed and Secure Transport
- RFC 9113: HTTP/2
- RFC 9114: HTTP/3
- Microsoft Learn: The default dynamic port range for TCP/IP has changed
- Linux man-pages: IP_LOCAL_PORT_RANGE