Bu blog, Linux ağ programlama hakkında temel bilgiler içermektedir.

23 Haziran 2017 Cuma

1. Özet

Haziran 23, 2017 Posted by Burak Candan No comments
Bu çalışmada  internet ve ağ sistemlerinin vazgeçilmez öğelerinden olan linux ve linux üzerine geliştirilmiş sistemlerden biri olan linux ağ programlama kavramı ele alınacaktır. Bu çerçevede işlenecek linux ağ programlama konusu ağ, fonksiyonlar, soket programlama gibi alt başlıklar halinde incelenerek okuyucunun içeriği daha iyi idrak etmesi amaçlanmıştır. Çalışma, üst düzey ağ programlama bilgisi içermemektedir. Konu anlatım çizgimiz ilk başlıktan son başlığa kadar lineer bir doğru şeklinde genel konulardan özel konulara doğru ilerleyen teorik içerikli bir projeksiyon içermektedir. Bu çalışmadan linux ağ programlama konusu hakkında bilgi edinmek isteyen, konunun uzmanı olmayan kişiler yararlanabilir.

2. Giriş

Haziran 23, 2017 Posted by Burak Candan No comments
Linux ve GNU ortaya çıktığı ilk günlerden itibaren bilgisayar, internet ve bilişim dünyasına ait her konuda bir farklılık yaratmıştır. Bugün en basitinden bir site yayınlamak istenildiğinde bile bu farklılık gözlemlenebilmektedir. Günlük kullanımda yaygın olarak Linux ve Windows Hostingler mevcuttur. Linux programlama ve yaklaşımı sadece hosting konusunda mevcut değildir. 

Linux'un açık kaynak kodlu olması bizlere çeşitlilik sağlamaktadır[1]. Bir örnek vermek gerekirse günümüzde Linux 13 farklı TCP (The Transsmission Control Protocol) varyantına sahiptir[2]. Bu noktada Linux ağ programlama konusunun anlaşılması için ağ meselesinin anlaşıması gerekmektedir. Linux ağ programlama ve Linux ağ yönetimi birbirleriylee tümleşik kavramlardır. Günümüzde bu konularda büyük bir çoğunluğu yabancı dilde yazılmış olmak üzere sayısız makale, kitap, akademik çalışma yayınlanmıştır.

Bu çalışmada, okuyucular çok fazla detaya boğulmadan “Linux Ağ Programlama” konusunda bilgilendirme yapılacaktır.

22 Haziran 2017 Perşembe

3. LİNUX AĞ PROGRAMLAMA

Haziran 22, 2017 Posted by Burak Candan No comments
Ağ sistemleri, insanoğlunun ortaya koyduğu en karmaşık sistemlerden biridir[3]. Bu çalışma boyunca Linux ağ programla yaklaşımları ele alınacaktır. Kelime tekrarından ve okuma zorluğundan kaçınılmak için bundan sonra LAP (Linux Ağ Programlama), LAY (Linux Ağ Yönetimi) ve LİS (Linux işletim Sistemi) kısaltmaları kullanılabilir. Linux, ağ programlama ve ağ yönetimi konularında da bir fenomendir.  

Linux ağ programlama konusu Linux nedir başlığından itibaren yani en baştan incelenecektir. Konumuz içindekiler kısmında da yer aldığı gibi Linux ağ programlama ana başlığının altında 3 adet alt başlıktan buna ek olarak Linux ağ yönetimi ana başlığından oluşmaktadır.  


21 Haziran 2017 Çarşamba

4. Linux Nedir?

Haziran 21, 2017 Posted by Burak Candan No comments
Linux, (doğru telaffuz:Lin-uks]) Windows ve Mac Os gibi bilgisayar işletim sistemleri çatısında yer alan bir işletim sistemi türüdür. Linux İşletim Sistemi, sıfırdan kaynak kodları kullanıcılarla paylaşılmayan UNIX mimarisi örnek alınarak Linus Torvalds tarafından ortaya konmuştur[4]. Linux ismi, geliştiricisi Linus Torvalds tarafından verilmiştir[5].

Linux yapısının temellerini 1991 yılında Finlandiyalı, üniversite eğitimini sürdürmekte olan Linus Torvalds atmıştır. Bu yolculukta Torvalds, POSIX ve UNIX standartlarını baz alarak bağımsız bir işletim sistemi geliştirmiştir. Ancak bu çalışma kullanıcı araçları olmayan bir çekirdek yazılımıdır[6].

Ancak kullanıcı araçları meselesi Linux işletim sistemi için önem teşkil etmekteydi. Linus Torvalds bu meseleyi çalışmasını geliştirici desteğini artırmak amacıyla özgür yazılım olarak GNU Genel Kamu Lisansı kapsamında yayınlamak yöntemi ile çözmüştür[7]. 

GNU, “GNU's not Unix” yani “GNU, Unix değildir” anlamına gelmektedir. GNU oluşumu, özgür yazılım mottosuyla 1984 yılında MIT'deki (Massachusetts Institute of Technology) görevinden ayrılmış Richard Stallman tarafından kurulmuştur. Fakat 1991 yılına gelindiğinde kullanıcı araçları hazır olmasına rağmen çekirdek yazılım eksikti.[8] Torvalds'ın hamlesiyle iki organizasyonun eksiği giderilmişti oldu ve böylece GNU/Linux platformu kullanıcılarla buluşturuldu. 

