İçindekiler
- Mimari
- Ağ uygulanması geliştirme
- API, Örnek Uygulama
- Performans
- Bandwidth, Latency, Delay, Throughput
- Uygulama Performansı
Bilgisayar Ağları Mimari
- Bir bilgisayar ağı, çok sayıda bilgisayar arasında genel, düşük maliyetli, adil ve sağlam bağlantılar sağlamalıdır.
- Ağların, değişikliklere, uygulama programlarına ve birlikte çalışabilirliğe uyum sağlayabilmesi için genel mimari taslağının olması gerekir.
- Yaygın olarak bilinen 2 ağ mimarisi OSI ve Internet (DoD)’dir.
- Bu yaklaşım genel olarak soyutlama (Abstraction) olarak bilinir.
- Soyutlama, tasarımcıların karmaşıklığı azaltmak için ayrıntıları iyi tanımlanmış ara yüzlerin arkasına saklaması yaklaşımıdır.
- Soyutlama, ağ sistemleri açısından katmanlamayla (layering) sağlanır.
- Katmanlama, altta yatan donanımdan alınan hizmetle başlayıp alınan çıktıların daha üstteki katmanlara sunulmasıdır.
- Katmanlamanın en önemli iki avantajı;
▫Bir ağ açısından daha yönetilebilir bileşenler sunarak, sorunların sistemin belli katmanlarına indirgenmesini sağlar
▫Daha modüler bir tasarımla, yeni işlevlerin eklenmesini sadece belirli katmanlara indirgeyebiliriz
- Soyutlama’da, sistemin herhangi bir katmanında birden fazla soyutlama yer alabilir.
- Bu katman içi soyutlamaların her biri, üst katmanlara farklı bir hizmet sunarken, aynı alt seviyedeki soyut katman üzerine kuruludur.
- Şekildeki gibi 3. katmanda soyutlamalardan biri istek/yanıt servisini sağlarken, bir diğeri mesaj akış hizmetini sunabilmektedir.
- Bir ağ sisteminin katmanlarını oluşturan soyut nesnelere protokol denir.
- Her protokol, iki farklı arabirim sunar.
▫Aynı makine içinde iletişim servislerini kullanmak isteyen diğer nesneler için bir hizmet ara yüzü sunar. Örneğin. http protokolünün sunduğu link vb. hizmetler.
▫Farklı makinelerdeki akran protokolü için arabirim sunar. Örneğin HTTP protokolünün GET metodunun web sunucusunda nasıl işlenmesi gerektiğine karar vermesi gibi.

- Bu örnekte, Host 1’deki Dosya (file app) Uygulaması, Host 2 üzerindeki hizmeti kullanmak için RRP (request/reply protocol) tarafından sunulan hizmeti kullanarak bir ileti göndermek ister.
- Bu durumda Dosya Uygulaması RRP’ye mesajı onun adına göndermesini ister. RRP, diğer makineyle iletişim için HHP’yi (Host-Host-Protocol) çağırır. Mesaj Host 2’ye geldiğinde HHP’yi çağırır, HHP mesajı RRP’ye geçer ve mesaj Dosya Uygulamasına iletilir.

- Kapsülleme – (Encapsulation), Üst katman protokollerinden alınan yükün (payload), karşılıklı olarak konuşabilmeleri için alt katman protokolü tarafından kontrol bilgisi, adres vb. başlık (header) veya kuyruk (trailer)’ ların eklenmesi işlemine denir.
- Kapsülleme işlemi protokol yığınının her seviyesinde gerçekleşir.

Mimari / OSI
- ISO tarafından ilk kez ağlar için tanımlanan katmansal mimari Open Systems Interconnection – OSI olarak bilinir.
- Bu model bir protokol yığınından çok bir mimari olarak tanımlanmıştır.

- Fiziksel katman, iletişim hattı üzerindeki bit iletimini,
- Veri bağı, çerçeve adı verilen bit yığınını ağ bağdaştırıcıları üzerinden işletim sistemindeki sürücülerle düzenler
- Ağ katmanı, paket anahtarlamalı ağlarda yönlendirme işlemini tanımlar.
- Taşıma katmanı, host bilgisayarlarda çalışan uygulama istek/cevap ara yüzlerini tanımlar
- Diğer 3 katman uygulamaya özgüdür ve soyutlanmamış olabilir.

Mimari / DoD
- TCP/IP mimarisi olarak da ifade edilen İnternet mimarisi, ARPANET olarak bilinen ilk paket anahtarlamalı ağlar için ABD savunma bakanlığı (Department of Defense) tarafından geliştirilmiştir.
- OSI’nin internete uygulanmasındaki zorluklardan dolayı 4 katmanlı model önerilmiştir.
- NET1, NET2 olarak sunulan en alt katmanda 802.x gibi ethernet ve kablosuz iletişimi tanımlayan protokoller bulunur.
- İkinci katman sadece IP (Internet Protocol) protokolünden oluşur.
- Üçüncü katman ise TCP ve UDP gibi uçtan uca aktarım protokollerini tanımlar.

ISO / DOD

Ağ Uygulaması Geliştirme
- Bilgisayar ağlarındaki bu hızlı gelişimin en önemli faktörlerinden biri de ağ uygulama yazılımı geliştirmedeki standartlardır.
- Bir ağ yazılımı, işletim sisteminin ağ arayüzleri için standart olarak sağladığı Ağ API’ları ile kolayca geliştirilebilmektedir.
- Her işletim sistemi kendi ağ API’ını tanımlayabilmekte serbesttir. Ancak Unix Berkeley tarafından geliştirilen socket API’yı neredeyse tüm sistemler tarafından desteklenir durumdadır.
- Ayrıca Java gibi platform bağımsız soket uygulamaları için standart oluşturmuştur.
- Soket arayüzünün ana soyutlaması soket’lerdir. Soketler, yerel uygulamaların ağa eklendiği noktalardır.
- Soket API’ları soketi oluşturmak, soketi ağa bağlamak, ileti alma/gönderme yapmak ve soketi kapatmak için işlemleri tanımlar.
- Socket API’yı kullanarak TCP tabanlı ağ uygulaması geliştirmek için.
▫int socket(int domain, int type, int protocol) ile soket tanımı yapılır
domain argümanı: PF_INET, PF_UNIX, PF_PACKET
type argümanı: SOCK_STREAM (TCP), SOCK_DGRAM (UDP)
protokol argümanı: üst seviye protokoller tanımlanır.
- Sonraki adımda sunucu yada istemci olma durumuna göre bağlantı tanımlanır. Sunucu için passive open durumunda
▫int bind(int socket, struct sockaddr *address, int addr_len)
İstenilen sunucu adresine ait soket kurulur
▫int listen(int socket, int backlog)
Soket dinlenir
▫int accept(int socket, struct sockaddr *address, int *addr_len)
Yeni bir bağlantı kuruluncaya kadar passive open durumunda beklenir.
- İstemci bir sokete bağlanmak istediğinde;
▫int connect(int socket, struct sockaddr *address, int addr_len)
Sunucunun soketine bağlanılmaya çalışılır. Başarılı bir şekilde bağlantı kurulunca soket işlenebilir.
- Bir bağlantı kurulduktan sonra oluşturulan soket üzerinden veri göndermek ve almak için;
▫int send(int socket, char *message, int msg len, int flags)
İlgili mesaj belirtilen sokete iletilir.
▫int recv(int socket, char *buffer, int buf len, int flags)
Belirtilen soketten arabelleğe mesaj okunur.
Örnek - Server
#include<stdio.h>
#include<string.h> //strlen
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
#include<unistd.h> //write
int main(int argc , char *argv[]){
int socket_desc , client_sock , c , read_size;
struct sockaddr_in server , client;
char client_message[2000];
socket_desc = socket(AF_INET , SOCK_STREAM , 0); //Create socket
if (socket_desc == -1) printf("Could not create socket");
puts("Socket created");
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( 8888 );
if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0){
perror("bind hatasi"); return 1;}
listen(socket_desc , 3);
puts("Baglanti bekleniyor...");
c = sizeof(struct sockaddr_in);
client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
if (client_sock < 0){
perror("accept hatasi"); return 1;
}
puts("Baglanti basarili…");
while( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0 ) {
write(client_sock , client_message , strlen(client_message));
}
if(read_size == 0) {
puts("Client ayrildi");
fflush(stdout);
}
else if(read_size == -1) {
perror("okuma hatasi");
}
return 0;
Örnek - Client
#include<stdio.h> //printf
#include<string.h> //strlen
#include<sys/socket.h> //socket
#include<arpa/inet.h> //inet_addr
int main(int argc , char *argv[]){
int sock;
struct sockaddr_in server;
char message[1000] , server_reply[2000];
sock = socket(AF_INET , SOCK_STREAM , 0);
if (sock == -1) {
printf("socket olusturulamiyor");
}
puts("Soket olusturuldu");
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons( 8888 );
if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) {
perror("baglanti hatasi"); return 1;
}
puts("baglanti kuruldu..\n");
while(1) {
printf("Mesaj gir: "); scanf("%s" , message);
if( send(sock , message , strlen(message) , 0) < 0) {
puts("Mesaj iletilemedi!"); return 1;
}
if( recv(sock , server_reply , 2000 , 0) < 0) {
puts("okuma hatasi"); break;
}
puts("Server cevabi: "); puts(server_reply);
}
close(sock);
return 0;
}
Performans
- Herhangi bir bilgisayar sistemi gibi bilgisayar ağlarının da iyi performans göstermesi gerekir.
- Bu nedenle ağın performansını etkileyen faktörler önemlidir.
- Ağ performansı 2 temel yolla ölçülür.
- Band genişliği (bandwidth – throughput olarak da isimlendirilebilir)
- Belirli bir süre içerisinde ağda iletilebilen bit miktarını verir.
- Örneğin 10 Mbps’lik bir ağda, saniyede 10 milyon bit iletilebilir. Bu ağda her bitin iletim zamanı 0,1 mikro saniyedir.
- Bandwidth (band genişliği) ile throughput (verimlilik) terimleri temelde farklıdır.
- Birincisi elektriksel olarak frekansı ifade ederken, verimlilikte ise gerçekte iletilebilecek bit sayısı ifade edilir.
- Gecikme (latency – delay olarak da isimlendirilir), bir iletinin, ağın bir ucundan diğerine ne kadar sürede gittiğini tanımlar
- Tek yönlü gecikme yerine bir ağın bir ucundan diğerine gidiş-dönüş süresini bilmek daha önemli olabilir. Buna round-trip time (RTT) denir.
- Gecikme genellikle 3 bileşene sahiptir.
▫Birincisi ışığın yayılım gecikmesidir. Mesafe ve ortama göre yayılım hızı biliniyorsa bu hesaplanabilir. Havasız ortamda 3.0×108 m/s, bakır kabloda 2.3×108 m/s ve fiberde 2.0×108 m/s’dir.
▫İkincisi bir veri birimini iletmek için geçen süre miktarıdır. Band genişliği ile ilgilidir.
▫Üçüncüsü, paket anahtarlamalı ağlardan kaynaklanan yönlendirme yaklaşımı olan store-and-forward yaklaşımdan kaynaklı kuyruk (Queue) gecikmesidir.
- Dolayısıyla toplam gecikmeyi aşağıdaki gibi hesaplayabiliriz;
▫Latency = Propagation+Transmit+Queue
Propagation = Distance/SpeedOfLight
Transmit = Size/Bandwidth
- Band genişliği ve gecikme belirli bir bağlantının performansını tanımlamak için birlikte ele alınır.
- Bazı uygulamalar için gecikme band genişliğinden önemliyken bazı uygulamalar için band genişliği önem kazanır.
- Örneğin iletilecek veri 1byte ise band genişliğinin önemi olmaz.
- Ancak iletilecek veri 25 MB olduğunda band genişliği önem kazanacaktır. 10 Mbps’lık bir bağlantı için (25×106×8 bits ÷10×106 Mbps = 20 saniye)
- Bu durumda 100ms yada 1ms’lik gecikmenin çok da bir önemi olmaz.

- Gecikme ve band genişliği (bandwidth x delay) ilişkisi, gecikmenin hattın uzunluğunu, band genişliğinin de hattın genişliğini tanımlarsa bu iki değerin çarpımı hattın hacmini yani hattan geçebilecek maksimum bit sayısını tanımlar.
▫Örneğin tek yönlü gecikme süresi 50ms, band genişliği 45Mbps olan bir hattın kapasitesi: 50×10−3s × 45×106 bits/s = 2.25×106 bits = 280 KB olur.
▫Bu kavram alıcıya ulaşmadan göndericinin kaç bit gönderebileceğini ifade eder.
▫Bu durum çift taraflı olarak, gönderene alıcının bitlerin geldiğini ifade etmesi gerektiğinde bandwidth x RTT şeklinde tanımlanır.

- Band genişliğindeki hızlı artış aynı zamanda gecikmenin de iyileşmesi anlamına gelmez.
- 1Gbps’lık bir bağlantı ile 1Mbps’lık bir bağlantının kıtalar arası RTT değeri aynıdır. (100 ms civarında)
- Aynı gecikmeye sahip 1Gbps ve 1Mbps’lık iki ağ üzerinden 1 MB’lık bir dosya iletildiğinde
1 Mbps için;
100ms gecikme 1Mbps bw
0,1s x 1 x 106bit/s = 1×106 bit
1000000bit=125000byte≈12,5KB
1 MB için ≈ 80 RTT
1 Gbps için;
100ms gecikme 1Gbps bw
0,1s x 1 x 109bit/s = 12,5MB
1 MB için 1 RTT
- Bir ağ üzerinden elde edilebilecek etkin uçtan uca işlem hacmine verim (Throughput) denir ve aşağıdaki ilişki ile tanımlanır.
▫Throughput = TransferSize/TransferTime
- Burada TransferTime tek yönlü gecikmenin yanında aktarım sürecinde harcanan diğer zamanları da içerir.
▫TransferTime = RTT+( (1/Bandwidth) × TransferSize )
- Örneğin kullanıcın 100ms RTT ile 1 Gbps’lık bir ağ üzerinden 1MB’lık bir dosyayı almak istediğinde;
▫TransferTime = 100 + (1/1Gbps x 1 MB = 8 ms) = 108 ms’dir.
▫Throughput = 1 MB/108 ms = 74.1 Mbps (1 Gbps olmadığı görülüyor)
- Band genişliği (Bandwidth) ile Verim (Throughput) arasındaki ilişki net olarak görülmektedir.
Uygulama Performansı
- Ağ performansı o ağda koşan uygulamanın ne kadarlık bir ağ performansına ihtiyaç duyduğuyla ilgilidir.
- Örneğin standart bir TV ekranı 352 x 240 piksel çözünürlüğe 24 bit derinliğine ve her saniyede 30 frame oynatsın
▫Her frame’in boyutu (352×240×24)/8 = 247.5 KB
▫Throughput Rate 247.5 × 30 = 58 Mbps olur
- Gerçekte böyle bir verime ihtiyaç duyulmaz. Sıkıştırma ve kodek?
- İletilen iki çerçeve arasındaki farklar iletilerek boyut azaltılır.
- Haliyle değişken performans ihtiyaçlarına gereksinim olacaktır.
- Bir uygulamanın band genişliği gereksinimi, olabildiğince fazla ve gecikme gereksinimi, olabildiğince az şeklinde basitçe özetlenebilir.
- Ağın tek yönlü gecikmesinden çok ağın paketler arasında ne kadar gecikme değişimi gösterdiği daha önemli olabilir. Bu değere jitter denir.
- Saniyede 30 frame iletim yapan bir video uygulaması için;
▫Kaynağın her 33ms’de bir bir frame gönderdiğini varsayalım,
▫Paketler hedefe 33ms’de bir ulaşırsa ağdaki her paketin gecikmesi aynıdır,
▫Ancak paketlerin varış noktasına geliş aralığı değişken olursa (inter-packet gap olarak da adlandırılır) ağda jitter oluştuğu ifade edilir.
- Bu tür durumlar devre anahtarlamalı ağlarda oluşmaz. Paket anahtarlamalı ağlarda yönlendirme durumlarından kaynaklanır.
- Jitter, paketlerin alıcıda tamponlanmasına ve oynatımın geciktirilmesine/kalitenin düşürülmesine neden olacaktır.