Bu çalışma materyali, bir dersin ses kaydı transkripti ve ek metin kaynaklarından derlenmiştir.
📚 Uygulama Katmanı: Temel Kavramlar ve Ağ İletişimi
Bu çalışma materyali, internetin en üst katmanı olan uygulama katmanını, yani kullanıcıların doğrudan etkileşimde bulunduğu yazılımların ağ üzerinden nasıl çalıştığını detaylandırmaktadır. Alan Adı Sistemi (DNS), eşler arası (P2P) uygulamalar, video akışı ve İçerik Dağıtım Ağları (CDN'ler) gibi kritik konular ile soket programlamanın temel prensipleri incelenecektir.
1. 🌐 Alan Adı Sistemi (DNS)
DNS, alan adlarını (örneğin, google.com) IP adreslerine (örneğin, 172.217.160.142) çeviren dağıtık bir veritabanı sistemidir. Bu çeviri, kullanıcıların IP adreslerini ezberlemek zorunda kalmadan web sitelerine erişmesini sağlar. DNS çözümlemesi iki ana sorgu türüyle gerçekleşir:
1.1. Yinelemeli (Iterated) Sorgu ✅
Bu sorgu türünde, yerel DNS sunucusu bir kök DNS sunucusuna sorgu gönderir. Kök sunucu, istenen alan adının IP adresini bilmiyorsa, bu bilgiyi bulabileceği bir Üst Düzey Alan Adı (TLD) sunucusunun adını yerel DNS sunucusuna iletir. Yerel DNS sunucusu daha sonra TLD sunucusuna sorgu gönderir ve bu süreç, yetkili DNS sunucusu bulunana kadar devam eder. Her adımda, sorguyu yapan sunucu, bir sonraki adımı kendisi atar.
Örnek Akış:
- Kullanıcı
gaia.cs.umass.eduadresinin IP'sini ister. - Yerel DNS sunucusu (
dns.nyu.edu), kök DNS sunucusuna sorar. - Kök DNS sunucusu,
.eduTLD sunucusunu işaret eder. - Yerel DNS sunucusu,
.eduTLD sunucusuna sorar. .eduTLD sunucusu,umass.eduyetkili DNS sunucusunu işaret eder.- Yerel DNS sunucusu,
dns.cs.umass.eduyetkili DNS sunucusuna sorar. - Yetkili DNS sunucusu,
gaia.cs.umass.eduadresinin IP'sini döndürür. - Yerel DNS sunucusu, IP adresini kullanıcıya iletir.
1.2. Özyinelemeli (Recursive) Sorgu ✅
Bu sorgu türünde, yerel DNS sunucusu bir kök DNS sunucusuna sorgu gönderir. Kök sunucu, istenen alan adının IP adresini bilmiyorsa, kendisi TLD sunucusuna sorgu gönderir. TLD sunucusu da yetkili sunucuya sorgu gönderir. Tüm çözümleme adımları, ilk sorguyu alan sunucu tarafından tamamlanır ve nihai IP adresi doğrudan yerel DNS sunucusuna döndürülür. Bu yöntem, hiyerarşinin üst seviyelerindeki sunucular üzerinde daha fazla yük oluşturabilir.
2. 🤝 Eşler Arası (P2P) Mimarileri
P2P mimarilerinde, merkezi bir sunucu bulunmaz. Bunun yerine, ağdaki uç sistemler (eşler) doğrudan birbirleriyle iletişim kurar.
2.1. Özellikler 💡
- Merkezi Sunucu Yok: Herhangi bir "her zaman açık" sunucuya ihtiyaç duyulmaz.
- Doğrudan İletişim: Eşler, diğer eşlerden hizmet talep eder ve onlara hizmet sağlar.
- Kendi Kendine Ölçeklenebilirlik: Yeni eşler sisteme katıldıkça, hem yeni hizmet talepleri hem de yeni hizmet kapasitesi getirirler. Bu, sistemin doğal olarak ölçeklenmesini sağlar.
- Yönetim Karmaşıklığı: Eşlerin kesintili bağlantıları ve değişen IP adresleri nedeniyle yönetimi karmaşık olabilir.
- Örnekler: BitTorrent (dosya paylaşımı), Skype (VoIP).
2.2. Dosya Dağıtımında P2P vs. İstemci-Sunucu 📊
Bir dosyanın (boyut F) N istemciye dağıtılması durumunda, P2P mimarisi genellikle istemci-sunucu modelinden daha verimli olabilir.
-
İstemci-Sunucu Modeli:
- Sunucu, N adet dosya kopyasını sırayla yüklemelidir.
- Dağıtım süresi:
Dc-s > max{NF/us, F/dmin}us: Sunucu yükleme kapasitesidmin: En düşük istemci indirme kapasitesi
- Bu süre, N ile doğrusal olarak artar.
-
P2P Modeli:
- Sunucu en az bir kopyayı yüklemelidir.
- Toplam yükleme kapasitesi, sunucunun (
us) ve tüm eşlerin (Σ ui) yükleme kapasitelerinin toplamıdır. - Dağıtım süresi:
DP2P > max{F/us, F/dmin, NF/(us + Σ ui)} - Bu süre de N ile doğrusal olarak artar, ancak her eşin sisteme katkısı toplam hizmet kapasitesini artırdığı için daha verimli olabilir.
3. 🎬 Video Akışı ve İçerik Dağıtım Ağları (CDN'ler)
Video akışı, internet bant genişliğinin büyük bir kısmını tüketir ve milyarlarca kullanıcıya ulaşma ile farklı cihazlara hizmet verme gibi zorluklar yaratır.
3.1. Video Kodlama 📚
- Video: Sabit bir hızda gösterilen görüntü dizisidir (örn. 24 görüntü/sn).
- Dijital Görüntü: Piksellerden oluşan bir dizidir; her piksel bitlerle temsil edilir.
- Kodlama: Görüntü içindeki ve görüntüler arasındaki fazlalığı kullanarak bit sayısını azaltır.
- Uzamsal (Spatial) Kodlama: Görüntü içindeki tekrarlayan desenleri sıkıştırır (örn. aynı renkteki N piksel yerine renk değeri ve tekrar sayısı gönderilir).
- Zamansal (Temporal) Kodlama: Bir sonraki kareyi, önceki kareden farklarını göndererek sıkıştırır.
- Bit Hızı Türleri:
- CBR (Constant Bit Rate): Video kodlama hızı sabittir.
- VBR (Variable Bit Rate): Video kodlama hızı, uzamsal ve zamansal kodlama miktarına göre değişir.
3.2. Depolanmış Video Akışı Zorlukları ⚠️
- Değişken Bant Genişliği: Sunucudan istemciye bant genişliği, ağ tıkanıklığına göre zamanla değişir.
- Paket Kaybı ve Gecikme: Tıkanıklık nedeniyle paket kaybı ve gecikme, oynatma kalitesini düşürebilir veya oynatmayı geciktirebilir.
- Kesintisiz Oynatma Kısıtlaması: İstemci tarafında oynatma zamanlaması orijinal zamanlamayla eşleşmelidir, ancak ağ gecikmeleri değişkendir (jitter). Bu, istemci tarafında bir ara belleğe (buffer) ihtiyaç duyulmasına neden olur.
3.3. Oynatma Ara Belleği (Playout Buffering) 📈
İstemci tarafındaki ara bellek ve oynatma gecikmesi, ağın neden olduğu gecikmeyi ve gecikme dalgalanmasını telafi etmek için kullanılır. Video verileri, oynatılmadan önce bir miktar ara belleğe alınır. Bu, ağdaki kısa süreli dalgalanmaların oynatma kalitesini etkilemesini engeller.
3.4. İçerik Dağıtım Ağları (CDN'ler) 🌍
Milyonlarca videoyu yüz binlerce eşzamanlı kullanıcıya akışla sunma zorluğunu aşmak için CDN'ler kullanılır.
- Tek Sunucu Çözümü Neden Ölçeklenmez? Tek bir büyük sunucu, tek hata noktası, ağ tıkanıklığı ve uzak istemcilere uzun yollar nedeniyle ölçeklenemez.
- CDN Çözümü: Videoların birden fazla kopyası, coğrafi olarak dağıtılmış sitelerde (CDN sunucuları) depolanır ve sunulur.
- Derine İniş (Enter Deep): CDN sunucuları, birçok erişim ağına derinlemesine yerleştirilir (kullanıcılara yakın). Örn: Akamai.
- Eve Yakınlaşma (Bring Home): Erişim ağlarına yakın POP'larda (Point of Presence) daha az sayıda, daha büyük kümeler kullanılır. Örn: Limelight.
- Netflix Örneği: Netflix, içeriğinin kopyalarını dünya çapındaki OpenConnect CDN düğümlerinde saklar. Bir abone içerik istediğinde, istemci en yüksek desteklenen hızda içeriği almak için bir manifest dosyası kullanır. Ağ yolu tıkalıysa farklı bir hız veya kopya seçilebilir.
4. 🔌 Soket Programlama
Soket, bir uygulama süreci ile uçtan uca taşıma protokolü arasında bir "kapı" görevi görür. İstemci/sunucu uygulamalarının ağ üzerinden iletişim kurmasını sağlar.
4.1. Soket Nedir? 📚
Soket, bir ağ bağlantısının bir ucunu temsil eden bir yazılım yapısıdır. Uygulama geliştiricisi tarafından kontrol edilir ve işletim sistemi tarafından sağlanan taşıma katmanı protokolleriyle (UDP veya TCP) etkileşime girer.
4.2. UDP Soket Programlama 🚀
UDP (User Datagram Protocol), bağlantısız ve güvenilir olmayan bir taşıma hizmeti sunar.
-
UDP Özellikleri:
- Bağlantısız: Veri göndermeden önce el sıkışma (handshaking) yapılmaz.
- Güvenilmez: Gönderilen veriler kaybolabilir veya sırasız ulaşabilir.
- Adresleme: Gönderici, her pakete hedef IP adresini ve port numarasını açıkça ekler. Alıcı, gönderenin IP adresini ve port numarasını alınan paketten çıkarır.
- Datagramlar: İstemci ve sunucu süreçleri arasında datagram gruplarının güvenilir olmayan transferini sağlar.
-
İstemci/Sunucu Etkileşimi (UDP):
- Sunucu: Bir soket oluşturur ve belirli bir porta bağlar.
- İstemci: Bir soket oluşturur.
- İstemci: Sunucu IP adresi ve port numarası ile bir datagram oluşturur ve soket üzerinden gönderir.
- Sunucu: Soketinden datagramı okur, işler (örn. küçük harfleri büyük harfe çevirir).
- Sunucu: İstemcinin adresini ve port numarasını belirterek bir yanıt datagramı gönderir.
- İstemci: Soketinden yanıtı okur ve görüntüler.
- İstemci: Soketi kapatır.
-
Python UDP İstemci Örneği:
from socket import * serverName = 'hostname' # Sunucu adı veya IP adresi serverPort = 12000 clientSocket = socket(AF_INET, SOCK_DGRAM) # UDP soketi oluştur message = input('Input lowercase sentence:') clientSocket.sendto(message.encode(), (serverName, serverPort)) # Mesajı sunucuya gönder modifiedMessage, serverAddress = clientSocket.recvfrom(2048) # Yanıtı al print(modifiedMessage.decode()) clientSocket.close() # Soketi kapat -
Python UDP Sunucu Örneği:
from socket import * serverPort = 12000 serverSocket = socket(AF_INET, SOCK_DGRAM) # UDP soketi oluştur serverSocket.bind(('', serverPort)) # Soketi yerel porta bağla print('The server is ready to receive') while True: # Sonsuz döngüde dinle message, clientAddress = serverSocket.recvfrom(2048) # İstemciden mesajı al modifiedMessage = message.decode().upper() # Mesajı büyük harfe çevir serverSocket.sendto(modifiedMessage.encode(), clientAddress) # Yanıtı istemciye gönder
4.3. TCP Soket Programlama 🔗
TCP (Transmission Control Protocol), bağlantı tabanlı, güvenilir ve sıralı bayt akışı hizmeti sunar.
-
TCP Özellikleri:
- Bağlantı Tabanlı: Veri göndermeden önce istemci ve sunucu arasında bir bağlantı kurulur (el sıkışma).
- Güvenilir: Veri kaybı veya sırasız ulaşma durumları taşıma katmanı tarafından ele alınır.
- Sıralı Bayt Akışı: Veriler, gönderildiği sırayla alıcıya ulaşır.
- Çoklu İstemci Desteği: Sunucu, her istemci için yeni bir soket oluşturarak aynı anda birden fazla istemciyle iletişim kurabilir.
-
İstemci/Sunucu Etkileşimi (TCP):
- Sunucu: Gelen istekler için bir "karşılama soketi" oluşturur ve belirli bir porta bağlar.
- Sunucu: Gelen bağlantı isteklerini dinlemeye başlar.
- İstemci: Bir TCP soketi oluşturur ve sunucunun IP adresi ile port numarasını belirterek sunucuya bağlanır. Bu, TCP bağlantısını kurar.
- Sunucu: Bir bağlantı isteği aldığında, o istemciyle iletişim kurmak için yeni bir "bağlantı soketi" oluşturur.
- İstemci: Bağlantı soketi üzerinden sunucuya veri gönderir.
- Sunucu: Bağlantı soketinden veriyi okur, işler ve yanıt gönderir.
- İstemci: Yanıtı okur.
- İstemci ve Sunucu: İletişim bittiğinde ilgili soketleri kapatır.
-
Python TCP İstemci Örneği:
from socket import * serverName = 'servername' # Sunucu adı veya IP adresi serverPort = 12000 clientSocket = socket(AF_INET, SOCK_STREAM) # TCP soketi oluştur clientSocket.connect((serverName,serverPort)) # Sunucuya bağlan sentence = input('Input lowercase sentence:') clientSocket.send(sentence.encode()) # Mesajı gönder modifiedSentence = clientSocket.recv(1024) # Yanıtı al print ('From Server:', modifiedSentence.decode()) clientSocket.close() # Soketi kapat -
Python TCP Sunucu Örneği:
from socket import * serverPort = 12000 serverSocket = socket(AF_INET,SOCK_STREAM) # TCP karşılama soketi oluştur serverSocket.bind(('',serverPort)) # Soketi yerel porta bağla serverSocket.listen(1) # Gelen bağlantıları dinle (1 bekleyen bağlantı) print('The server is ready to receive') while True: # Sonsuz döngüde dinle connectionSocket, addr = serverSocket.accept() # Bağlantı isteğini kabul et, yeni soket oluştur sentence = connectionSocket.recv(1024).decode() # İstemciden veriyi al capitalizedSentence = sentence.upper() # Veriyi büyük harfe çevir connectionSocket.send(capitalizedSentence.encode()) # Yanıtı istemciye gönder connectionSocket.close() # İstemci bağlantısını kapat