20 Haziran 2017 Salı

5. Ağ ve Protokoller

Haziran 20, 2017 Posted by Burak Candan No comments
Bir ağ oluşumunun varlığından bahsedebilmemiz için en az iki adet varlığın iletişim halinde olması gerekmektedir. Bu iki varlık; insan, hayvan, bitki olabileceği gibi konumuzun temelini oluşturan bilgisayarlar da olabilir. Ağ, kavram gereği çok fazla şeyi kapsasa da internet kullanımın yaygınlaşmasıyla birlikte internetle ilişkili anlam yapısı baskın olmaya başlamıştır. Hal böyleyken elektronik ortamda iletişime geçmiş her cihaz için bir ağa dahildir denilebilir.

Ağ yapısında iki kavramdan bahsedilmesi gerekmektedir. Bilgiyi ileten cihaz ve bu bilginin nasıl iletileceğini tanımlayan kurallar. Bu kurallar protokol olarak adlandırılmaktadır. Bu kısımda ağ tipleri, ağ bağlantı metotları, ağ datasının bir ağdan diğer ağa iletimi ve popüler ağlarda kullanılan protokoller hakkında bilgi verilecektir.

19 Haziran 2017 Pazartesi

6. Circuit-switched[9] ve Packet-Switched[10]

Haziran 19, 2017 Posted by Burak Candan No comments
Genel olarak temelde iki türlü ağ iletişim tipi vardır: Circuit-switched ve packet-switched. Circuit-switched ağlar atanmış düğüm(ağ) veya nokta kullanırlar. Circuit-switched mantığını bir örnekle açıklayalım. Bir mesajlaşma programı yazdığımızı hayal edelim. Bu mesajlaşma programı internet üzerinde değil de birbiriyle kablolu veya kablosuz bağlantı ile bağlanmış iki bilgisayarın arasında çalışsın sadece. İşte bu ağ yapısı circuit-switched'dır. Ağ da atanmış cihazlar (iki bilgisayar) ve sadece bu cihazlar arasında iletişim kuran bir mesajlaşma programı mevcuttur. Başka bir cihaz (sızma işlemleri ihmal edilmiştir) bu iletişime ortak olamaz. Böyle bir sistemin avantajı her ne kadar bir sınırlama olsa da veri alışverişini öngörmenin kolay olmasıdır. Dezavantajı ise uygulamadaki maaliyet yüksekliğidir. 

Packet-switched sistemi ise farklı bir yaklaşım sergiler. Packet-switched aslında herkesin günlük hayatında kullandığı fakat adını bilmediği bir olgudur. Bu ağ yapısında veriler genel kullanıma açık bir ağa belirli boyutlardaki parçalara ayrılarak, ve anahtarlanarak hedef cihaza aktarılır. Hedef cihazdaki dönüştürücü bu parçları olması gerektiği gibi birleştirir ve veriyi okunabilir hale getirir. Günümüzde packet-switched sistemi çok yaygın bir şekilde kullanıldığı için çalışmanın devamında ağ'dan kastımızın packet-switched olduğunu bildirmemizde fayda vardır.

18 Haziran 2017 Pazar

7. Yerel Ağ

Haziran 18, 2017 Posted by Burak Candan No comments
Birden fazla teknoloji mevcuttur bilgisayar alarasında ağ kurulumu için. Kullanım alanına göre ağ yapıları değişmektedir ve bu bazen kafa karıştırabilir. En yaygın kullanılan türü ise local area network yani LAN'dır [11]. LAN yapısı sayesinde LAN'da yer alan bilgisayarlar, cihazlar kendi aralarında iletişim kurabilecekleri gibi diğer ağlarda bulunan cihazlarla da iletişim kurabilirler[12].

LAN yapısında ikiden fazla bilgisayar kullanılacağı zaman hub, switch gibi cihazlara ihtiyacımız olacaktır. 

17 Haziran 2017 Cumartesi

8. Ethernet

Haziran 17, 2017 Posted by Burak Candan No comments
Ethernet, en popüler packet-switched ağ sistemi olarak tanımlanabilir[13]. Ethernet kavramı yaklaşık kırk yıl önce Xerox Parc tarafından ortaya konmuştur. Daha sonrasında Xerox, Intel ve Digital Equipment Corporation tarafından standart hale getirilmiştir[14].


Ethernet'in alternatifleri mevcuttur. Token Ring[15], ARCNet[16] ve DECNet[17] bu alternatifler arasında sayılabilir. Linux, tüm sistemleri desteklemekle birlikte yukarıda belirttiğimiz gibi en yaygını ethernettir.


Packet-switched yapısında ethernet üzerinden veri alış-verişi yapmak için öngörülen çerçeveler mevcuttur.Söz konusu IPv6 saysıyal değerlerde değişiklikler olmaktadır.


Açılış eki olarak Türkçeleştirilen ifadenin orijinali “preamble” şeklinde ifade edilmektedir. Açılış eki kısaca ifade etmek gerekirse cihazın network (ağ) saatiyle senkronize olmasını sağlar.



Hedef adres, veya bir başka değişle hedef mac adresi, verinin iletileceği cihazın bilgilerini içermektedir buna mukabil kaynak adres veya kaynak mac adresi verinin çıkış yaptığı adrese ait bilgilerdir. Tip ve veri kavramları adından anlaşılacağı üzere ileti tipi ve veri boyutdur.


CRC yani “cyclic redundancy check” Türkçesiyle ifade etmek gerekirse “döngüsel gereksiz data kontrolü” veri akışındaki çöp dataların kontolüdür denilebilir. [18]


Yukarıda Ethernet Frame'ine ait kavramlara detaya girmeden açıklık getirilmiştir. Fakat LAP üzerine uygulama yapacak kişilerin muhakkak bu kavramların detaylarına hakim olmaları gerekmektedir.



16 Haziran 2017 Cuma

9. Protokoller

Haziran 16, 2017 Posted by Burak Candan No comments
Kullanımda bulununa  masaüstü, dizüstü, yazıcı, akıllı telefon gibi cihazların birbirleriyle haberleşmeleri için bir ağa katılmaları gerekmektedir. Ağları bu noktada daha anlaşılır olması için şehirler arası yola benzetebiliriz. Günümüzde araç sayısı çok fazla olduğu için şehirler arası yolları kuralları olmadan düşünülemez. Bu noktada Ağ kavramını böyle ele almak gerekmektedir. Protokol kavramını daha iyi anlatabilmek için iletişimin bir başka türü olan ve daha yaygın bilinen telefon iletişiminden örnek verebiliriz.

Türkiye İstatistik Kurumu'nun 18 Ağustos 2015 Saat:10:00, Sayı: 18660 nolu bülteninde[19] yayınlanan belgeye göre 2015 Yılı Nisan verilerine göre hanelerin %96,8'inde cep telefonu mevcut. Bu rakam oldukça iddialı bir rakam. Kabaca neredeyse herkesin en az bir adet cep telefonu numarası var şeklinde yorumlanabilir bu veri. O kadar fazla numaraya rağmen hiçbir kişinin numarası bir başka kişinin numarasıyla aynı değildir ve şebekede iletişim halinde olan hiçbir kişi çakışmaya maruz kalmaz. İletişimin sağlıklı bir şekilde gerçekleşmesi için çakışmamak çok önemlidir. Bu farklı numaralandırma işlemini ve çakışma probleminin engellenmesini GSM veya sabit hat şirketleri sağlamaktadır.

Ağdaki cihazların iletişimi için de bu durum en önemli şeylerden biridir. Her cihazın bir IP numarası vardır ve ağ içerisinde çakışmadan haberleşebilirler, veri aktarımında bulunabilirler. Fakat bu  IP numaralarının dağıtılmasında ve irtibata geçmesinde mutlaka bir trafikteki trafik kuralları gibi, telefon numaralarını dağıtan şebekelerin bir standartı olması gibi bir standarta gerek vardır. Bu standartlardan en yaygını ve şu an için en çok bilineni “İnternet Protokol Versiyon 4 (IPv4)” protokolüdür[20].   

İnternete bağlanan tüm cihazlar bu protokole göre hareket etmektedir.  Ağda  iletişim katmanlı bir yapı üzerinden gerçekleştirilir. OSİ Referans modeli ve TCP/IP modeli bu modellerdendir. İki model de birbirine benzemekle birlikte OSI 7 katmanlı bir yapıya sahipken[21] TCP/IP 4 katmanlı bir yapıya sahiptir[22].

IPv4, IPv6 gibi protokoller Ağ katmanında yer almaktadır. İnternet Protokol Versiyon 4'ün ilk standartlaştırılması Eylül, 1981'de gerçekleşmiştir[23]. Bu Protokol belgesinin detaylarına RFC: 791 belgesinden ulaşılmaktadır. Her ne kadar daha sonraları düzeltilmeler gerçekleşmişse de IPv4'de tanımlanan adres uzayı günümüz koşulları göz önüne alındığında yakın bir gelecekte yetersiz kalacağı için IPv6 çalışmaları yapılmıştır. IPv6 2004 yılından bu yana endüstride ve yeni nesil ağ cihazlarında kullanılmakla birlikte henüz yaygınlaşmamıştır[24].


Şu ana kadar ki bilgiler toparlanacak olursa LAP (Linux Ağ Programlama) üzerine çalışma yapacak kişi veya kişilerin referans modellerinin tüm kollarıyla ilişkili bir şekilde çalışması icap etmektedir. Zira Ağ, münferit bir yapılanma içerisinde mevcut değildir. Ağ katmanı OSİ referas modeli baz alınacak olursa ulaşım ve veri bağlantısı katmanlarıyla doğrudan, diğer katmanlara ise dolaylı bir ilişkisi vardır. 

15 Haziran 2017 Perşembe

10. BSD UNIX

Haziran 15, 2017 Posted by Burak Candan No comments
Yaklaşık 30 yıl önce Advanced Research Projects Agency(ARPA), veya Defense Advanced Research Projects Agency(DARPA) tarafından Berkeley, California Üniversitesi'nde bir grup oluşturuldu[25]. DARPA, Amerika Birleşik Devletleri Hükümeti tarafından temelleri 1958 Şubatı'nda atılan askeri alanda fayda sağlayacak teknoloji ve uygulamaları araştıran bir ajanstır[26]. Çalışma grubunun amacı TCP/IP portlarıyla UNIX işletim sistemini çalıştırabilecek yazılımlar ortaya koymaktır. Bu konuyla ilgili şu bilgiyi not düşmekte fayda vardır. TCP/IP sisteminin ortaya çıkmasında da DARPA rol almıştır[27]. Çalışma grubu araştırma-geliştirme esnasında oluşturulan arayüzde UNIX çağrı ve algoritmalarını kullanmanın yanı sıra gerektiğinde yeni fonksiyonlar eklemeyi öngörmüştür. Sonuç olarak ortaya konulan çalışma bugün soket arayüzü, Berkeley soket arayüzü, Berkeley UNIX, veya BSD UNIX adlarıyla bilinmektedir[28]

Başka ağ arayüzleri olmakla birlikte Berkeley Soket Arayüzü, standartları belirleyen ve çok geniş kapsamda kullanılan ve desteklenen bir arayüzdür[29]. Bu araştırmayı ilgilendiren kısım ise Berkeley soket arayüzünün Linux kullanılarak oluşrutulmuş olmasıdır[30].

14 Haziran 2017 Çarşamba

11. Soket Nedir?

Haziran 14, 2017 Posted by Burak Candan No comments
Temelde soket, ağ iletişimi sağlanmasını sağlayan bir sanallaştırmadır[31]. Aşağıda Tablo'da Linux için basit bir ağ I/0 Birincil Soket Fonksiyonları gösterilmiştir.


Tablo: Birincil Soket Fonksiyonlar



Operasyon

Açıklama

Açılış

Giriş veya çıkış işlemine hazırlık

Kapanış

Önceki işlemi sonlandırma ve kaynağa dönüş

Okuma

Datayı okuma ve uygulama hafızasına kabul

Yazma

Uygulama hafızasından data yazma ve kontrol etme


Kontrol (ioctl)

Ara bellek boyutları ve iletişim davranış seçeneklerinin ayarlanması

Ağa ait olmayan ya da ağ ile ilişkili olmayan uygulamalarda 1 ve 0'lardan oluşan fonksiyonlar (yani bilgi işlemlerin tamamı) dosyalar üzerinde işlem görür. Dosya açılır, okuma, yazma veya iki işlem birden yapılır ve daha sonra dosya kapanır. Fonksiyonlar, dosya tanımlayıcısı olarak bilinen sistemle işler. Berkeley Soket Arayüzü'nde ise dosya tanımlayıcısı ile aynı mantıkta oluşturulmuş soket tanımlayıcısı sistemi mevcuttur. Tıpkı dosyada olduğu gibi aktif soket, soket tanımlayıcısı olarak belirlenen bir tam sayı şeklinde tanımlanır. Aynı tanımlayıcı tablo içerisinde hem dosya tanımlayıcısı hem de soket tanımlayıcısı bulunamaz. Böyle bir durumda çakışma, karışıklık yaşanacağından sistem çalışmayacaktır[32].

Dosyalama mantığının daha iyi anlaşılması için şöyle bir örnek verilebilir. Günümüzde internet kullanan herkesin bir tür modem edinmesi gerekmektedir. İnternete bağlanmayı sağlayan araçlar olarak modemlerin DHCP sunucusu görevini üstlenerek IP atama mekanizmaları da mevcuttur[33]. Bir Linux işletim sistemi üzerinde bilgisayara atanan IP bilgisini içeren dosya nerede mevcuttur? Bu konuda kişisel kullanım için hazırlanmış Debian işletim sisteminden bir örnek verilebilir. Debian ve diğer pek çok Linux dağıtımında “File Manager” yani dosya yöneticisi mevcuttur. Böyle bir işletim sisteminde yukarıda bahsedilmiş olan dosya tanımlayıcıları kolay bir şekilde gözlemlenebilecektir. Soruya geri dönülecek olunursa ip adresini barındıran dizin yolu şu şekildedir: /etc/resolv.conf bu dizin şu şekilde açılabilir. Uygulamalara gelinerek dosyalar açılır ve ardından etc klasörü içindeki resolv.conf dosyası bulunur. Bu dosya açıldığında birinci satırda “#Generated by NetworkManager”  o satırın altında da nameserver yazısının yanında atanmış ip bulunur. IP değişikliği buradan yapılabilir fakat dosyaya yazma izni olması gerekmektedir. Bu izin uçbirime gelinerek “chmod -R 777  /etc/resolv.conf” yazılarak verilebilir. Atanan IP değiştiğinde veya dosya içerisindeki IP manuel olarak değiştirildiğinde işlem yapılmış olur. İşte soket tanımlayıcısı olarak belirlenen işlemlerde temelinde bu  dosya mantığında ilerlemektedir. 

Dosya ve soket ilişkisi üzerinde biraz daha durulmasında fayda vardır. Ne zaman bir uygulama açılsa bir dosya yaratılır veya o uygulamayla ilişkili halihazırda var olan bir dosya üzerinde işlemler yapılmaya başlanır. Dosya tanımlayıcısı oluşturulmuş olunur. Bu tanımlayıcı bir işaretcidir ve görevi veri yapısında dosyayı tanımlamaktır. Data yapısı dosyanın ismini, dosyanın gerçek yerini (diskde mi hafızada mı olduğunu), salt okunur mu yoksa okuma-yazma işlemine uygun mu olduğunu ve dosyanın boyut bilgilerini içerir[34]. 

Dosya işlemlerine benzer şekilde soket tanımlayıcısının oluşumu da bir uygulamanın soket oluşturmasıyla gerçekleşir. Soket veri yapısında ek olarak soket tipi, local adres, kullanılan port bilgisi gibi bilgiler bulunur. Örnek vermek gerekirse FTP işlemleri 20. porttan gerçekleşir. İşte bu bilgi soket veri yapısında bulundurulur[35].

Bu çalışmada baz alınan soket sisteminde ağa bağlı olmak için mutlaka soket açık olmalıdır. Soket açık olduktan sonra veri soketten okunabilir veya sokete yazılabilir. İletişim sona erdiğinde ise ağ ile iletişim kapatılır ve soket tarafından kullanılan kaynaklar serbest bırakılır.

Şekil'de de gösterildiği üzere soketler iki farklı yolla kullanılabilmektedirler. Bir soket oluşturulduktan sonra bir bağlıtı talebi gelene kadar bekleyebilir veya uzaktaki bir host ile bağlantı başlatabilir. Soket istemci bir program tarafından kullanılıyorsa, bir servera bağlantı başlatıyorsa bu soket aktif bir sokettir. Eğer soket server gibi davranıyor ve bir bağlantı talebi gelmeden işlev görmüyorsa bu soket pasif bir sokettir. İki türlü soket tibi de aynı yöntemlere oluşturulur. Tek fark hangi tip ağ uygulaması tarafından kullanıldıklarıdır.
ŞEKİL: Aktif ve Pasif Soket


Aktif soket yapısında istemci uygulama soket komutuyla soketi oluşturur. Bağlantı, severe bağlantı istemidir. Yazma() komutuyla birlikte etkileşimde olunan servera istek gönderilir ve server tarafından okuma() kısmında bu istek okunur. İstemci çağrısı sona erdiğinde çağrı kapat() ile kapatılır.


Aktif pasifte soket oluşturulduktan sonra dinleme evresi vardır bir çağrı geldiğinde bu çağrı kabul edilir istek kabul edilir ve çağrı okunur daha sonrasında kabul işlemi gerçekleşir ve bağlantı kurulur, bu bağlantı işlem sona erdiğinde kapatılır.




  

13 Haziran 2017 Salı

12. Soket Sabitleri

Haziran 13, 2017 Posted by Burak Candan No comments
Diğer programlama uygulamalarında olduğu gibi soket ara yüzlerinde de daha önceden tanımlanmış sembolik sabitler ve bildirilmiş data yapıları kullanılır. Sabitler, fonksiyon prototipleri ve veri yapıları C ön-işlemcisinin gerektirdiği üzere dosyaların başlangıç kısımlarında yer alır. Bu sabitler /usr/include dizininde bulunmaktadır[36]. Aplikasyonların başlangıç kodları şu şekilde gözükebilmektedir: 

#include <sys/types.h>

#include <sys/socket.h>

Berkeley soket arayüzünde iki tip birincil sabit ayarı kullanılmaktadır: Protokol Tip Sabitleri ve Adres Aile Sabitleri. Adres aile sabitleri AF_INET, AFINET6 gibi 10 farklı türdedir[37].

Soket sabitleri konusu oldukça detaylı bir konudur. Bu yüzden çalışmanın dağılmaması için daha fazla detaya girilmeden bu başlık burada sonlanmaktadır.

12 Haziran 2017 Pazartesi

13. Soket Fonksiyonları

Haziran 12, 2017 Posted by Burak Candan No comments
İhtiyaca yönelik olarak aplikasyonlarda aşağıda belirtilen fonksiyonlardan bazıları kullanılmaktadır. Duruma göre hepsi kullanılabilir veya burada yer almayan fonksiyonlara ihtiyaç duyulabilir. Bazı platformlara özgü fonksiyonlar veya üçüncü parti kütüphaneler mevcuttur. Bu tarz spesifik alanlara ait fonksiyonlar burada yer almamaktadır. Bu çalışmada tipik Linux sisteminde yer alan fonksiyonlar, parametreleri ve kullanımları gösterilmiştir.

Core Fonksiyonları

İstemci olabilmek için ilk önce server görevi görebilmek gerekmektedir. Bu yüzden ilk önce server soket tipine uygun fonksiyonlar incelenecektir.

Socket()

Socket() en kritik fonksiyondur diyebiliriz. Bu fonksiyon olmadan aplikasyon ağ ile iletişime geçemez. Socket() fonksiyonu ağ sonu noktası oluşturur.
Fonksiyon kullanımı: int socket(int domain, int type, int protocol);
bind()

Soket oluşturulduktan sonra bir bağlantı adresi gerekmektedir. Bağlantı oluşturulması için bind() fonksiyonu kullanılır.
Fonksiyon kullanımı: inf bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
bind fonksiyonunun içindeki ilk parametre soketin tanımlayıcısıdır. İkinci parametre ise sockddr yapı işaretcisidir. Üçüncü parametre de sockaddr yapısının uzunluğudur.
listen()

Sıradaki fonksiyon listen() fonksiyonudur. Bağlantı da oluşturulduğuna göre soket, bağlantı kabul etmeye hazırdır. Ayrıca bu fonksiyonla bağlantılar reddedilmeye başlanmadan önce alınabilecek maksimum bağlantı sayıda belirtilebilir.

Fonksiyonun Kullanımı: int listen(int s, int backlog);

backlog sabiti kaç bağlantıdan sonra reddetme işleminin başlayacağını belirler. Backlog için tipik değer 5'tir. 

Accept()

Önceki fonksiyonlar başarılı bir şekilde tatbik edildiği halde soket oluşturulmuş olur. Böylece bir sonraki basamak olan bağlantı kabul aşamasına geçilebilir. Bu işlem için kullanılması gereken fonksiyon accept() fonksiyonudur.

Fonksiyon Kullanımı: int accept(int s, struct sockaddr  *addr, socklen_t *addrlen);

Write()

İstemciye cevap verilmesi için string karakterleri gönderilmesi gerekmektedir. Bunun için write() fonksiyonu kullanımı icap etmektedir.

Fonksiyon Kullanımı: ssize_t wrte (int fd, const void *buf, size_t count);

Close()

İşlemlerin kapatılması gerekir. Bunun için close() fonksiyonu mevcuttur.

Fonksiyon Kullanımı: int close(int fd);

Bunlar dışında başka fonksiyonlar da mevcuttur. Yazıyı detaya boğmamak için sadece isimleri veirilip geçilecektir. Kullanımlarına dair detaylı anlatımlar internetteki bağımsız kaynaklarda mevcuttur. Linux Ağ Programlamada unutulmaması gereken önemli bir konu da programlama esnasında baz alınan protokoldür. Yazının genelinde TCP (Transmission Control Protocol) baz alınmıştır. Bağlantıyı sağlayan diğer bir protokol ise User Datagram Protocol(UDP)'dür. İki protokolde farklılıklar ortaya çıkmaktadır. Uygulama bölümünde TCP baz alınarak basit bir pasif soket programlama örneği yer almaktadır.

11 Haziran 2017 Pazar

14. Linux Ağ Yönetimi

Haziran 11, 2017 Posted by Burak Candan No comments
Son yapılan araştırmalar sonucunda Tübitak'ın verilerine göre Türkiye'de kamuda 20.000 kullanıcı Pardus İşletim sistemini kullanmaktadır. Kişisel kullanıcı sayısının ise 100.000'e ulaştığı tahmin edilmektedir[38].

Yine Tübitak'ın yayınladığı içeriklere göre personel eğitimini ve alt yapı çalışmalarını tamamlayan içlerinde Üsküdar, Tuzla, Pendik gibi belediyelerin bulunduğu toplamda 9 belediye ve pek çok kamu kurum ve kuruluşu Tübitak Ulusal Akademik Ağ ve Bilgi Merkezince geliştirilmiş, milli işletim sistemi kimliği taşıyan Pardus İşletim Sistemi'ni kullanmaktadır[39].

Yazının başında da değinildiği gibi Linux işletim sistemleri yapıları gereği açık uçlu yazılım olmaları ve barındırdıkları pek çok yazılımın lisans ücreti içermemelerinden dolayı kullanıcılarına oldukça büyük karlar sağlamaktadır. 

Linux cihazların yer aldığı ağ, gerekli geliştirmelerle Linux ağ yönetimi ile yönetildiğinde ise edilen maddi kazançlar oldukça ciddi boyutlarda. 

Yapılan çalışmalara göre TCP/IP ağlarının yönetiminde Linux tabanlı kişisel bilgisayarlar kullanıldığında normalde yapılacak masraf 10k ise, linux ağ yönetimi ile bu masraf k miktarına kadar düşebilmektedir(Kömür, Ayfer 2006: 1).

TCP/IP ağlarının birleştirilmesinde yönlendiriciler kullanılır ve bu yönlendiricler ağ yöneticileri açısından birincil denetim ve gözlem referanslarıdır. Bu tarz yönlendiricler oldukça uçuk fiyatlara satılmaktadır. Bu yönlendiricelere başvurmak yerine kişisel kullanım amaçlı satılan bilgisayarlar  Linux veya yukarıda sıkça atıfta bulunulan BSD işletim sistemi ile başarılı bir şekilde yönlendirici olarak kullanılabilmektedir(Kömür, Ayfer 2006:2)

Bu noktada şu çıkarımın yapılması gayet makul olacaktır. Linux Ağ Programlama ve Linux Ağ Yönetimi bütüncül olarak ele alındığında oldukça başarılı, ekonomik modeller ortaya çıkmaktadır. Bu iki kavramın ortak ele alınması sonucunda ortaya çıkan ve çıkabilecek durumlar hakkında daha detaylı bilgi yazının 4. bölümü olan sonuç ve öneriler kısmında işlenecektir. 

10 Haziran 2017 Cumartesi

15. Uygulama

Haziran 10, 2017 Posted by Burak Candan No comments
Dinleme Modundaki Server (TCP/IP)
Simple Server (Basit server)
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
const char APRESSMESSAGE[] = "APRESS - Dinleme modu aktif!\n";

int main(int argc, char *argv[]) {
int simpleSocket = 0;
int simplePort = 0;
int returnStatus = 0;
struct sockaddr_in simpleServer;
if (2 != argc) {
fprintf(stderr, "Kullanılan Port: %s <port>\n", argv[0]);
exit(1);
}
simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (simpleSocket == -1) {
fprintf(stderr, "Soket Oluşturulamadı!\n");
exit(1);
}
else {
fprintf(stderr, "Soket oluşturuldu!\n");
}
/* Dinlenen Port Numarası Alınıyor */
simplePort = atoi(argv[1]);
/* adres yapısı kurulumu */
/* komut INADDR_ANY ile tüm lokal adreslere bağlan
*/
bzero(&simpleServer, sizeof(simpleServer));
simpleServer.sin_family = AF_INET;
simpleServer.sin_addr.s_addr = htonl(INADDR_ANY);
simpleServer.sin_port = htons(simplePort);
/*
port ve adreslere soket ile bağlan
*/
returnStatus = bind(simpleSocket,
(struct sockaddr *)&simpleServer,
sizeof(simpleServer));
if (returnStatus == 0) {
fprintf(stderr, "Bağlantı kuruldu!\n");
}
else {
fprintf(stderr, "Adrese bağlanamadı!\n");
close(simpleSocket);
exit(1);
}
/* Soketteki bağlantı sayısını kontrol et
returnStatus = listen(simpleSocket, 5);
if (returnStatus == -1) {
fprintf(stderr, "Sokette dinleme yapılamadı!\n");
close(simpleSocket);
exit(1);
}
while (1)
{
struct sockaddr_in clientName = { 0 };
int simpleChildSocket = 0;
int clientNameLength = sizeof(clientName);
/* wait here */
simpleChildSocket = accept(simpleSocket,
(struct sockaddr *)&clientName,
&clientNameLength);
if (simpleChildSocket == -1) {
fprintf(stderr, "Cannot accept connections!\n");
close(simpleSocket);
exit(1);
}
/* yeni bağlantı isteği yönetimi
*/
/* istemciye mesaj yaz */
write(simpleChildSocket, APRESSMESSAGE, strlen(APRESSMESSAGE));
close(simpleChildSocket);
}
close(simpleSocket);
return 0;
}

Basit bir UDP Server Yapısı

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>

#define MAXBUF 1024
/*Maksimum ara bellek boyutunu tanımladık*/

int main(int argc, char* argv[])
{
int udpSocket;
int returnStatus = 0;
int addrlen = 0;
struct sockaddr_in udpServer, udpClient;
char buf[MAXBUF];
/* Doğru portta olup olmadığımızı kontrol edelim*/
if (argc < 2)
{
fprintf(stderr, "Kullanılan Port: %s <port>\n", argv[0]);
exit(1);
}


/* soket oluşturulması */
udpSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (udpSocket == -1)
{
fprintf(stderr, "Soket oluşturulamadı!\n");
exit(1);
}
else {
printf("Soket oluşturuldu.\n");
}

/* Server ve adres kurulumu */

/*  INADDR_ANY ile lokal adreslere bağlanma */
udpServer.sin_family = AF_INET;
udpServer.sin_addr.s_addr = htonl(INADDR_ANY);
/* argüman olarak port kullanımı */
udpServer.sin_port = htons(atoi(argv[1]));

/* bind to the socket */
returnStatus = bind(udpSocket, (struct sockaddr*)&udpServer,
sizeof(udpServer));
if (returnStatus == 0) {
fprintf(stderr, "Bağlantı tamamlandı!\n");
}
else {
fprintf(stderr, "Adrese bağlanılamadı!\n");
close(udpSocket);
exit(1);
}

while (1)
{
addrlen = sizeof(udpClient);
returnStatus = recvfrom(udpSocket, buf, MAXBUF, 0,
(struct sockaddr*)&udpClient, &addrlen);

if (returnStatus == -1) {
fprintf(stderr, "Mesaj ulaşmadı!\n");
}
else {
printf("Alındı: %s\n", buf);
/* mesaj alındığı için onay gönder */
strcpy(buf, "OK");
returnStatus = sendto(udpSocket, buf, strlen(buf)+1, 0,
(struct sockaddr*)&udpClient,
sizeof(udpClient));
if (returnStatus == -1) {
fprintf(stderr, "Onay gönderilemedi!\n");
}
else {
printf("Onay Gönderildi.\n");
}
/*Temizlik zamanı */
close(udpSocket);
return 0;
}



9 Haziran 2017 Cuma

16. Sonuç ve Öneriler

Haziran 09, 2017 Posted by Burak Candan No comments
Linux Ağ Programlama ve Linux Ağ Yönetimi üzerine araştırma yapıldığında görülecektir ki Ağ üzerindeki işlemlerin Linux araçlarıyla yapılmasıyla en küçük ölçekten en büyük ölçeğe kadar ciddi avantajlar elde edilmektedir. Sadece Ağ Yönetimi bile çalışmada belirtildiği üzere oldukça kayda değer mali kar avantajları sunmaktadır. Kamu kurum ve kuruluşlarının, üniversitelerin zaman içerisinde uygun alt yapı ve personel eğitimlerini tamamladıktan sonra Linux sistemlerine geçmesi de bu avantajın önemli kurumlarca fark edildiğinin işaretidir.

Linux sistemleri maalesef kişisel kullanım için hala Windows ya da Mac Os ile yarışta bir kaç adım geridedir. Bu durumun birden fazla sebebi vardır. Bu nedenler şu şekilde sıralanabilir:

1.Yaygın kullanılan bazı programların Linux sistemlerinde olmaması veya kurulumunun diğer yaygın işletim sistemlerine kıyasla daha zor olması.
2.Yapısı ve terminal bulundurmasından dolayı bilişime uzak kitlelere çok da hitap etmemesi.
3.Teknik destek konusunda görece geride kalması.
4.Mobil uyumluluğunun bulunmaması, bulunan sürümlerin yaygın olmaması.

Yukarıdaki maddelere başka parametreler de eklenebilir. Belki de en önemli madde sonda yer alan maddedir. Çünkü her geçen gün masaüstü ve dizüstü bilgisayar kullanımı azalmakta, bunun yerine akıllı telefon ve tablet kullanımı artmaktadır. Linux dağıtımlarının tablet ve akıllı telefon pazarındaki yeri yok denecek kadar azdır. Bu durum Linux kullanımının yakın bir gelecekte yazılım, siber güvenlik gibi alanlarla ilişkili spesifik bir kitleye indirgenmesine sebep olabilir. Linux Ağ Programlama ve Linux Ağ Yönetimi gibi profesyonellik gereken alanlarda Linux sistemlerinin kullanılması büyük karlar ve avantajlar sağlasa da bu sistemlerin genel kitlelerin veya amatörlerin ilgisini çekmemesi gelecekte bu alanlarda kalifiye eleman yetişmesi noktasında sıkıntı yaratabilir.

Öneriler kısmında ise oldukça önemli şeyler sıralanabilir. Özellikle özgün yazılım ve ulusal güvenlik açısından 100% yerli işletim çekirdeği ve kullanıcı araçları oluşturulana kadar GNU/Linux değerlendirilmesi gereken bir fırsattır. Fakat öyle ya da böyle tamamen yerli işletim çekirdeğinin olmaması kritik bir eksi olacaktır.

Bu duruma ek olarak Linux işletim sistemlerinin  mobile entegrasyonu konusunda bir açıklık bulunmaktadır. Tabi bu durumun müsebbibi Android olduğu gerçek bir vakıadır. Fakat yapılacak fizibilite çalışmaları neticesinde kar-zarar, fiyat-performans gibi parametreler de dikkate alınarak yeni ve etkili bir pazar yaratılabilir. Mobil pazarındaki ulusal pay artırılabilir. 

8 Haziran 2017 Perşembe

17. Kaynakça

Haziran 08, 2017 Posted by Burak Candan No comments
[1] https://www.kernel.org/
[2] Callegari C., Giordano S., Pagano M. ve Pepe T. “Behavior analysis of TCP Linux variants” Elsevier, Computer Networks 56, 462-476 (2012)
[3] Wang H. ve arkadaşları “Networks of networks in Linux operatings system” Elsevier, Physica A 447, 520-526 (2016)
[4] https://tr.wikipedia.org/wiki/Linux
[5] https://en.wikipedia.org/wiki/Linux
[6] https://tr.wikipedia.org/wiki/Linux_%C3%A7ekirde%C4%9Fi
[7] https://tr.wikipedia.org/wiki/Linux
[8] https://tr.wikipedia.org/wiki/GNU
[9] https://en.wikipedia.org/wiki/Circuit_switching
[10]https://en.wikipedia.org/wiki/Packet_switching
[11] Balazinska M., Castro P., “Characterizing mobility and network usage in a corporate wireless local-area network” Abstract Area (2003)
[12] Hoşcan Y., “Bilgisayar Ağları ve İnternet” Anadolu Üniversitesi, 193, (1997)
[13]http://web.archive.org/web/20120702232949/http://americanhistory.si.edu/collections/object.cfm?key=35&objkey=96
[14] https://tr.wikipedia.org/wiki/Ethernet
[15] Sevick K. C., Johnson M. J., “Cycle Time Proporties of the FDDI Token Ring Protocol” IEEE, Software, 376-385 (1987)
[16] https://en.wikipedia.org/wiki/ARCNET
[17] http://docwiki.cisco.com/wiki/DECnet
[18]https://en.wikipedia.org/wiki/Ethernet_frame
[19]http://www.tuik.gov.tr/PreHaberBultenleri.do?id=18660
[20]https://tr.wikipedia.org/wiki/IPv4
[21]http://bidb.itu.edu.tr/seyirdefteri/blog/2013/09/07/osi-katmanlar%C4%B1
[22]http://bidb.itu.edu.tr/seyirdefteri/blog/2013/09/07/tcp-ip-protokol%C3%BC
[23]https://tools.ietf.org/html/rfc791
[24]http://www.ipv6tf.org/index.php?page=news/newsroom
[25]https://en.wikipedia.org/wiki/Berkeley_Software_Distribution
[26]http://www.darpa.mil/about-us/darpa-history-and-timeline
[27]http://www.darpa.mil/about-us/timeline/tcp-ip
[28]https://www.freebsd.org/
[29]https://en.wikipedia.org/wiki/Berkeley_Software_Distribution
[30]https://www.freebsd.org/doc/en_US.ISO8859-1/articles/explaining-bsd/article.html
[31]https://www.freebsd.org/doc/en/books/developers-handbook/sockets.html
[32]https://docs.freebsd.org/info/gcc/gcc.info.Function_Attributes.html
[33]Varol A., Alkan T., İnternet'e genel bakış, uzaktan eğitim, sayfa 10-16 (1998)
[34]https://www.freebsd.org/doc/en/books/design-44bsd/overview-io-system.html
[35]https://tr.wikipedia.org/wiki/TCP_ve_UDP_port_numaralar%C4%B1_listesi
[36]https://tools.ietf.org/html/rfc6317
[37]https://www.ibm.com/support/knowledgecenter/en/ssw_i5_54/rzab6/address.htm
[38]https://www.tubitak.gov.tr/tr/haber/kamuda-20-bin-kullanici-pardusu-kullaniyor
[39]https://www.tubitak.gov.tr/tr/haber/pardusun-kullanimi-giderek-yayginlasiyor