İçeriğe geç
academia.sh

Ders 14 / 18

Bağlantı Noktaları ve Soketler

Uygulama uç noktalarının adreslenmesi, bağlantı noktası aralıkları, bir bağlantıyı benzersiz kılan dörtlü ve dinleyen soket ile bağlantı soketi ayrımı.

İçindekiler

Önceki konu boyunca “bağlantı noktası” terimi tanımlanmadan kullanıldı: çevrim tablosunun anahtarında, kiralama protokolünün 67 ve 68 numaralarında, hedef sunucunun 443’ünde.

Terimin tanımlanma yeri taşıma katmanıdır. Ağ katmanı bir paketi doğru makineye ulaştırır ve orada durur; oysa bir makinede aynı anda onlarca program ağ kullanır. Bu dersin sorusu, gelen bir segmentin hangi programa verileceğine nasıl karar verildiğidir.

Çoğullama

Bir makinede aynı anda birden çok ağ akışı bulunur: bir tarayıcı birkaç sunucuyla konuşur, bir posta istemcisi arka planda çalışır, bir yedekleme aracı veri gönderir. Hepsinin IP adresi aynıdır.

Taşıma katmanının ilk görevi bu akışları ayırmaktır. Ayrım için başlığa iki alan konur: kaynak bağlantı noktası ve hedef bağlantı noktası. Her biri 16 bittir; değer aralığı 00 ile 6553565\,535 arasındadır.

Gelen bir segmentin doğru akışa verilmesine çoğullama çözme (demultiplexing), giden segmentlerin tek bir ağ katmanı akışına bindirilmesine çoğullama (multiplexing) denir. Kapsülleme dersinde tanıtılan çoğullama anahtarları zincirinin son halkası budur: Ethernet tür alanı IP’ye, IP protokol alanı TCP’ye, TCP bağlantı noktası numarası uygulamaya götürür.

Numara Aralıkları

Numaralar üç aralığa bölünmüştür:

Aralık Ad Kullanım
0–1023 İyi bilinen (well-known) Standartlaşmış hizmetler; atanması yetki gerektirir
1024–49151 Kayıtlı (registered) Belirli uygulamalara kaydedilmiş numaralar
49152–65535 Dinamik / geçici (ephemeral) İstemcilerin kaynak numarası olarak kullandığı aralık

İlk aralıktaki numaralar, çoğu işletim sisteminde ayrıcalıklı yetki olmadan bağlanamaz. Bu kısıt bir güvenlik önlemidir: ayrıcalıksız bir programın standart bir hizmetin numarasını ele geçirip yerine geçmesi engellenir.

Bazı yerleşik numaralar:

Numara Protokol Hizmet
22 TCP Güvenli kabuk
53 UDP ve TCP Ad çözümleme
67, 68 UDP Adres kiralama (sunucu, istemci)
80 TCP Kaynak aktarımı
443 TCP ve UDP Güvenli kaynak aktarımı

Numaraların protokolden bağımsız olduğuna dikkat edilmelidir: TCP 443 ile UDP 443 ayrı uç noktalardır. Aynı makinede biri bir uygulamaya, diğeri başka bir uygulamaya ait olabilir. İki ayrı ad uzayı vardır.

Numaralar bir sözleşmedir, bir zorunluluk değil. Bir hizmet başka bir numarada da çalıştırılabilir; bu durumda istemcinin numarayı açıkça bilmesi gerekir.

Bağlantıyı Benzersiz Kılan Dörtlü

Tek başına bağlantı noktası numarası, bir akışı belirlemeye yetmez. Bir sunucunun 443 numarasına aynı anda binlerce istemci bağlanır ve hepsi aynı hedef numarayı kullanır.

Bir TCP bağlantısını benzersiz kılan dörtlüdür:

(kaynak adresi, kaynak bag˘lantı noktası, hedef adresi, hedef bag˘lantı noktası)(\text{kaynak adresi},\ \text{kaynak bağlantı noktası},\ \text{hedef adresi},\ \text{hedef bağlantı noktası})

Protokol de hesaba katıldığında beşli olur; NAT ve PAT dersindeki çevrim tablosunun anahtarı bu beşliydi.

Soket (socket), bir uçtaki adres ve bağlantı noktası çiftidir; işletim sistemi düzeyinde ise bu uç noktayı temsil eden nesnedir. İki soket bir bağlantı oluşturur.

Aşağıdaki program aynı dinleyen uç noktaya iki bağlantı kurar ve dörtlüleri iki taraftan da yazdırır.

import socket
import threading
import time


def sunucu(hazir: threading.Event, kap: dict) -> None:
    dinleyen = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    dinleyen.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    dinleyen.bind(("127.0.0.1", 9101))
    dinleyen.listen(5)
    kap["dinleyen"] = dinleyen.getsockname()
    hazir.set()
    for _ in range(2):
        baglanti, karsi = dinleyen.accept()
        kap.setdefault("baglantilar", []).append((baglanti.getsockname(), karsi))
        baglanti.close()
    dinleyen.close()


hazir = threading.Event()
kap: dict = {}
threading.Thread(target=sunucu, args=(hazir, kap), daemon=True).start()
hazir.wait()
print("dinleyen uç nokta:", kap["dinleyen"])

for i in range(2):
    istemci = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    istemci.connect(("127.0.0.1", 9101))
    print(f"istemci {i + 1}: yerel={istemci.getsockname()} uzak={istemci.getpeername()}")
    istemci.close()

time.sleep(0.2)
for yerel, karsi in kap["baglantilar"]:
    print(f"sunucu tarafı: yerel={yerel} karşı={karsi}")

Çıktı:

dinleyen uç nokta: ('127.0.0.1', 9101)
istemci 1: yerel=('127.0.0.1', 53044) uzak=('127.0.0.1', 9101)
istemci 2: yerel=('127.0.0.1', 53045) uzak=('127.0.0.1', 9101)
sunucu tarafı: yerel=('127.0.0.1', 9101) karşı=('127.0.0.1', 53044)
sunucu tarafı: yerel=('127.0.0.1', 9101) karşı=('127.0.0.1', 53045)

Geçici bağlantı noktası numaraları (53044, 53045) her çalıştırmada değişir; işletim sistemi bunları geçici aralıktan seçer. Değişmeyen, iki bağlantının farklı numaralar almış olmasıdır. Dörtlüler:

Bağlantı Kaynak Hedef
1 127.0.0.1:53044 127.0.0.1:9101
2 127.0.0.1:53045 127.0.0.1:9101

Üç bileşen ortaktır, yalnızca kaynak bağlantı noktası farklıdır — ayrımı sağlayan budur.

Dinleyen Soket ve Bağlantı Soketi

Çıktıda dikkat çeken bir ayrıntı vardır: sunucu tarafında 9101 numarası hem dinleyen sokette hem de iki bağlantı soketinde görünür. Bu bir çakışma değildir, çünkü iki tür soket ayrı anahtarlarla aranır.

Soket türü Anahtar Görevi
Dinleyen soket (yerel adres, yerel bağlantı noktası) Yeni bağlantı isteklerini karşılar
Bağlantı soketi Dörtlünün tamamı Kurulmuş bir bağlantının verisini taşır

Gelen bir segment için işletim sistemi önce tam dörtlü eşleşmesi arar; bulamazsa ve segment yeni bağlantı isteğiyse dinleyen sokete yöneltir. Bu ikili arama, tek bir dinleyen soketin sınırsız sayıda bağlantıya kaynaklık edebilmesini sağlar.

Aynı ayrım, bir sunucunun eşzamanlı kapasitesinin neden bağlantı noktası sayısıyla sınırlı olmadığını açıklar. Sunucunun numarası tek bir değerde sabittir; farklılaşan, istemci tarafının adresi ve numarasıdır.

İstemci tarafında ise sınır gerçektir: tek bir istemci makinenin tek bir hedefe kurabileceği eşzamanlı bağlantı sayısı, geçici aralıktaki numara sayısıyla sınırlıdır. Bu, NAT ve PAT dersinde hesaplanan kapasite sınırının aynısıdır.

Örnek Ağdaki Uç Noktalar

Kursun izlediği akış, dörtlü olarak şöyle yazılır:

Konum Kaynak Hedef
İstemcide 192.168.10.196:49152 198.51.100.20:443
Dönüştürmeden sonra 203.0.113.10:61001 198.51.100.20:443
Sunucuda görülen 203.0.113.10:61001 198.51.100.20:443

Sunucu, istemcinin gerçek adresini ve numarasını hiçbir zaman görmez. Dönüştürme, dörtlünün iki bileşenini değiştirmiştir ve bu değişiklik iki uç için de görünmezdir.

İç ağda kalan bir akış ise dönüştürmeye uğramaz. Yönetim bölümündeki istemcinin sunucu odasındaki 192.168.10.226 adresine yaptığı bir istek şu dörtlüyle gider ve yol boyunca değişmez:

192.168.10.196:49160  ->  192.168.10.226:443

Bağlanma Hataları

Bir uygulamanın bir numaraya bağlanması iki nedenle başarısız olur.

Numara kullanımda. Aynı adres ve numara çiftine bağlı başka bir dinleyen soket vardır. Bir sunucu programı yeniden başlatıldığında bu hata sık görülür; nedeni önceki bağlantıların kapanış sürecini tamamlamamış olmasıdır. Bu davranışın ayrıntısı TCP dersinde ele alınacaktır. Yukarıdaki programdaki SO_REUSEADDR seçeneği, tam olarak bu durumu aşmak içindir.

Yetki yetersiz. 1024’ün altındaki bir numaraya ayrıcalıksız bir süreç bağlanamaz.

Bağlanırken verilen adres de anlamlıdır. 127.0.0.1 adresine bağlanan bir soket yalnızca aynı makineden erişilebilir; tüm arayüzleri temsil eden 0.0.0.0 adresine bağlanan soket ağdan da erişilebilir. Yerel geliştirme sırasında çalışan bir hizmetin ağdan erişilememesi çoğunlukla bu ayrımdan kaynaklanır.

Özet

  • Taşıma katmanı, aynı makinedeki akışları 16 bitlik bağlantı noktası numaralarıyla ayırır.
  • Numaralar üç aralığa bölünür: iyi bilinen (0–1023), kayıtlı (1024–49151), geçici (49152–65535).
  • TCP ve UDP numaraları ayrı ad uzaylarıdır; aynı numara iki protokolde iki ayrı uç nokta demektir.
  • Bir bağlantıyı benzersiz kılan dörtlüdür: kaynak adresi, kaynak numarası, hedef adresi, hedef numarası.
  • Dinleyen soket yalnızca yerel çiftle, bağlantı soketi dörtlünün tamamıyla aranır; bu yüzden tek bir dinleyen soket sınırsız bağlantıya kaynaklık eder.
  • Bir sokete bağlanırken verilen adres erişim kapsamını belirler: 127.0.0.1 yalnız yerel, 0.0.0.0 tüm arayüzler.

Sonraki Adım

Dörtlü, bir akışı adlandırır; akışın güvenilir olacağını söylemez. Ağ katmanı paket kaybedebilir, sırayı bozabilir, aynı paketi iki kez teslim edebilir. Sonraki ders bu üç sorunu birden çözen protokolü — el sıkışmasını, sıra numaralarını, yeniden iletimi ve akış denetimini — ele alacak.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat