You are on page 1of 67

16.12.

2017 Bilgisayar Alar ve A Programlar - Ders Notlar

Bilgisayar Alar ve A Programlar - Ders Notlar


Mehmet Gener
2013

1 Dijital ada letiim


1.1 Analog ortam, uzaktan iletiim, ve kodlama
1.2 Dijital kodlama
1.3 nsan deneyiminin dijitalletirilmesi
2 Elektronik Cihazlar Aras letiim
2.1 letiim Modeli
2.2 Fiziksel katman
2.2.1 Yerel a ve kablolu ethernet
2.2.2 oklu balant sorunu
2.2.3 Kablosuz ortamlar
2.2.4 Telefon ve ADSL
2.2.5 Optik kablo - fiber optik
2.3 Veri balant katman (Data Link Layer)
2.3.1 Ak kontrol
2.3.2 2. katman trafik kontrol
2.3.3 Yksek hzda iletiim
2.4 Problemler
3 Alar aras a: nternet'in ileyii
3.1 Global iletiim yntemleri: Paket ve Hat Anahtarlamas Ayrm
3.2 nternet Protokolne bir bak
3.2.1 Yerel a (Intranet)
3.3 nternet Protokolnn leyii
3.3.1 Adresleme
3.3.2 Paket trafii ve kayplar
3.3.3 Datm kalitesi
3.3.4 Gvenlik, Gizlilik, ve sanal zel alar (VPN: Virtual Private Networks)
3.3.5 IP Paket Yaps
3.4 ICMP (Internet Control Messaging Protocol)
3.5 nternet Altyap Cihazlar: Layer 2 ve 3 switch
3.6 Ateduvar (Firewall)
3.7 Okuma nerileri
4 Soket Programlama ve Program/Sre Modelleri
4.1 Sreler ve tantclar
4.2 Pipe-Kanal
4.3 Soket-ifti
4.4 Ak ve paket tabanl soketler
4.5 Durum almas ve balant soketleri: Metin tabanl bir protokol rnei
4.6 Soket seenekleri
4.6.1 Blokaj
4.6.2 Pasif okuma: Kesme (Interrupt) ile asenkron soket kullanm
4.6.3 Dier asenktron yntemler
4.7 Egzersiz ve Asenkron durum almas
5 Tama Katman ve A soketleri I: Paket Tabanl letiim ve UDP
5.1 Paket tabanl a iletiimi: UDP protokol
5.2 -adres/port numaralarnn tahsisi ve kullanm ile ilgili temel kurallar
5.3 rnek: Paket tabanl tarih-zaman servisi
5.4 A arayzleri ve localhost
5.5 Unicast, Broadcast, ve Multicast
5.6 UDP/paket tabanl baz servisler: DHCP, DNS, ve dierleri
5.6.1 DHCP
5.6.2 DNS
5.7 Egzersizler
6 Tama Katman ve A soketleri II: Ak Tabanl letiim ve TCP
6.1 Paket yaps
6.2 Balant ynetimi
6.3 TCP "yava balama" sorunu
6.4 Programlama rnei: Echo servisi
6.4.1 Java sunucu ve istemci
6.4.2 Python sunucu ve istemci
6.4.3 C sunucu ve istemci
6.5 Ezamanl (ok-izlekli, multi-threaded) TCP sunucu rnei
6.5.1 Java ok-izlekli sunucu
6.5.2 Python ok-izlekli sunucu
6.5.3 C fork() kullanan ok-sreli sunucu
7 A topolojileri ve Sre Modelleri
7.1 Birebir iletiim
7.1.1 rnek (tek ynl, ak tabanl): netcat??
7.1.2 rnek (ift ynl, senkron, ak tabanl): uzaktan komut satr
7.1.3 rnek (ift ynl, asenkron, paket tabanl): Sesli (audio) iletiim
7.2 Yayn
7.2.1 rnek: Yerel a mzik yayn
7.3 Sunucu ve bamsz istemciler
7.3.1 rnek: HTTP sunucusu ve Python st dzey sunucu soket kitapl
7.4 Sunucu ve baml istemciler
7.4.1 rnek: Sohbet sunucusu (Python st dzey soket kitapl ile)
7.4.2 rnek: Grup scribble
7.5 Tek istemci ok sunucu

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 1/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
7.6 Peer-to-peer (P2P) topolojisi
8 Yksek performansl sunucular: zlek havuzu (thread-pool) ve asenkron programlama
8.1 Sreli ve srekli grevlerin fark
8.2 Sreli grevler: grev havuzu ve izlek havuzu
8.3 Srekli grevler ve asenkron girdi-kt yntemi
8.3.1 Yoklama dngs
8.3.2 Selektrler ve Java yeni girdi-kt kitapl
8.4 "Durumlu" istemcilerde asenkron yntem
8.5 ki tekniin kombinasyonu ile performans arttrm
8.6 Egzersizler
9 A gvenlii
9.1 ifreleme (kriptografi) ve Kripto-analiz
9.1.1 Kriptoanaliz
9.2 Simetrik ifreleme
9.2.1 DES, 3-DES, ve AES
9.2.2 Java ile DES kullanm
9.3 Bozma (hash) fonksiyonlar
9.3.1 MD5
9.3.2 SHA
9.3.3 Programlarda bozma-hash ileminin uygulanmas
9.4 Hash fonksiyonlar ile kimlik/ifre dorulama ve dijital imza
9.5 IPSec ve a katman gvenlik
9.5.1 VPN tnelleme (tunneling)
10 Modern A Gvenlii:Asimetrik ifreleme
10.1 Eksponansiyel ifreleme ve arpanlara ayrma problemi
10.2 Diffie-Hellman ifre deiim yntemi ve ayrk logaritma
10.3 RSA asimetrik ifreleme
10.4 RSA "Public Key" Sertifikalar: PKI ve Web-of-trust
10.5 RSA ile dijital imza
10.6 RSA ile e-posta gizlilii: PGP
11 Ak Katman (TCP) ifreleme: TLS ve SSL'in A Programlarnda Kullanm
11.1 Gvenli soketlerin programlamada kullanm
11.1.1 Python rnekleri
12 Datk Sreler
12.1 Hangi problemler paralelletirilebilir ve datlabilir?
12.2 Datk sre programlama teknikleri ve ilgili standartlar
12.3 Remote Method Invocation (RMI)
12.3.1 RMI Ezamanllk
12.4 RMI ve SSL Gvenlii
12.5 XML-RPC
12.6 Asenkron XML-RPC
13 Datk mimariler: Peer-to-peer
13.1 Hibrid sistemler
13.2 Gnutella
13.3 Datk hash tablolar
13.3.1 Chord
13.4 Kademlia
13.5 Bittorrent
13.6 Sensr alar ve ad-hoc alar
13.7 rnek uygulamalar

1 Dijital ada letiim


b Duyularmz arasnda duyma ve grme'nin kendine zg baz nitelikleri vardr. ki duyu da uzak mesafeden iler: sokan ucundaki biriyle sesli iletiim kurabilir,
kilometrelerce uzaktaki birinin k veya dumanla gnderdii iaretleri grebiliriz. Daha da nemlisi bu iki duyu bizim 'dil' becerilerimizi kullanabildiimiz duyular.
Biri szl dieri yazl ifade aracmz. Bu yzden iletiimimizin de temelini oluturuyorlar.

Bu derste ifade ve iletiim kavramlarn iin iinde bilgisayarlarn olduu dijital bir dnyada inceleyeceiz. Bunu yaparken eskiden beri kullandmz analog
iletiime de gndermeler yapacaz ve benzerliklerin altn izeceiz.

Analog veya analoji kelimesi birebir benzerlii ifade eder. rnein plaa kaydedilen sesli ifade asln oluturan ses dalgalarn kat ve dayankl bir ortam'da
sabitlemitir. Orijinal ifade ile temsili birebir eleir: orijinal ses dalgasnn her anna karlk plan zerindeki igide bir ykselti noktas vardr. fade'den temsile
(plaa kayt) ve sonra tekrar ifade'ye gei (pla alma) analog aralarla gerekleir (sesi fiziksel genlie ve fiziksel genlii sese dntren piezo-elektrik para ve
mikrofon/hoparlr kombinasyonlar).

Artk bu pla uzakta bir yere gtrp alabilirsiniz. Analog ifadenin sabitletirilmi temsilini ve yeniden yaratmn salayan analog teknoloji size iletiimi duyu ve
ifade organlarmzla yapabildiimizden ok daha uzun mesafeler zerinden gerekletirme imkan sunmu olur.

nce radyo ve telefon, sonra da televizyon bu tr bir uzaa iletiimi canl yapmaya imkan verdi. Bunlar plaktan farkl olarak temsil'i sabitlemek yerine havadan
manyetik dalga veya kablodan elektrik dalgas olarak iletiyorlar. Kimi dierinden daha karmak olsa da hepsi analog temsil prensibini kullanyorlar.

1.1 Analog ortam, uzaktan iletiim, ve kodlama


Nihayetinde btn iletiim ortamlar (communication medium) analogdur. Ne var ki kendi vcudumuzla kullanabildiimiz ortamlarn mesafe snr ok dar: sesimiz
sokan ucuna ancak gidiyor, gzlerimiz de belirli bir mesafeden detaylar seebiliyor. Bu mesafeyi uzatabilecei dnlen baz medyalar 19. yzylda kefedildi:
iletken kablolarla elektrik kullanarak ve havadan elektromanyetik dalgalarla.

Graham Bell'in icat ettii telefon insan sesini onunla birebir ayn (frekans ve ykseklik/g olarak) bir elektrik sinyaline dntrp bunu kablo zerinden uzak
mesafelere gnderebiliyor, ve teki uta sinyali tekrar ses dntrebiliyordu. Bu sistem olduka basitti nk iletilen elektrik dalgas tad sese birebir denk
dyordu.

Bundan bir sre sonra, 20. yzyl banda ortaya kan radyo yayn ise biraz daha karmaktr. Radyo dalgalar bir kablo demeye gerek olmakszn uzak
mesafelere gnderilebilir. Buna karlk dalga frekanslar insan sesinin frekanslarna denk gelmez. Bu yzden bir eit "kodlama" gerekir.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 2/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
AM bu kodlama yntemlerinden en basitidir. Bu kodlamada iletilmek istenen ses kendisinden ok daha yksek frekansl olan sabit frekansta bir tayc
elektromanyetik dalgann srtna dalga ykseklii/iddeti yklenir (ekil?). Bu yzden "amplitude modulation" (ykseklik kodlamas) ad verilmitir. Bu kodlama
grece dk frekansl tayc dalga kullanabilir. Sonuta duyabildiimiz sesler en fazla 20 KHz civar olduundan bu sesler 400 KHz ve daha yksek frekansa
sahip bir elektomanyetik dalyann srtna yklenebilir. Bu grece dk frekansl elektromanyetik dalgalar daha yksek frekansl dalgalara gre daha uzak
mesafelere ular. Bylece rnein stanbul'daki bir alc cihazla Berlin radyosunu dinleyebilirniz. Ancak AM kodlamas havadaki baka elektromanyetik
dalgalardan dolay kolayca kirlenir ve parazit oluur. Bu kirlilik her trl elektrikli cihazdan kaynaklanabilir.

FM kodlamas bu kirlilik sorununa cevap verir. Bu kodlamada orijinal ses tayc elektromanyetik dalgaya ykseklik olarak deil frekansndaki deiiklik olarak
yklenir. Bu yzden de frequencey modulation (frekans kodlamas) adn alr. Bu yntemde rnein 94.1 MHz frekansndan bir yayn dinliyorsanz aslnda tayc
dalgann frekans 94100 art-eksi 20 KHz arasnda dalgalanmaktadr. Orijinal ses bu dalgann frekansnn yayn frekansndan fark olarak kodlanmtr. Parazitler
tayc dalgann yksekliini bozsa bile frekans kolay kolay bozulmaz. O yzden FM alclar ok daha temiz ses verir. Ama buna karlk bu kodlama ok daha
yksek frekanslar kullanmay gerektirir ve bu yksek frekanslar o kadar uzak mesafelere gitmez. Olsa olsa bir metropolitan alana yayn yaplabilir.

1.2 Dijital kodlama


Dijital yani saysal kodlamay biraz geniletilmi bir tanmla ele alacaz. rnein yaz alfabesi, mzik nota sistemi, ve mors alfabesini dijital kodlama olarak kabul
edebiliriz. Bu kodlamalar ifadedeki bozulmalara dayankldr. Yzyze konumada bile aksan farkllklar ifadenin aktarlamamasna yolaabilir. Oysa belirli bir
standarda gre yazlm bir metin veya nota orijinal ifadeyi hi bozulmakszn aktarr.

ok eski dijital kodlama yntemlerinden biri duman veya kla haberlemedir. Belirli anlamlarn kodlamas zerinde anlatktan sonra, rnein bir tepedeki
gzetleme noktasndan kilometrelerce tedeki baka bir noktaya k veya duman sinyalleriyle bir "ifade"yi aktarmak mmkn olmutur. Benzer ekilde yazl
metinlerin gvercinler veya atl kuryeler tarafndan tanmasyla kodlanm bir ifade uzaa aktarlabiliyordu. ok uzun yzyllar boyunca bu kodlama biimleri
gelimitir. Mzik notasyon sistemleri sayesinde szl olann yansra mziksel mesajlar da aktarlabiliyordu. Say sistemlerinin gelimesiyle byklklerin ve
hesaplarn ifadesi mmkn olmutu, vb.

Benzeri bir sistem telgrafta kullanlr. 19. yzyln banda gelitirilen telgraf iletken kablolar zerinden elektrik var/yok sinyalleri gndermeye dayanyordu.
Alfabedeki harf ve rakamlarn elektrik var/yok sinyalleriyle nasl temsil edileceine dair ortak bir alfabe (Morse alfabesi) bu yntemin temelidir. rnein A harfi bir
ksa ve hemen ardndan bir uzun "var" sinyali ile temsil edilir. Bylece ok sayda sembolden oluan yazl/dijital ifadeler bu sembollerin elektrik var/yok
sinyallerine kodlanmas ve kar tarafta zlmesi sayesinde annda uzaa iletilebilmiti. Bu gerek bir iletiim devrimi olmutur. Telgraf kullanrken bir "ksa"nn
arkasndan gelen "uzun"un normalden biraz daha uzun olmas, veya arada oluacak bir miktar "czrt" mesaj kolay kolay bozamaz (en azndan ou zaman). Oysa
szkonusu olan AM radyo yaynnda sylenen bir arya olsayd duyduumuz keyif ciddi ekilde azalrd.

1.3 nsan deneyiminin dijitalletirilmesi


Gnmzde sz, ses, ve grntleri uzaa iletme yntemlerimizin nemli bir ksm grsel-iitsel deneyimlerimizin nce dijital olarak kodlanmasn ierir. Hemen
syleyelim cep telefonuyla yaplan sesli grme, ou televizyon ve radyo yayn hala analog kodlama ile yaplmaktadr. Ancak dijital kodlama, zellikle ilgili
teknolojilerin maliyetinin dmesiyle beraber yaygnlayor. Bunun en nemli nedeni dijital kodlanm deneyimlerin "hatasz", yani hi bozulmadan uzak mesafelere
iletilebilmesidir.

Dijitalletirilmi ses ve grnt analog temsilin (plak rnei) aksine orijinal ses ve grntnn her anna, her noktasna karlk gelmez. Bunun yerine bir
"rneklem" kullanlr. Bu yzden dijital ses ve grnt ancak bir "znrlk" snr dahilinde gereini temsil eder (ekil?). te yandan ses ve grnt (noktalar,
her bir noktann renk deeri) saylara dntrlp kodlandndan aktarmda bozulma olmaz. Bir anlamda youtube'dan bir video izlerken ok yksek hzl bir
telgraf sistemi ve ok karmak kod dntrmeleri yapan bir telgraf memuru kullandnz dnebilirsiniz.

2 Elektronik Cihazlar Aras letiim


Bilgisayarlar, genel olarak da elektronik ciharlarn telgraf memurundan nemli bir fark var. Bir telgraf memuru hattn dier ucundaki memurun "uzun"lar
normalden biraz daha uzun tutmasna alabilir, arada oluacak parazitlere uyum salayabilir. Parazitler yznden mesaj zemediyse kar tarafa sorup tekrar
gndermesine karar verebilir. Elektonik cihazlar szkonusu olduunda btn bu anlama, uyum salama ve hata giderme srelerini salam temellere oturtmak
gerekiyor. Bunun iin hem elektrik sinyallerine dair standartlar, hem iki tarafn kodlama-zme ilemlerine dair onay-ret-tekrarlama gibi "kontrol" ilemlerini
yapabilecei "protokoller" gerekir, hem de bu protokolleri yksek hzda gerekletirecek programlar. Btn bu gereksinimler bir takm standart katmanlar ile
salanmaktadr. Bu standartlar bir yanda genel olarak konuyla ilgili sz sahibi olan ISO (nternational Standards Organization) ile dier yanda bunlarn ilk
uygulamaya getii UNIX iletim sisteminin tarihinden izler tarlar.

Bilgisayarlar arasndaki iletiimde insanlarnkinden farkl olarak sadece saylar szkonusudur, ve bunlar da ikilik tabanda yazldklar iin sadece iki sembolden
oluan bir alfabe kullanlr. Bilgisayar tarafndan insanlara sunulacak verilerin yaz, ses, veya grntye dntrlmesi konumuzun dnda kalyor.

2.1 letiim Modeli


En genel haliyle analog veya dijital iletiimin modeli aadaki gibi dnlebilir:
----------- ---------
GNDERC | Kodlama | --> iletiim ortam -> |zme | ALICI
----------- ^ ^ ---------
| |
Grlt-Bozulma -
Dier alc/gndericiler?

Bu basit model eer iletiim ortam ve kodlama teknii iki tarafl iletiime izin veriyorsa simetrik olarak bir tane daha varm gibi dnlebilir. Her koulda uzaa
yaplan aktarmdaki iletiim ortam srekli veya zaman zaman ortaya kan/artan bozulmalar yaayabilir. Kodlama ve zme teknikleri AM radyo yntemindeki gibi
basit ve analog, veya fiber optik kablodaki gibidijital olabilir. Ayrca bata kablosuz iletiimde olmak zere hedeflenen alc ve gnderici dndaki cihazlarn (kt
niyetli kiilerce kullanlanlar dahil) iletiim ortamna eriimi szkonusu olabilir.

2.2 Fiziksel katman


ISO jargonunda "fiziksel katman" adi verilen standart ver protokoller bilgisayarlar aras iletiimin alfabesini oluturan hanelerden (yani 1 veya 0 deerini alabilen
"bit"leri) oluan dizilerin bir utan dier uca nasl iletilecei sorununu zer. Ancak bunu yaparken hatal hanelerin tespiti sorununa dokunmaz, onu bir st katmana
brakr.

Bilgisayar iletiiminde birok farkl fiziksel ortam kullanlabilir: yerel a kablosu, telefon/dial-up/ADSL, GSM, WiFi, uydu sinyali, k (fiber optik) sinyaller vb. Bu
ortamlarda kodlama ve protokol standartlar farkllklar gsterecektir.

2.2.1 Yerel a ve kablolu ethernet

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 3/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
En yaygn kullanlan balant ile balayalm: ofis ve evlerde kullanlan kablolu yerel a, ya da ethernet. Bu ada kullanlan balant kablosu iki ift iletken kablo ifti
ierir. Her bir kablo ifti bir elektrik sinyalini tayabildiinden biri bir utan dier uca, dier ift kablo ise ters ynde sinyal tayabilir. Yani bu kablonun iki ucuna
bal elektronik cihazlar ezamanl olarak biribirine sinyal gnderebilir.

Bit'leri gndermek iin ilk akla gelen " iin yksek voltaj, 0 iin dk voltaj gndermek. Ama bu durumda bir "zamanlama" sorunu ortaya kyor (telgraf
memurunu hatrlayn). Bir utaki cihazn saati dierinden biraz yavasa onun gnderdii bir haneyi, mesela 1 deerini kar taraf iki tane arka arkaya 1 olarak
anlayabilir. Buna bir zm ikinci bir ift kablo ile "saat sinyali" gndererek iki taraf senkronize etmek. Ama bu gereksinimleri karmaklatryor.

Zaman ierisinde bu probleme bulunan zm 1940'larn sonunda Manchester'da yaplan Mark I modeli bilgisayarn belleinde kullanlan br kodlama: Manchester
kodlamas. Bu kodlamada saat sinyali ve veri haneleri ayn sinyal ierisinde kodlanmtr. Veriler 1 yerine dk voltajdan yksee gei, 0 yerine ise tam tersi
olarak kodlanr (ekil ve aklama?)

Byle bir kablo kayda deer hzda veri tayabilir (elektrik iletim hz k hzna yakndr: 300.000 km/sn), ancak uzunluu snrldr.

rnek: 50 metre uzunluundaki bir kablodan 1 Gbps frekansta dijital veri gnderiliyor: (a) veriler kar uca ne kadar zamanda ular?, (b) herhangi bir anda
kablonun zerinde ka bit tanmaktadr?

Verini kar uca ulamas 50/300.000.000 saniye=167 nano-saniye srer. Kablo zerindeki bit says da bu srede kabloya enjekte edilen bit saysdr:
1G 50/300.000.000 = 1.000.000.000 50/300.000.000 = 167 bit.

2.2.2 oklu balant sorunu


Kimi zaman ethernet kablolar, rnein bir hub zerinden birden fazla cihaza baldr. Bu durumda birden fazla cihaz ezamanl olarak veri gndermeye kalkabilir
ve byle bir iletim tamamen anlalmaz bir sinyalle sonulanr. Cihazlarn geri adm atp tekrar denemeleri gerekecektir. Bunun bugn yaygn zm CSMA/CD
(Carrier sense Multiple Access with Collision Detection) protokoldr. Bu protokolde her cihaz ortam dinler ve bo kalnca veri iletmeyi dener. Ayn anda
beklemede olan baka bir cihaz da iletim yapar ve akma (collision) olursa ikisi de geri adm atar, rasgele bir sre bekler ve yeniden denerler. Ortamn ar youn
kullanld durumlar hari bu basit zm ok iyi almaktadr.

oklu balant topolojilerinde esas sorun verinin kimden kime gittiinin anlalmas sorunudur. Ancak bu bir st katmann zecei bir problem.

2.2.3 Kablosuz ortamlar

Kablosuz ortamlar (WiFi veya dier adyla kablosuz ethernet, GSM, bluetooth) prensipte kablolu ethernet'e benzer ekilde kullanlr. Ama ayn mekanda birok
cihaz kullanldndan ok sayda frekans dilimi bulunur ve her cihaz varsa bo olan bir dilimi kullanr. Yine ayn ekilde akmalar mmkndr ve benzeri
protokoller kullanlr.

Kablosuz ortamn belki en nemli fark gvenliktir. Kablosuz iletim bir duvarla snrlanamaz. Bu yzden gvenlik meselesi ek olarak ele alnmaldr. Bu da baka bir
katmann ii.

2.2.4 Telefon ve ADSL


Telefon kablolar belirli bir frekans araln tamak iin tasarlanmtr. Yllar boyunca dial-up balant yntemi bu aralktaki en yksek frekans (en kaliteli
ebekede 64 KHz) ethernet kablosundakine benzer bir kodlama ile kullanmtr. Yakn zamanda gelitirilen ADSL yntemi ise frekans araln kk dilimlere bler
ve her bir dilimdeki frekans ayr ayr ve ezamanl olarak veri iletiminde ie koar. Bylece rnein 1-64 KHz araln 1'er KHz'lik dilimlere blerseniz, ilk dilim
1kbps (kilo bir per second), ikincisi 2 Kbps, vs., ve sonuncusu 64 Mbps dijital veri tayabilir. Toplam 2 Mbps'den biraz fazla ediyor.

2.2.5 Optik kablo - fiber optik

Aynalanm d eperi sayesinde ileten fiber optik kablolar ok daha yksek hzda veri tayabilirler. rnein krmz (frekans 41014 Hz) ethernet
kablosundaki elektrik sinyaline benzer ekilde kullandmz farzedin. Bu durumda 400 Tbps civar bir iletim hz yakalanabilir gibi grnyor. Tabii bir "lamba"y
bu hzda ap-kapamak ayr bir mesele.

Optik iletimde ADSL'e benzer prensiplerle k spektrumunun dilimlerini ezamanl kullanarak daha yksek hzlar da elde edilebilir. Bundan da te fiber optik
kablolar elektrik iletken kablolardan daha verimlidir ve daha uzak mesafelere yksek hzda veri iletimine uygundur. Buna karlk ularda ve balant noktalarnda
kullanlan kodlama/zme teknolojisi daha pahal olduundan evlerde kullanm pek yaygn deildir. Onun yerine ehirler-aras veya kamps ii kampsler-aras
balantlarda tercih edilir.

2.3 Veri balant katman (Data Link Layer)


Bu 2. katman fiziksel katmann stne kurulur, ve "veri paketlerinin adresi belirli bir cihaza hatasz iletimini" salar. Burada yerel alarda kullanlan standartlara
deineceiz.

Bunu yapabilmek iin hane dizilerini paketleyebilmek gerekiyor. Bu paket yaps aada gsterilmitir:
iaret | alc | gnderici | kontrol | veri uzunluu |VER | Frame Check Sequence | iaret
| adresi| adresi | | | | (32 bit CRC) |
1 byte | 6 byte | 6 byte |2 byte | 2 byte | ? | 4 byte | 1 byte

Her paketin ba ve sonu baka hibir yerde ortaya kmayacak bir bit dizisi ile iaretlenmitir: 01111110. Eer iaret dnda bir yerlerde bu saynn gemesi
gerekirse diye her ardk 5 adet 1'den sonra bir 0 konulur, ve kar tarafta da bu sfr alnnca silinir. Dolaysyla ardarda 6 tane 1'in getii tek yer paket balama ve
biti iaretleridir. Bylece katman'n grevlerinden "paketleme" ksm hallolur.

Pakette alc ve gnderici adresi paketi gnderen cihazn ve hedef cihazn adresidir. Bu adreslerin akmamas iin tm dnyadaki cihaz reticileri her cihaza
kendilerine tahsis edilmi aralktan farkl bir adres verirler. Bu adresler 6 byte'tan oluur. Gnderici adresi her zaman bellidir, ama bazen alc adresi sadece 1'lerden
oluabilir: mesela yerel anzda belirli zellikte bir cihaz aryorsanz ve adresini bilmiyorsanz herkese sormak iin byle bir adresleme yaplabilir (rnein yeni
alan bir bilgisayar DHCP servisini ararken). Bu adresleme standard ile adresleme sorunu da hallolur.

Paketin kalan ksmnda dier paralardan ok daha uzun olan (1500 byte kadar) veri blou var. Bu bloun uzunluu hemen nndeki iki byte'lk ksmda
verildiinden veri blounun ba sonu bellidir. Onun arkasndan ise 32 bitlik bir paket kontrol ksm gelir. Buraya yazl olan say paketin oraya kadar olan
ksmndaki byte'larn tamamnn toplamdr (bu toplam 32 byte'tan daha bykse en soldaki fazla haneler atlr). Paket alan cihaz da ayn toplam hesaplayp
FCS/CRC ile karlatrdnda paketin herhangi bir biti parazit vb. yznden bozulduysa anlayabilecektir. Bu bize hatalar tespit etme imkan salar.

"Kontrol" ksmnda bir yerde tanan verinin cinsi belirtilir. rnein veri bir Internet Protocol (IP) verisi tayorsa kar tarafta buna gre bir veri yaps zmlemesi
yaplabilmesi iin bu bilgi gerklidir.

te yandan tespit edilen hatalarn giderilmesi daha karmak bir ilemdir ve "ak kontrol" protokolnn bir parasdr. Pakette "kontrol" diye iaretlenmi 16 bitlik
ksmn byk blm bu ii yapmak iin gerekli verileri tayor. Hata dzeltmesi yapabilmek iin cihazlar her muhatap cihazla ayr olmak zere gnderdikleri

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 4/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
paketlere paket numaras verirler. Bir paket hatasz alndysa kar tarafa paket numaras belirtilerek ACK (acknowledgement, onay) veya hata tespit edildiyse
NACK(not acknowledgement) bilgisi gnderilir. Btn bunlar "kontrol" ksmna kodlanr. Paket numaralar sayesinde, rnein karmak topoljiye sahip bir yerel
ada, paketler kark srada gelsede doru sraya sokulabilir.

Ak kontrolne gemeden nce bu ek verilerin getirdii yke gz atalm. Paketin ne kadar veri tamaktadr? Buna protokol verimlilii diyeceiz. Protokol
verimliliini hesaplamak iin veri alannn ortalama (vey sabit) uzunluu ile veri dndaki alanlarn (protocol overhead) uzunluklarn kullanrz. Yukarda
grdmz paket yapsn esas alrsak overhead 22 byte'tr. "veri" ksmlarnn ortalama uzunluuna n byte dersek:
protokol verimlilii = n / (n+22)

olarak hesaplanabilir. te yandan n saysn fazla da arttramayz nk o zaman da paketlerin hatal kma oran artacaktr.

rnek Bir iletim ortamnda herhangi bir bitin hatal olma olasl 10 4
olsun. 1500 byte'lk bir pakette en az bir bitin bozuk olma olasl nedir?

Bunu bir Bernoulli denemesi, ve p olaslk deerini p = 10


4
olarak dnrsek aradmz cevap: P = 1 (1 p)
1500
, yani P = 1 0.86 = 0.14 . Bu hi te
iyi grnmyor!

2.3.1 Ak kontrol

En basit ak kontrol "stop-and-wait", dur-ve-bekle protokoldr. Bu yntemde bir cihaz dier tarafa paket gnderdikten sonra paketin hatasz teslim alndna dair
onay bekler, ancak sonra dier paketi gnderir. Eer paket hatal cevab alr veya nceden anlalm bir sre (timeout) boyunca hi cevap alamazsa son paketi
yeniden gnderir (paketin ba-sonu, gnderici adresi, veya paket numaras okunamadysa timeout'a debilir!). Basitliine ramen nemli bir dezavantaj iletim
ortamnn uzun aralklar bota kalmasdr. Bunun tam deeri, yani "iletim verimlilii", "net veri ak hz" ile ortamn "iletim hz" karlatrlarak bulunabilir.
iletim verimlilii = net veri ak hz / ortam iletim hz

rnek 1000 m uzunluunda bir kablo ile 1 Gbps hznda veri iletimi yaplyor. Ortalama veri blou boyutu 900 bit ve paket verimlilii 90% olsun. Eer dur-ve-
bekle protokol kullanlyorsa net veri ak hz ne olur.

Paket verimliliine ve veri blouna baklrsa tm paketin ortalama boyu 1000 bit olmal. Bu paketin bir utan kmas 1000

1G
= 10
6
saniye alr. letim hzn 300.000
km/s olarak kabul edelim (bu ok kaliteli bir kablo kullanlyor demektir!). Bu durumda paketteki son bitin karya ulamas 1.000
= 0, 33.10
300.000.000
saniye srer.
6

Yani toplam paketin kar tarafa iletimi 1.33 mikrosaniye srd. Cevap paketi olduka ksa olacaktr (veri blou iermez), o yzden onun gelme sresine 0.33
mikrosaniye diyelim. Bu arada kar tarafn paketi kontrol etmesinin anlk gerekletiini varsaydk. Sonuta 900 bitlik veriyi toplam 1.66 mikrosaniyede sasalim
teslim etmi olduk ve ancak o zaman ikinci paketi gnderebileceiz. Dolaysyla bir saniye ierisinde gndereceimiz bit says: .900, yani 542 Mbps.
1
6
1.66.10

Dolaysyla 1 Gbps kapasiteli iletim ortamn yaklak yar verimlilikte kullanabilmi olduk.

stelik bunlar hesaplarken arada baz paketlerin bozulacan hi hesaba katmadk. Ayn rnei her bitin bozulma olasln p = 10 olarak alp 4

tekrarlayabilirsiniz. Bunu yaparken timeout sresi olarak 100 milisaniye aln, ve her 10 bozuk paketten birinin timeout'a dzeceini, dier 9'unun ret cevab alacan
farzedin. Yeniden gnderilen paketlerin hibirinin bozuk olmayacan varsayn.

kinci ak kontol "sliding window", "kayan pencere" yntemi. Bu yntemde "pencere" geriye doru belirli sayda (ve birden fazla) paketi ieren ve dikkatin
younlat blge anlamna geliyor. Bu yntemde rnein onay/ret cevab beklemeden 10 paket gnderiyoruz. Tabii bu arada 10 nceki paketin onay gelivermi
olabilir, bu durumuda pencereyi kaydrrz, ve bir paket daha gnderme hakkmz ortaya kar. Sonuta pencere dahilindeki eski paketlere onaylar geldike pencereyi
kaydrp alan haktan yararlanp yeni paketler gnderebiliriz. Ret cevab veya timeout yine olabilir.

Bu protokol ve yntemler fazla deitirilmeden kablosuz alarda da kullanlmaktadr. Ancak kablosuz sistemlerde ek olarak gvenlik ve ifreleme protokolleri
vardr. Telefon ve ADSL'de ise hatta bal sadece iki cihaz olduundan adresler gereksizdir. te yandan GSM'de dijital veri aktarm tamamen farkl bir adresleme
ve protokol gerektirir.

2.3.2 2. katman trafik kontrol


2. katman switch'ler: bunlar MAC adreslerine gre trafii snrlama ve ynlendirme iin kullanlr. Ayrca hub'lardan farkl olarak akmalar engeller ve ak
verimliliini arttrr.

2.3.3 Yksek hzda iletiim

15 milyonluk bir kentin yksek hzl dijital veri arterleri yukardakinden ok farl kriterlerle tasarlanmtr. "Frame relay" ve benzeri protokollerin kullanld bu
tasarmlarn bizim grdmzden temel fark paketlerin sabit byklkte olmasdr. Bu sayede paketin bann-sonunun tespit edilmesi ihtiyac ortadan kalkar.
Paketler sabit zamanda getiinden bu zaman aralklarna gre optimize edilmi yksek verimli elektronik devreler kullanlr. Ayrca hata kontrol yapacak zaman
yoktur. Bu yzden daha st katmanlarn (rn. IP: Internet Protocol) tekrardan hata tespit ve giderme ilemi yaptn greceiz.

2.4 Problemler
Problem 1 500 metre uzunluundaki bir kablodan 2 Gbps frekansta dijital veri gnderilmektedir. Ayrca her bir bitin bozulma ihtimali 10 'tr. (a) veriler kar uca
4

ne kadar zamanda ular?, (b) herhangi bir anda kablonun zerinde ka bit tanmaktadr? (c) n bitlik bir veri dizisinde hibir bitin bozulmam olma ihtimali nedir?
ve (d) c kknda hangi n says iin dizinin salam olma ihtimali %70 veya daha yksektir.

** zm **

Problem 2 1. problemdeki sistemde herbiri 1000 bitlik veri ieren ve yukarda verilen paket yapsna sahip paketler gnderilmektedir. Ayrca dur-ve-bekle ak
kontrol kullanlmaktadr. (a) protokol `overhead' ne kadardr? (b) protokol verimlilii ne kadardr? (c) hatalar gzard edilirse net veri ak hz nedir (ACK/NACK
paketlerindeki veri blounun boyutunu 0 olarak alabilirsiniz)? (d) c kkndaki sonuca gre iletim verimlilii nedir?

** zm **

Problem 3 Problem 2'de ak kontrol kayar-pencere olarak deitirilir ve pencere genilii 16 paket ise c ve d klarna verdiiniz cevaplar nasl deiir?

** zm **

3 Alar aras a: nternet'in ileyii


`Veri Balant Katman'nn ilevini "veri paketlerinin adresi belirli bir cihaza hatasz iletimi" olarak tanmlamtk. Szkonusu katman bu ilevi ancak hepsi ayn
fiziksel ortama bal cihazlar arasnda gerekletirebilir. Byle bir durum grece kk bir fiziksel alan ierisinde ayn kabloya bal veya kablosuz bir ortamdan

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 5/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
haberleen cihazlar arasnda, baka bir deyile "yerel a" ierisinde mmkndr. Ancak Dnya apnda bir iletiim imkan salamaz. Global bir iletiim sistemi veri
balant katman'nn zerine ina edilen "a katman" ile mmkn olur. Bunun gnmzdeki karl da "nternet"tir.

Daha nce bahsettiimiz trden standart ve protokoller nternet'in ileyiinde daha da nemli olur. letiimin her biiminde olduu gibi iki bilgisayarn iletiiminde
de en bata bir ortak dil gereklidir. A protokolleri ite bu ortak dili salar. Telin iki ucundaki bilgisayarlar ne kadar farkl model ve ileyite olsalar da ayn
protokol (ya da protokolleri) konutuklar srece iletiim mmkndr. nternet szkonusu olduunda cihaz eitlilii ok fazla ve ngrlemez olduundan
protokoller daha da nem kazanr.

Bu protokoller uluslararas aratrma komisyonlar tarafndan biimlendirilir ve son ekli verilir. Bir protokol bir kez kullanlmaya baland m hem a oluturan
elektronik cihazlar ve bilgisayar paralar, hem de bunlar kullanan bilgisayar programlar buna uygun yaplr. Bu yzden de protokolde deiiklik yapmak ok
zordur! A protokollerinin gelitirilmesi ve standartlamasnda etkili olan kurumlar arasnda IEEE (Elektrik ve Elektronik Mhendisleri Enstits), ISO
(Uluslararas Standartlar rgt), IETF (Internet Engineering Taskforce), ISC(Internet Standards Consortium) saylabilir. Gelitirilen bu standartlar RFC ad verilen
dkmanlarda resmi halleriyle yaynlanr. Burada ad geen RFC'lerin tamamna IETF web sitesinden(http://www.ietf.org/rfc.html) ulaabilirsiniz.

Ayn ilk bilgisayarn yapmnda, Alan Turing ve arkadalarnn 2. Dnya sava srasnda askeri istihbaratla ilgili olarak yaptklar aratrmalarn nc olmas gibi,
bilgisayar alar da askeri savunma amacyla 70'lerde yaplan aratrmalardan etkilenmitir. Bugn tm internet iletiiminde kullanlan temel protokol olan IP
(Internet Protocol) bu yllarda gelimeye balam, sonrasnda sivil iletiimde de yaygn olarak kullanlmtr. Bilgisayar ve internet'in hzla yaygnlamaya balad
90'l yllara gelinene kadar bu protokol defalarca yenilenmi ve drdnc versiyonu (IP4) yaygn olarak kullanlmaktadr (baknz RFC 791). Bu versiyon kk
eklentilerle ihtiyalara uydurulmu ama esasen gcnn snrlarna dayanmtr. rnein IP4 protokol tm dnyada 2 milyar civar bilgisayara adres verilmesine
izin vermektedir. Ancak kiisel bilgisayarlar ve aa bal dier cihazlarn saysndaki art bu snr oktan zorlamaktadr. Bu ve dier sorunlara cevap olarak IP'nin
altnc versiyonu gelitirilmitir. ok yaygn ve belirleyici bir standart olduundan bu protokoln yeni versiyonuna geilmesinde glkler vardr. Bugn yeni
retilen a cihazlar ve programlar protokoln hem 4. hem de 6. versiyonlarn ayn anda desteklemekte ve bu sayede gei yava ta olsa gereklemektedir.

3.1 Global iletiim yntemleri: Paket ve Hat Anahtarlamas Ayrm


Bilgisayar alarndan nce varolan iletiim yntemleri posta, telefon ve telgraf idi. Bilgisayarl iletiim k/elektrik hznda olmas dnda bunlarda yakn
benzerlikler gsterir.

Bu yntemleri iki snfa ayrabiliriz: paket anahtarlamal yntemler ve devre anahtarlamal yntemler. Posta sistemi birinciye, telgraf ve telefon ise ikinciye rnektir.
Devre anahtarlamas yntemi daha az karmak olduundan hzl iletiimde ilk kullanlan yntem olmutur. Bir kablolu telefon grmesini ele alalm. Eyp'teki bir
evden Ankara Bahelievler'deki bir evi aramak istiyoruz. Bunun iin birka tane telefon hattnn ucuca eklenmesi gerekir. Eyp'teki evden Kathane yerel telefon
merkezine bir hat, oradan stanbul telefon merkezine bir hat, oradan Ankara merkeze, oradan Bahelievler yerel merkeze, ve nihayet oradan arkadamzn evine.
stanbul ve Ankara arasnda mevcut binlerce hattan biri msaitse bu hatlarn hepsi birbirine eklenir ve evimizden arkadamzn evine bir kablo ekilmi etkisi
yaratr. Bu kabloyu oluturan hatlar konumamz bitene kadar bize tahsis edilmitir. Eskiden santral memurlarnn elle yapt bu hat birletirme ilemini artk dijital
anahtarlama cihazlar ok hzl olarak yapyor.

Bu tr bir hat anahtarlamas sisteminin en nemli avantaj oluan hattn tm veri kapasitesinin bize tahsis edilmi olmasdr. Bu yzden ses veya grnt iletimi
kesilme veya yavalama olmadan, belirli bir kapasite garantisiyle yaplabilir. te yandan ok ciddi dezavantajlar vardr. Geilerden herhangi birinde mevcut hatlar
o anda bakalar tarafndan kullanlmaktaysa bir hat oluturulamaz. Ayrca veri iletim kapasitesini deerlendirmeyen hatlarn kapasitesi bakalarnn iletiimine
aktarlamaz.

Buna alternatif olarak gelien paket anahtarlamas ise iletilecek verilerin paketlere blnp msait hatlardan geerek kar tarafa iletilmesine dayanr. Bu yntemde
hibir hat srekli olarak megul edilmediinden toplam trafik msait hatlara dalarak kar tarafa doru akar. Ancak kullanmn you olduu anlarda veri
paketlerinin trafie taklp gecikme riski vardr. Yine de byle bir sistemde kapasiteyi ynetmek (yapm ve almas daha karmak olsa da) ok daha kolay
olmaktadr.

Paket tabanl ynteme rnek olarak posta sistemini gsterebiliriz. Posta sistemi yzyllar boyunca gelierek karmak ve iyi alan bir paket anahtarlama sistemine
dnmtr. Bunun nasl altn soyutlamak iin bir mektubu ele alalm. Zarf zerinde gnderici ad ve adresi, alc ad ve adresi, bir de postaya verildii tarih
bulunur. Zarfn iine sacak sayfa miktar snrldr. Bu zarf postaneye teslim edildikten sonra birok elden geecek ve her seferinde alc adresine baklarak o
yndeki posta merkezine doru ilerleyecektir. Verilen adreste alc bulunamaz yada belirli bir sre ierisinde zarf teslim edilemez ise geri dner (ya da PTT'de
kaybolur!).

3.2 nternet Protokolne bir bak


nternet'in temeli olan IP (Internet Protocol) iletiimi de paket tabanl olup tamamen zarf rneine benzer. Basitletirilmi bir IP paketine gz atalm:
Gnderici: TCP:2056
Gnderici adresi: 194.27.145.72

(Gnderme Tarihi yerine) yaam sresi: 10

Alc: TCP:25
Alc adresi: 212.175.10.5

erik:
RFC822 uyumlu eposta gnderisi:
konu: nemli duyuru
ekler
vesaire...

Burada alc ve gnderici adresleri birer bilgisayara aittir, ve internet sisteminin postaclar olan 'router'lar (ynlendiriciler) bu saylara bakarak paketi bilgisayara
ulatrrlar. Bu adreste (bilgisayarda) alan pekok program arasndan biri, pakette TCP:25 olarak belirtilen alcdr. Eer gerekten byle bir alc program mevcut
ise paket yerine ular, aksi takdirde gndericiye cevap olarak hata mesaj tayan bir baka IP paketi gidecektir. Posta sistemindeki tarih damgas yerine IP
paketlerinde yaam sresi (TTL: Time To Live) sayac bulunur. Paketin getii her router bu sayac bir eksiltecek ve saya sfra dayannca paketin hedefine
ulaamayp ortalkta kalabalk yarattna kanaat getirilip pe atlacaktr. Baz paketler kaybolabilir veya bir zarfa smayabilir. Bir baka sorun da ayn
gndericiden ayn alcya gnderilen birsr paketten, sonra gnderilenin ilk gnderilenden nce yerine ulamas durumudur. Dinamik ve karmak bir sistem olan
internette bu son derece mmkndr.

Interneti oluturan elektronik sistemler paket tabanl bir a iletiimi kullanmaktadr.znde bu sistem devre tabanl, sral iletiimi desteklemez. Bu destei salayan
TCP protokoldr (Transmission Control Protocol, RFC 793). Bu protokol IP'nin salad imkanlar kullanarak iki i grr: (i) Byk verilerin IP zarflarna sacak
paralara ayrlp paralarn numaralanmas, ve (ii)Kar uta sras karan paralarn dzenlenmesi, kaybolan paralarn gndericiden yeniden istenmesi ve nihayet
doru srada alcya teslimi.

Yukardaki rneimizdeki alc ad TCP:25 idi. Buradaki say TCP port numarasdr. IP'nin stnde, ondan servis alan protokoller olarak TCP ve UDP standartlar bu
port numaralar ile "bilgisayar ii" bir adresleme yaparlar. TCP/UDP bu ekilde 2**16 (65536) adet port kullanmna imkan verir. Yani ayn adreste ok sayda
programn sunucu ya da istemci olarak almas mmkndr. Herbiri kendi portunu kullanr. Birok port numaraszellemi uygulamalara tahsis edilmitir.
rnein 25 numaral port her zaman eposta sunucusuna aittir. Bu sunucuya gnderilen verilerin, epostalarn formatn belirleyen RFC822 standardna uygun olmas
beklenir. Benzer ekilde web sunucusu da 80 numaral portu kullanr ve anlad dil HTTPdir (HyperText Transfer Protocol, RFC2616). Hangi portun hangi ileve

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 6/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
tahsis edildii IANA (Internet Assigned Numbers Authority) tarafndan belirlenir. IP'nin stne ina edilen protokoller silsilesi ksaca ekilde gsterilmitir (kaynak
RFC 791):
+------+ +-----+ +-----+ +-----+
|Telnet| | FTP | | TFTP| ... | ... |
+------+ +-----+ +-----+ +-----+
| | | |
+-----+ +-----+ +-----+
| TCP | | UDP | ... | ... |
+-----+ +-----+ +-----+
| | |
+--------------------------+----+
| Internet Protocol & ICMP |
+--------------------------+----+
|
+---------------------------+
| Local Network Protocol |
+---------------------------+

Protocol Relationships

Standartlarla ilgili yukarda bahsettiimiz kstlamalar sadece bir kurum iinde kullanlan yerel alarda bu kadar sert deildir. Yerel iletiime dahil olan ve internetle
ilikisi olmayan bilgisayarlar kurumun sistem yneticisi tarafndan birbirine uyumlu ekilde ayarlad srece, standart d protokoller kullanlabilir. Hem bu adan
hem ileyi asndan yerel alarda daha geni bir hareket ve konfigrasyon serbestisi vardr. Bu alara LAN (Local Area Network) ya da Intranet diyoruz. Adndan
anlalaca zere IP, internet'in standart protokoldr. Yerel alarda da kullanlr ama temel baz farklar olabilir.

Eer evinizde kablonet ya da telefon modem balants kullanyorsanz dorudan bir internet adresine sahip olursunuz. Balant kurduunuzda servis salaycnz
(Trk Telekom ya da Superonline) size kendisine ayrlm IP adreslerinden birini tahsis eder ve balanty kesene kadar bu adresi kullanrsnz. Daha sonraki bir
zaman ayn adres baka bir mteriye tahsis edilebilir. Buna dinamik IP adreslemesi diyoruz. Kurumsal kullanclar ise bunun yerine statik IP kullanr. Adresleri her
daim sabittir. Statik IP'nin avantaj sunucu uygulamalarnda ortaya kar. rnein bir eposta sunucusu altrmak iin statik IP adresine ihtiyacnz olacaktr. yle ki
adresiniz internet adres rehberlerinden bulunabilsin. Srekli adres deitiren birine posta gndermek imkanszdr!

Adres rehberinden kastmz DNS sistemidir (Domain Name System). Bu sistem znde nmerik ve hatrlamas zor IP adresileri yerine anlaml isimler kullanmamza
olanak verir. Siz 'cs.bilgi.edu.tr' ya da'ttnet.gov.tr' adresini verdiinizde ona karlk gelen IP adresi DNS sunucularna(NIC:network Information Centre) sorarak
bulunur. Eer web sunucusu ya da eposta sunucusu altrmak isteyen bir kurumsanz, sizin de Trkiye DNS koordinasyon merkezi olan Orta Dou Teknik
niversitesi'nden (www.nic.tr) bir alan ad satn almanz gerekecektir.

Bilgisayarnzn DNS sisteminden yararlanmas iin bu servisi hangi sunucudan alacan bilmesi gerekir. Kablonet kullanrken bilgisayarnz bu bilgileri, IP
adresiyle beraber otomatik olarak servis salaycnn sunucusundan edinir ve kullanr. Modem ve telefon hatt kullananlarn ise bunlar sisteme tanmlamas gerekir.
Gnmzde internet eriimi iin kullanlan teknolojiler eitlenmitir. Bir cep telefonu, telsiz modem, ya da amatr radyo ekipman ile de internete balanmak
mmkndr. Telsiz yntemlerin tek fark iletiimin bir bakas tarafndan dinlenmesi tehlikesidir. Ancak bu tehlike btn yntemlerde mevcuttut. IP paketlerinizin
dolam esnasnda istenmeyen kiilerin eline gemesi tehlikesi her zaman vardr. Bu yzden eriim iin kullanlan ekipman ne olursa olsun dorudan internete bal
kullanclar iin gvenlik riskleri vardr. Bu sorunu gidermek iin pek ok program ifreleme yntemlerinden yararlanr.

3.2.1 Yerel a (Intranet)


Yerel alardaki durumu internet'ten ayran temel baz unsurlaryle sralayabiliriz:

1. Daha gvenli bir ortam szkonusudur. Kurum iindeki (niversite, irket ya da internet kafe) bilgisayarlar sistem yneticisinin kontrol altndadr ve
kullanclardan dmanca davran beklenmez.
2. Yerel alarda IP protokol kullanlmasna ramen IP adreslerinin sadece kurum iinde bir anlam olmas yeterlidir. nternete dorudan bal bilgisayarlarda
olduu gibi bu adreslerin yetkili kurumlar (servis salayclar) tarafndan tahsis gerekmez. Ancak bu bilgisayarlarn internete erimesi gerektiinde internete
bal olan tek bir bilgisayar (gateway: gei kaps) adres dntrme ilemi (NAT:Network Address Translation) yaparak karkl nler.
3. Internette IP paketleri sadece alcsna gnderilirken, yerel alarda, kullanlan cihazlardan kaynaklanan farkl bir ileyi vardr. Yaynlama (broadcast) yntemi
kullanlabilir. Bu yntemde bir veri paketinin kopyalar kurum iindeki btn bilgisayarlara (ya da bir grup bilgisayara) ular. Alc adresi hangi bilgisayara
uyuyorsa o bilgisayar bu paketi iler, dierleri ise kendilerine gelen kopyalar pe atar. Buradaki gvenlik meselesi bir yanyla yaynlama yntemi ile
yakndan ilikilidir. Hub ad verilen cihazlar yaynlama yntemi kullanr. Biraz daha pahal olan 3. katman ve 2. katman switch'ler yaynlama
yapmadklarndan daha gvenlidirler. Dier gvenlik meselesi ise internet'ten yerel aa szmalarn engellenmesidir. Bunun iin firewall (ateduvar) kullanlr
ve internet ile yerel a arasnda gidip gelen paketler sk kontrolden geirilir. Genellikle yerel a ile internet arasnda duran bir sunucu hem firewall ilevi
grr hem de adres dntrme ve internete k salar. Bu ekilde bir gateway/firewall kombinasyonu olduka yaygndr..

Yerel ada IP adreslerinin datlmas ve cihazlarn MAC adresleriyle IP adreslerin eletirilmesini otomatikletirmek amacyla ARP (Adress Resolution Protocol)
ve DHCP(Dynamic Host Configuration Protocol) servisi kullanlr. DHCP servisi kablonet kullanclarna verilen servisin aynsdr. Tek farkla ki verilen adresler
sadece yerel ada geerlidir. Kk ve orta byklkte yerel alarda tipik olarak DHCP servisini veren sunucu gateway/firewall sunucusudur.

Baz durumlarda kurumun bir yesi uzaktan bu aa erimek ister. Oysa ate duvar bu eriimi engeller. Bunun iin zel dzenlemeler gerekecektir. Ska rastlanan
bir ihtiya ta kurum iindeki sunuculardan birinde kurumun web sitesinin ve eposta servisinin altrlmasdr. Bu durumda da ate duvarn adres dntrme
servisine bu eriime izin verecek ekilde dzenlemek gerekir.

3.3 nternet Protokolnn leyii


nternet szc inter-network yani "alar-aras-a" anlamna geliyor. Veri letim Katmanndaki protokoller yerel alarn kurulmasna imkan verir. nternet
protokol ise byle yerel alar arasnda veri iletimini salamak iin tasarlanmtr. Bunun iin kresel bir adresleme sistemi ierir. Bu adresleme sistemi o denli
kullanldr ki nternet'i yerel a iindeki iletiimde de adresleme iin kullanyoruz. Bylece her trl bilgisayarlar-aras iletiim, yerel veya global, tek bir
adresleme ve iletiim protokol ile salanmakta ve yazlm katman asndan bu ok pratik olmaktadr.

Bugn 6. versiyonu tasarlanm ve yava yava uygulamaya alnmakta olsa da nternet protokolnn ileyiine dair u an kullanlan 4. versiyondaki tasarm unsurlar
fazla deimemitir (bkz (Postel 1981). Bu tasarm souk sava dneminde (1980'lerin ba) yaplmt, ve tasarm finanse eden ABD askeri kurumlarnn ncelii
"ksmen tahrip olsa bile" iletiime imkan verecek dayankl bir iletiim a ina etmekti. Bu yzden nternet merkezi olmayan, paralar deise bile yeni a yapsna
uyum salayabilen bir tasarma sahiptir. Ayrca yine tasarland dnemde yaygn ideolojik eilimleri yanstr biimde eriimi herkese ak ve kstlanmas zor bir
iletiim sistemidir (tasarmdaki bu tonlama iin bkz (Licklider and Taylor 1968)).

3.3.1 Adresleme

Protokoln temel amac kresel lekte bir adreslemedir. Bunun iin 4 byte'lk (rn. 194.27.149.195 gibi) gnderici ve alc adresleri kullanlr. Bu adresler blok
olarak uluslararas ve ulusal ajanslar tarafndan tahsis edilir. rnein Trk Telekom gibi byk bir servis salayc A veya B snf diye anlan 2 veya 2 farkl
24 16

adres ieren bir blou alp kullanclarna/mterilerine tahsis edebilir. Geerli adreslerin tahsisi merkezi olarak yaplan tek ilemdir. Bu sayede rnein 194.x.x.x
eklinde bir adrese gidecek paketlerin Trkiye'ye doru giden bir kabloya aktarlmas gerekleebilir. Dolaysyla bu adresler posta sistemindeki lke+posta kodu
gibi, corafi hedefi kabaca gsteren adreslerdir. Noktasal hedef bulma ise yerel an yerine getirmesi gereken bir grevdir.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 7/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
Trafiin ileyiine bir rnek olarak RFC 791'den uyarlanan u senaryoya bakalm:
Application Application
Program Program
\ ARACI (ROUTER) /
Internet Module Internet Module Internet Module
\ / \ /
LNI-1 LNI-1 LNI-2 LNI-2
\ / \ /
Local Network 1 Local Network 2

Burada bir bilgisayar program uzakta, baka bir yerel adaki bir bilgisayar programna veri gndermek istiyor. Bu veri nce k bilgisayarndaki iletim sisteminin
nternet katmannda paketleniyor. Bu pakette gnderici, alc adresleri, ve iki uygulamann dei-toku etmek istedii veri var (baka birok paraya biraz sonra
deineceiz). Ancak bu alverite akll bir arac (Router/Ynlendirici) gerekiyor. Bu aracnn zellii (i) birden fazla yerel aa bal olmas, yani yerel alar st
bir konuma ve baka sahip olmas, ve (ii) paketi alc adresine ulatrmak iin adrese bakarak bal olduu hangi yerel aa paslayacan bilmesi. Bizim basit
rneimizde ynlendirici sadece iki yerel aa bal, ama gerek senaryolarda daha fazla olabilir. Ynlendiriciler ve yerel alar arasndaki bu balantlarn tm
nternet'in yapsn oluturur. Bu yapnn 1999 ylndaki halinin The Internet Mapping Project'ten alnm bir grseli ekilde verilmitir (kaynak:
http://cheswick.com/ches/map/).

nternet'in yaps

Paket datm srasnda paket her yerel aa girerken veri iletim katman dzeyinde paketlerin. IP paketinin tamam, veya para para olarak bir ethernet paketi iine
yklenir. rneimizde iki kez bu paketleme-ama-birletirme ilemi gereklemektedir. Gnderici bilgisayar bu paketi yerel ada hangi router'a gndereceini, yani
router'n -yerel ada geerli- IP adresini bilmelidir, ki bu bilgi genellikle her bilgisayara yerel aa ilk baland srada DHCP protokol yardmyla verilmektedir.
veri iletim katmanna gei srasnda yerel bir IP adresinin hangi MAC adresli cihaza denk dtn anlamak iin ARP (Address Resolution Protocol) kullanlr. Bu
protokol iki katman arasnda yer almaktadr diyebiliriz.

3.3.2 Paket trafii ve kayplar


IP tasarm karmak bir sistemi hedefledii iin baz kritik tasarm kararlar verilmitir. IP protokol paketlerin yerine ulaacan garanti etmez. Paketlere bir trafik
sayac (Time-to-live) konulur. Her router'dan geite bu saya eksiltilir ve sfra ulatnda paket hala yerine gitmediyse imha edilir. Bylece u ya da bu sebepten

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 8/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
geersiz bir adrese gnderilmi, veya gidecei yol tkal olan paketler uzun sreler ortalkta dolap veri kapasitesini yemezler.

IP protokol paket datmn garanti etmedii gibi paketlerin ayn yoldan ve gnderildii srada gitmesini de garanti etmez. Dolaysyla buna ihtiya duyan, daha st
katmanlarda yeralan "kullanc protokoller" bu sorunlar kendileri halletmek durumundadrlar. leride greceimiz gibi szkonusu bu protokollerde veri iletim
katmann grdmze benzer ak kontrol, hata tespiti ve giderilmesi gibi unsurlar yeralacaktr.

Ayrca IP protokol heterojen bir sistemde almaktadr. ki yerel a geii srasnda kullanlan fiziksel ortamlar biribirinden farkl paket byklklerini destekliyor
olabilir. Bunun iin IP protokol paketleri paralamaya (fragmentation) uygundur. Herbiri farkl bir IP paketine yklenen ve para numaras verilen paralar yollar
zerindek, bir sonraki router'a eksiksiz ularsa tekrar birletirilirler. Yollar zerinde benzer durumlarda tekrar, farkl ekillerde paralanp birletirilebilirler.

3.3.3 Datm kalitesi


Farkl uygulamalar farkl datm kalitesine ihtiya duyabilir. e-posta gnderirken paketlerin hzl gitmesi gerekmez. Ama rnein VoIP (Voice over IP) gibi gerek
zamanl iletiim uygulamalarnda buna ihtiya duyulur. IP protokolnn paket yaps bu tr datm kalitesi taleplerini yazmaya uygundur. Ancak bunlara paketin
yolu boyunca her router tarafndan ayn ekilde riayet edileceinin garantisi yoktur. Bu tr kalite talepleri gree daha kontroll yerel veya kentsel alarda anlamldr.

3.3.4 Gvenlik, Gizlilik, ve sanal zel alar (VPN: Virtual Private Networks)

nternet'in sadece byk devlet kurumlar ve niversiteler arasnda bir a olmaktan kmasyla beraber kt niyetli kullanclarn varl ve saldrlar bir sorun
olmaya balamtr. Sonradan yaplan protokol eklemeleriyle (RFC 2401) IP protokolnde ifreleme benzeri gvenlik nlemlerinin nasl kullanlaca belirli
standartlara balanmtr. Bu teknikler ihtiyaca gre paketin imzalanmas, ifrelenmesi, ve en nihayet tm paketin ifrelenip baka bir pakete konulmas gibi farkl
seviyelerde gvenlie izin verirler. Bu gvenlik tekniklerini ileride ayrca ele alacaz.

3.3.5 IP Paket Yaps


IP protokolnn yukarda bahsedilen ileyii iin tasarlanm paket yaps aada verilmitir (kaynak: RFC 791). Bu yap bir IP paketinin tayaca verinin inne
balk olarak konulmaktadr.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

U S E R D A T A

Protokol versiyonunu takip eden IHL (Internet Header Length) 32 bitin katlar olarak paket balnn boyunu syler. Bu yzden gerekirse baln sonunda 32'nin
katlarn tamamlayacak ekilde doldurma (padding) bulunabilir. 32'nin katlar kstlamas bu paketin sadece balk ksmyla ilgilenen yksek hzl nternet altyap
cihazlarnn elektronik tasarmn kolaylatrmak iin dnlmtr.

Type of Service ksm arzu edilen paket datm kalitesini ifade etmek iin kullanlr (detaylar iin bkz. RFC 791).

Total Length ksm paket bal ve kullanc verisi (USER DATA) dahil paketin tm boyutunu, byte cinsinden syler. Bu ksma 2 16
1 'e kadar bir say
yazlabilmesine ramen uygulama pratiinde 576 byte bir st snr olarak kullanlmaktadr.

Identification, Flags ve Fragment Offset ksmlar bir paketin getii farkl balantlarda paralanp tekrar birletirilmesi gerektiinde kullanlr. Kabaca sylersek
paralanacak pakete bir numara verilir (identification), paralarn herbirinin yeri belirtilir (offset) ve bu sayede birletirme mmkn olur. Kullanc protokol
paralamaya izin vermiyorsa (flags) ve bu byklkte paket yolu zerinde iki router arasndaki balantdan geemiyorsa pe atlr.

Time to Live ksm paket datm bahsinde anlattmz sayac ierir. Buraya konulacak deer router'larn politikasna gre bir st snrdan kesilebilir. Her router'da
bir eksiltilir, ve sfra ulanca paket hala yerine ulamadysa imha edilir.

Protokol ksm IP paketinin tad kullanc verisinin hangi st dzey kullanc protokol (mesela TCP, UDP gibi) yapsna sahip olduunu syler. Bu bilgi paketin
tanmas iin deil, ama kar tarafa bir kez ulatnda nasl okunacann anlalmas iin gereklidir.

Header Checksum daha nce veri iletim katmannda grdmz gibi hata tespiti iin kullanlr. Buradaki checksum sadece balk ksmnn hata tespitine yarayan
16 bitlik bir CRC bilgisidir, ve paketin hareketi srasnda Time-to-Live gibi balk alanlar deitike yeniden hesaplanr. Tanan verilerde oluacak hatalarn tespiti
kullanc protokole devredilmitir. IP protokol bu konuya hi karmaz.

Source ve Destination adresleri gnderici ve alc adresleridir. Gnmzde nternet'e bal cihazlarn saysnn ok aratmasyla beraber bu tahsis edilen alana san
adres says yetersiz kalmaya balamtr. IP'nin 6. versiyonunda 128 bitlik adresler ngrlmtr.

Options ksm zellikle gvenlikle ilgili seenekleri belirtmek iin kullanlr. Standart seenekler IP protokolnn arkasndan yaynlanm baz ek standartlarla
belirlenmi/belirlenmektedir. Bu seeneklerden bir tanesi paketin yolda nerelerden getiini kaydetmek (ki bu trafik durumunun anlalmasnda nemlidir) veya
belirli bir yoldan gitmesini talep etmek iin kullanlmaktadr.

3.4 ICMP (Internet Control Messaging Protocol)


Bu protokol zellikle arac/router'larn biribiriyle iletiim kurarak trafik younluunu, belirli alc adreslerine ariim salayp salamadklarn sorgulamak iin
kulland protokollerin en nemlisidir. Bir ICMP paketi yukarda grdmz IP paketinde "protocol" numaras olarak 1 yazarak oluturulur.

ICMP ile yaplan ilemlerden biri olan ve "ping atmak" diye tabir edilen ilem iki router arasnda paket geli gidiinin ne kadar srdn lmek, ve dolaysyla
trafik kalitesini belirlemek iin kullanlr. Ayn ilem srasnda paketin arada getii router'larn adresleri de kaydedilerek `yerel' evredeki nternet yaps
kefedilebilir. Router'lar tm bu trden verileri toplayp deerlendirerek hangi adrese giden paketi hangi komu router'a gndereceklerine anlk karar verirler.

ICMP protokolnn programlarda kullanm aadaki Java kodunda rneklenmitir:


/**
* Resolves a given host name and tests whether it is reachable.
* This code demonstrates use of Internet addresses, name resolution, and

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 9/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
* reachability tests which uses IP, DNS, and ICMP protocols underneath.
*
* Author: Mehmet Gener, mgencer@cs.bilgi.edu.tr
*/
import java.net.*;

class IP {
public static void main (String[] args) {
String host="";
try {
host=args[0];
}catch(Exception e) {
System.out.println("Usage:\n IP hostname");
System.exit(1);
}
int timeout=3000; //in milliseconds
InetAddress address;
try {
address=InetAddress.getByName(host);
System.console().format("Address of the host %s is %s\n",
host,address.getHostAddress());
if (InetAddress.getByName(host).isReachable(timeout))
System.out.println("The host is reachable");
else
System.out.println("The host cannot be pinged!");
}catch(Exception e) {
e.printStackTrace();
}
}
}

3.5 nternet Altyap Cihazlar: Layer 2 ve 3 switch


nternet protokol OSI katmanlar arasnda 3. katmana karlk gelir. P paket balklarn okuyabilen ve buna gre trafii ynlendirebilen cihazlara da Layer 3
switch/anahtar ad verilmektedir. Bu cihazlarn bir ksm yerel alarda, Layer 2 switch'lerle (veri iletim katman ve MAC adreslerini okuyup ona gre ilem yapan
anahtarlar) beraber ie koulurlar. rnein evlerimizdeki ADSL modemler layer 2 switch ilevi grrler, belirli MAC adreslerinin iletiimine izin verip dierlerini
kstlayabiliriz. Kurumsal alarda kullanlan daha gelikin cihazlar hub'larn neden olduu "collision"lar engeller. Bu cihazlar her veri iletim paketini yaynlamaz,
sadece muhatabna gnderir. Layer 3 switch'ler de benzer ekilde IP adreslerine gre trafik ynlendirmesi yaparak yerel trafii rahatlatrlar.

Layer 3 switch'lerin farkl becerilerde olanlar yerel alarda router ilevi grr veya router ile ayn cihazda btnleik olarak alabilirler. Bu dzeydeki cihazlar
yetkin bir programlama arayz ile kontrol edilirler.

3.6 Ateduvar (Firewall)


Ateduvar/Firewall bir yerel a ile nternet arasndaki trafii kstlayan, snrlayan, ve takip eden sistemlerin genel addr. Kimi zaman (grece kk alarda) layer
3 switch ve router ile btnleik bulunur. Kimi zaman zellemi bir cihaz, kimi zaman ise standart donanm zerinde koan bir yazlmdr. Firewall layer 3 ve 4'
beraber ele alr, yani trafik kstlamalar IP paketinin yansra TCP/UDp paketlerine de dayandrlabilir. Genellikle dardan yerel aa gelen trafik ciddi ekilde
kstlanr: sadece kamuya ak web ve e-posta sunucusu trafii, ayrca ierideki kullanclarn istedii paketlerin giriine izin verilir. Darya k kstlamalar biraz
daha gevektir.

ou firewall, zellemi cihazlar dahil, BSD Unix ve/veya Linux sistemlerinde standart olan iptables tr yazlmlar kullanr. Bu yazlmlar gnderici/alc IP
adresine gre, TCP/UDP port numaralarna gre trafie izin verme, engelleme, ve/veya kaydn tutma imkan tanrlar. Ayrca veri kapasitesini kullanclara eit
kullandrma gibi ilemlere imkan verirler. zel bir protokol veya standartla ilikili olmasa da firewall, onun yazlmlar ve pratikleri a ynetiminin temel bir
parasdr.

3.7 Okuma nerileri


http://www.warriorsofthe.net/

http://www.ietf.org/rfc/rfc791.txt

4 Soket Programlama ve Program/Sre Modelleri


lk kez 1983'te retilen ve BSD Unix iletim sisteminin bir paras olan a programlama kitapl ve bununla btnleik alan iletim sistemi ilemleri arayz
gnmzde de hemen tm iletim sistemlerinin neredeyse birebir takip ettii bir fiili standart olmutur. Berkeley sockets adyla anlan bu kitaplk genel olarak
sreler-aras iletiim (inter process communication) meselesini hedef alr. Szkonusu sreler ayn sistem zerinde veya farkl sistemlerde olabilir. Dolaysyla bu
soketlerin salad programlama arayz hem ayn bilgisayarda hem de uzaktaki bilgisayarlarda alan iki srecin haberlemesinde kullanlr, ve bu ikisini
programclar ok benzer bir arayzle sunar. Bu blmde anlattklarm neli lde BSD soket kitapl klavuzlarndan yararlanmtr
(http://docs.freebsd.org/44doc/psd/20.ipctut/paper.pdf).

Soket arayznde iki sre arasndaki iletiim olabildiince yerel bir dosyadan veri okuma/yazma iletiimine benzetilmitir. letim sistemi paylalan nesneler olan
dosyalara veri okuma/yazma ileminde kontrol elinde tuttuu gibi soketlerde ve dolaysyla a iletiiminde de ayn eyi yapar. Dosyay okumak/yazmak iin aan
bir srece verilen "tantc" (file descriptor) gibi soket aldnda da bir tantc verilir. Bu tantc iletim sisteminin ilgili okuma/yazma ilemleri iin tuttuu
kaytlara ulamasn salamaktadr. Dolaysyla ikisi de bir girdi-kt (I/O) ilemi olan dosya ve a veri alverii iletim sistemi ve onun mterisi sreler asndan
ou ayn temel mekanizmalarla halledilir. Hatta kimi durumlarda sreler-aras iletiim, yani IPC (Inter Process Communication, IPC), gerekten dosya sistemi
zerinde bir dosyann yardmyla da gerekleebilir. Byle bir durumda bu iletiimde kimin okuma/yazma haklar olduuna da iletim sisteminin bununla ilgili
eriim hakk kontrol bilgileri marifetliyle karar verilir.

Soketler ve dosyalar arasndaki en bariz farklardan biri beklemeyle ilgilidir. Bir dosyadan okuma yapacaksanz sistemin ykne gre ksa bir sre bekleyebilirsiniz.
Ancak adan okuma yaparken yeni veri gelip gelmeyecei ve ne kadar uzun srecei belirsizdir. Bu yzden I/O mekanizmalar IPC iin adapte edilirken okuma
ilemine bir zaman am (timeout) opsiyonu konulmutur, ki talebi yapan sre belirli bir sreden sonra okuma gereklemezse srekli beklemede kalmasn.

4.1 Sreler ve tantclar


letim sistemi zerinde almakta olan bir srecin sistemle tm ilikisi tantclar zerinden gerekleir. Dier srelerle ilikisi de iletim sistemi zerinden
getiinden tantclara bamldr. Ses ve grnt, sistem saati, dosya sistemi gibi hereye tantclarla eriilir. Dosya sistemi de bunlarn birou iin eriim
kapsdr. rnein /dev/block/sda blok eriime izin veren bir tr I/O olup sabit diske karlk gelir. Buna karlk /dev/video0 birinci grnt kartna eriimi salar,
vb.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 10/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
Bir sre btn bunlara erimek iin iletim sistemine erimek istedii eyi belirtip ondan bir dosya tantc (file descriptor) alr. Python ile bir rnek verirsek:
fd = open("somefile.txt","a")

Eer srecin szkonusu dosyaya yazma hakk varsa ve u anda dosyay yazma amal am bulunan baka sre yoksa komut baaryla tamamlanabilir. "fd"
program asndan olaylarn grnmdr. letim sistemi ayn tantc iin kendince kaytlar tutar, rnein yazma/okum ilemlerinde tamponlar (buffer) kullanr.
"fd" esasen bir tamsay deerdir ve bu kaytlara verilmi bir etikettir (etiketler tekrar kullanlr, o yzden tantc takibini iyi yapmayan programlar umulmadk hatalar
alabiliyor). Ayrca yukardaki rnekte tantcnn sahibi sre ii bitip tantcy kapatana kadar bu dosya iin baka srelerin "yazma" ilemi amacyla istedikleri
tantclar vermeyi reddedecektir. letim sistemi ayn anda belli bir saydan fazla tantcnn takibini yapmaz (nk herbiriyle uramak tamponlar iin bellek ve
CPU gc ister). Bu st snr sistem ayarlarna gre deiir ve sistemin "kmemesi" iin ayarlanr.

Elde edilen tantc belirli ilemlere izin verebilir. rnein yukardaki tantc "yazma" ilemine izin verir ama "okuma" ilemine vermez. Okuma amal bir tantc
bir dosyaya eriiyorsa geriye veya ileriye zplamaya izin verebilir, ama rnein mikrofondan ses sinyalleri okuyorsa geriye gitme ilemine izin verilmez. A iletiimi
de dosyalardan farkl olarak geriye ve ileriye zplamaya izin vermez. C, Python, ve Java gibi dillerin I/O kitaplklar iletim sisteminin arayz ile ekillenmilerdir
ve biribirine benzerler. Bir rnek olarak Python'un arayzne gz atabilirsiniz: http://docs.python.org/3/library/io.html#io.IOBase . letim sisteminin kontrolndeki
her srece terminal girdi kts iin stdin, stdout, ve stderr isimli tantclar balar balamaz salanr.

4.2 Pipe-Kanal
Kanal tek ynde veri akna izin veren bir mekanizmadr. Aadaki bileik komutu gznne alalm:
ls | grep Videos

Bu komut iin Linux iki sre birden balatacak (iki program altrlyor), ve geici olarak bir kanal yaratp birinci komutun ktsn (stdout) ikinci komutun
girdisine balayacak. Srelerden biri sonlannda kanal da yokedilir.

Bu tr bir kanal dosya sistemi zerinde u kabuk komutu ile aka da yaratlabilir:
$ mknod /tmp/mypipe1 p

imdi ilk komutun yerine unu yazabiliriz:


$ ls > /tmp/mypipe1 & grep Videos < /tmp/mypipe1

Aradaki tek fark kullanlan kanaln geici deil kalc, zaten varolan (ve u anda bakasnca kullanlmayan!) bir kanal olmasdr. sterseniz byle bir kanal Python
veya baka bir dildeki programda, standart bir dosya gibi aabilirsiniz. Tek fark (1) sadece bir sre okuma iin aabilir (normal bir dosyada yaplabilirdi), (2) elde
ettiiniz tantc geriye veya ileriye zplamaya izin vermez, ve (3) yazmak iin am bir sre olmadan okumak iin ama ilemi ileri gitmez:
fd = open("/tmp/mypipe1","r")

Bu sre beklemede kalacaktr. Baka bir zreten yazma iin an:


fd = open("/tmp/mypipe1","w")
fd.write("hello")
fd.flush()

imdi okuma srecinde okuma ilemi yapabilirsiniz:


fd.read(5)

Linux sistem programlarnda tipik bir kullanm ekli bir srecin nce bir geici kanal yaratp sonra ikinci bir sre balatp bu kanal zerinden iki srecin
haberlemesiydi. Python ile rneklersek:
#!/usr/bin/python3
import os
r,w = os.pipe()
reader=open(r)
writer=open(w,"w")
if os.fork() == 0: # yeni/child
print("Child have read:",reader.read(5))
else: # eski/parent
writer.write("hello")
for x,xname in [(reader,"reader"), (writer,"writer")]:
print(xname+" is readable?",x.readable())
print(xname+" is writeable?",x.writable())
print(xname+" is seekable?",x.seekable())

Burada fork() ile iki sre yaratldna dikkatinizi ekerim. Elbette tek srele kanal hem yazp hem okuyabilirdik, ama bunun anlaml olduu bir programlama
problemi dnmek zor.

Yukardaki rnek programmz esasen birbiriyle haberleen ikisi de tek-izlekli iki sreten olumaktadr. Kalc/ak olmayan, srece ikin bir kanal kullanld iin
bir fork() ilemi yaplyor, ancak kalc bir kanal kullanlsayd buna gerek kalmayacakt, ve kanaln iki tarandaki sreler ayr programlar altrlarak
yaratlabilirdi. Bu sre modelini grselletirirsek:

Sre modeli 1: tek tarafl konuan iki sre

4.3 Soket-ifti
ki sre arasnda yazma/okuma asimetrisi yerine ikisinin de karlkl veri gnderip ald bir durum dnelim. Bunun iki tane tek ynl kanal birletirerek
yaplabileceini dnebilirsiniz. Ancak zellikle de a iletiimi dnlerek farkl bir arayz tasarm yaplmtr. Burada herbiri bir yne veri tayan iki kanaln
ular iki tarafta birlemitir, ve bu birleim yerlerine, yani soketlere dayal bir arayz tasarm vardr:
---------kanal------->
soket1 soket2

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 11/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
<--------kanal-------

Bu mekanizmann kullanmyla artk dosyadan ziyade a iletiimine yatkn bir arayz alanna geiyoruz.

Bu tr bir iletiim mekanizmas iin Python socket kitapln kullanacaz (ki o da Berkeley Sockets kitaplna dayanyor):
import socket, os

socket1,socket2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM, 0)


if os.fork() == 0: #child
socket1.send(b"hello")
print("child reading:",socket1.recv(10))
else:
print("parent reading:",socket2.recv(5))
socket2.send(b"hello back")

Burada yaratlan iki sre soketlerden birini -hard coded olarak- seiyor ve setii soketi hem yazmak hem okumak iin kullanyor. Esasen ekildeki iki kanal iletim
sistemi tarafndan oluturuldu, ama bizim kullanma biimimiz kanal deil iki kanaln birer ucunu barndran ve soket denilen nesne zerinden.

Bu trden srelerin ezamanl yazma ve okuma ilemlerini yapabilmesi iin bundan daha iyi program tasarmlarna ihtiya olacaktr. rnein aldklar sinyalleri
biribiriyle paylaan iki tane hareket sensr dnn. Bizim programmzdaki gibi nce yazp sonra okuyacan bilmiyor. Sensrlerin alglamas sraya konulmnu
deil. Bu durumda her bir sensr bir yandan soketten okuyan bir izlek (thread) bir yandan da alglama iine bakan ana izlekten oluan ok-izlekli (multi-threaded)
sreler olmak durumundadr:
import socket, os, threading

def reader(name,readsocket,size=10):
while True:
print(name+" reading:",readsocket.recv(size))

socket1,socket2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM, 0)


if os.fork() == 0: #child
t=threading.Thread(target=reader,args=("A",socket1,6))
t.setDaemon(True)
t.start()
socket1.send(b"hello1")
socket1.send(b"hello2")
t.join(timeout=1)
else:
t=threading.Thread(target=reader,args=("B",socket2,6))
t.setDaemon(True)
t.start()
socket2.send(b"hello1")
socket2.send(b"hello2")
t.join(timeout=1)

Yukardaki program birka kez altrn ve yazma okuma sralarnn nasl deiebildiine dikkat edin.

Bu programda uyguladmz sre modeli aadaki gibi grselletirilebilir. Yine burada soketin sre iinde yaratlmas ve bu yzden iki utaki srelerin ayn
programdan fork() edilerek elde edilmesi esasa dair olmayan bir detaydr. :

Sre modeli 2: ift tarafl konuan iki sre

4.4 Ak ve paket tabanl soketler


Yukardaki rneklerde soket aarken socketpair() komutunda kullandmz parametrelere henz deinmedik, ki benzer parametreleri bir grup komutla kullanacaz.
AF_UNIX "soket ailesi" seeneklerinden biri. Bu seenek alan soketin "AF_INET" ailesi soketler gibi INternET soketi deil yerel, yani iletin sistemi iinde IPC
amal olduunu belirtiyor. AF_INET veya AF_INET6 tipi bir soket iin kar tarafn internet adresini vermek ve baka birtakm gereksinimler vardr. Bunlar
greceiz. Burada kullanlabilecek baka seenekleri grmek iin Linux sisteminden bilgi alabilirsiniz:
$ man socket

kinci parametre SOCK_STREAM ise ak tabanl iletiim amalandn belirtiyor. kinci yaygn alternatif SOCK_DGRAM: datagram yani paket tabanl bir
iletiim iin.

Ak tabanl iletiim alarda TCP protokol ile yaplrken paket tabanl iletiim UDP ile yaplr. Ak tabanl iletiimde bir utan/soketten gnderilen verilerin ikinci
uta/sokette "eksiksiz ve gnderildii srada" alnmas garantisi vardr. Bu nemli garantinin arkasnda durabilmek iin TCP protokoln ileten iletim sistemi
olduka aba harcamak durumundadr. Buna karlk paket tabanl iletiimde her gnderim bamsz bir pakettir, kar tarafa ulap ulamayaca, ve ulatnda
doru srada olup olmayacana dair hibir garanti yoktur. Bu tr bir iletiim taraflar arada srada olacak veri kayplarn tolere edebildikleri durumlarda tercih edilir
nk her adan sistemlere daha az yk bindirmektedir.

Burada nternet iletiimine gemeden nce paket tabanl bir rnek grelim. Bu rneimiz yukardaki 2 numaral sre modeline denk dmektedir:
import socket, os, threading

def reader(name,readsocket,size=10):
while True:
data,address = readsocket.recvfrom(size)
print(name+" read from "+address+", message :",data)

socket1,socket2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_DGRAM, 0)


if os.fork() == 0: #child
socket1.bind("/tmp/A")
t=threading.Thread(target=reader,args=("A",socket1,6))
t.setDaemon(True)

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 12/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
t.start()
socket1.sendto(b"hello1","/tmp/B")
socket1.sendto(b"hello2","/tmp/B")
t.join(timeout=1)
print("BYE! Remember to remove the file /tmp/A")
else:
socket2.bind("/tmp/B")
t=threading.Thread(target=reader,args=("B",socket2,6))
t.setDaemon(True)
t.start()
socket2.sendto(b"hello1","/tmp/A")
socket2.sendto(b"hello2","/tmp/A")
t.join(timeout=1)
print("BYE! Remember to remove the file /tmp/B")

Burada soket ular dosya sistemindeki dosyalarla eletirilir (ls komutu ile szkonusu dosyalar inceleyin). Bu yzden soketin alabilmesi iin szkonusu dosyann
mevcut olmamas gerekir. Programdaki uyar mesajlar bunun iin. Ancak szkonusu dosyalar varlk/yokluklarnn ve eriim haklarnn kontrol dnda iletiimde
kullanlmyorlar (mesela akan veriler o dosyalarda depolanmyor, vb.).

Soket tiplerinden biri olan SOCK_RAW genel kullanm iin deildir. TCP ve UDP gibi protokoller gelitirmeyi dnyorsanz bu soket tipiyle gelitirme almas
yapmak iin kullanlabilir. Byle bir durumda nc parametre olarak kendi belirlediiniz bir protokol numaras kullanabilirsiniz. Bu iletiim paket tabanl
olacaktr.

4.5 Durum almas ve balant soketleri: Metin tabanl bir protokol rnei
Bu durum almasnda asimetrik bir soket iletiimi kullanacaz. Balantnn bir utaki soketi sunucu, dier utaki soketi ise istemci olacak. Sunucu satr kesmesi
ile sonlanan tek satrlk komutlar alacak ve yine satr kesmesi ile sonlanan tek satrlk cevaplar dnecek. ki komut tanmlyoruz biri sunucunun zamann renmek,
dieri ise rasgele bir say istemek iin:
istemci --> sunucu : zaman
sunucu --> istemci : Mon Mar 4 12:12:19 EET 2013
istemci --> sunucu : rasgele
sunucu --> istemci : 12345

Bu kez sunucu ve istemciyi ayr programlar olarak yapp bir UNIX soketinden konuturacaz. Bu durumda bir srete socketpair yaratp sonra fork ederek
kullanma imkanmz kalmyor! Bu yzden sunucu ve istemciyi szkonusu adres uzaynda (AF_UNIX olduu iin dosya sistemi) nceden kararlatrlm bir yerde
buluturacaz. Yer olarak /tmp/mysocket adresini seiyorum.

Bu asimetrik kullanmda sunucu ve istemci birer soket oluturacak ve ayn yere balanacaklar. Ancak sunucu soketi hem farkl ilem admlar hem de farkl bir
program yaps gerektiriyor. Sunucular bir adrese sabitlenir ve istemcilerin balant kurmasn bekler, oysa istemci balant kurduunda soketin ucu zaten sunucuya
bal olmaldr. Ayrca sunucu ayn anda birden fazla istemciye cevap verebilmek zorundadr.

Sunucunun ayn anda birden fazla istemciyle iletiim kuracak olmas bize yeni bir sre modeli gerektiriyor. Bu durum almamzda szkonusu iletiim iki ynl
ancak senkronize bir iletiim, yani sunucu bir soru cevap rutini ierisinde alyor. Bu yzden sre modeli 2'deki gibi her istemciye karlk ift-izlek yaratlmas
gerekmiyor:

Sre modeli 3: Senkron sunucu ve istemcileri

Bu uygulamada metin tabanl bir veri alverii olduundan bunu pratikletirmek iin Python'daki io kitaplndan TextIOWrapper snfn kullanacam. Sunucumuz
u ekilde:
import socket, os, threading, io, random, datetime, sys

def service(readsocket):
komutno=0
textWrapper=readsocket.makefile(mode="rw")
while True:
try:
line=textWrapper.readline().strip()
komutno+=1
print("Received (%d):"%komutno,line)
if line=="zaman":
textWrapper.write(str(datetime.datetime.now())+"\n")
elif line=="rasgele":
textWrapper.write(str(random.random())+"\n")
else:
textWrapper.write("bilinmeyen komut:"+line+"\n")
textWrapper.flush()
except:
print("Bir hata olutu:",sys.exc_info())
break

serversocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)


serversocket.bind("/tmp/server")
serversocket.listen(5)
while True:

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 13/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
clientConn,clientAddr=serversocket.accept()
print("Client connection accepted:",clientAddr)
t=threading.Thread(target=service,args=[clientConn])
t.setDaemon(True)
t.start()

Sunucu soketininin oluturulma aamalarna dikakte ediniz. nce soket oluturuluyor, sonra belirli bir adrese balanyor (daha sonra AF_INET ailesi soketlerde
internet adreslerini kullanacaz), sonra listen() komutu ile dinlemeye balyor. Bundan sonra bloke bir komut olan accept() komutu bir istemci balanana kadar
bekler. Her istemci balants ayr bir sokettir! Programda serversocket.accept() komutu her seferinde yeni bir soket ucu dndryor, bunlarn herbirinin ucu ayr
bir istemciye bal. Dolaysyla sunucu soketini bir soketten ziyade bir soket reteci gibi dnmekte yarar var.

Bu sunucuda bir istemci balyken yeni gelenleri de kabul edebilmek iin ok-izlekli bir sunucu program yapmamz gerekti. Ayrca burada metin tabanl bir
protokol gerekletirdiimizden soketi metin dosyas gibi kullanmak iin makefile() ile dosya arayzne dndk, ve bylece readline() ile satr okuma yapabildik.

Bu sistemin istemcisi tek izlekli alabilir:


import socket, os, threading, io

clientsocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)


clientsocket.connect("/tmp/server")
textWrapper=clientsocket.makefile(mode="rw")
while True:
tmp=input("Enter a command:")
if tmp=="yeter":
clientsocket.close()
break
textWrapper.write(tmp+"\n")
textWrapper.flush()
print("Reply:",textWrapper.readline())

imdi sunucuyu altrn ve birden fazla istemci ile balanmay deneyin.

4.6 Soket seenekleri


4.6.1 Blokaj

Soketten ilemleri normalde veri gelene kadar bloke olur. Bu durum -Python'da- socket.setblocking(False) diyerek veya socket.settimeout(x) diye bir timeout
deerine kstlanarak deitirilebilir. Bu durumda okuma ilemi sokette okuyacak veri bulamazsa bir hata (exception) ortaya kartr.

4.6.2 Pasif okuma: Kesme (Interrupt) ile asenkron soket kullanm

Bir sre srekli okuma bekleme/deneme yerine iletim sistemi tarafndan bir kesme yaratlarak okunacak veri geldii konusunda uyarlabilir (genelletrilmi olan
bu kesme her trl dosya okumas iin kullanlabiliyor.) Bunu kullanmak iin nce soket veya dosya tantcsn fcntl modl kullanarak SIGIO kesmesini alacak
hale getirmeli, sonra signal modl ile bu kesmeyi yakalamalsnz. Yukardaki durum almasn bu ekilde deitirirsek:
import socket, os, threading, io, random, datetime, sys, fcntl, signal

def handler(signum,frame):
print("some signal:",signum,frame)
print(dir(frame))
#HOW TO DEAL WITH IO NOW??

serversocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)


serversocket.bind("/tmp/server")
serversocket.listen(5)
signal.signal(signal.SIGIO,handler)
while True:
try:
clientConn,clientAddr=serversocket.accept()
except socket.error as err:
if err.errno != 4:
raise
print("Client connection accepted:",clientAddr)
fcntl.fcntl(clientConn.fileno(), fcntl.F_SETOWN, os.getpid())
fcntl.fcntl(clientConn.fileno(), fcntl.F_SETFL, fcntl.FASYNC)

Bu programn en nemli fark istemciler iin izlek amaya gerek kalmamas, dolaysyla daha az kaynakla alabiliyor. te yandan gelen verinin hangi istemciden
geldiini ayrdetmek, istemciye zg kaytlar takip etmek te gleiyor. rnein nceki sunucumuz istemciden gelen kanc komut olduunu takip edebiliyordu.
Buradaki program yapsnda bu tr takipleri yapmak olduka zorlayor.

4.6.3 Dier asenktron yntemler


Bir srecin birden fazla (ok sayda!) soketi ynetebilmesi iin herbirine bir izlek/thread kullanmak iletim sistemi asndan ok ykl bir yntemdir. Bunun yerine
ayn dosyalardaki gibi iletim sisteminin select()/poll() metotlar ayn SIGIO kesmesi gibi kullanlabilir.

4.7 Egzersiz ve Asenkron durum almas


Bir sistem ii chat program yazn. stemciler -ok izlekli- sunucuya ilk olarak "isim: xxx" gndermeliler. Daha sonra "herkese: msg...", veya "xxx: msg..." eklinde
grup veya bireysel mesaj gnderebilmeliler.

Byle bir programda istemcilerin senkron olmadna dikkatinizi ekerim. Sunucu senkrondur: ancak istemciden komut gelirse gereini yapar. Ancak istemci
program bir yandan kullancsndan mesaj yazmasn beklerken bir yandan da sunucudan soketten gelebilecek mesajlar alp ekrana dkmeye hazr olmaldr. Byle
asenkron bir ilem iin iki-izlekli bir program/sre kullanmak gerekecektir:

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 14/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

Sre modeli 4: Senkron sunucu ve asenkron istemcileri

5 Tama Katman ve A soketleri I: Paket Tabanl letiim ve UDP


IP protokolnn global ama gvenilmez bir "kapdan kapya" paket tama sistemi olduunu belirtmitik. Bu blmde greceimiz standartlar soket kavramn
bilgisayarlarn kaplar arasnda deil, sreler arasnda (ayn veya farkl bilgisayar sistemleri zerinde) iletiim iin kullanmamz iin tasarlanm protokoller
olacak.

Bu protokollerden UDP(User Datagram Protocol) paket tabanl iletiim iin, dieri, TCP (Transmission Control Protocol) ise ak tabanl iletiim iindir. Bu
protokollerin kullanm nceki blmde grdmz soket iletiiminde farkl bir soket ailesi (AF_INET veya AF_INET6) oluturmaktadr. Her iki protokol de
kendilerince bir paket yaps tanmlarlar. Bu protokollerin paketleri kapdan kapya tama iin genellikle IP paketlerinin iine konularak tanrlar, ancak kullanm
daha az yaygn olsa da kapdan kapya tama yapan herhangi bir protokol (rnein sadece Novell irketinin alarnda ve cihazlarnda kullanlan IPX gibi) zerine
yklenebilirler. Her iki protokol de bir i adres alan (port numaras diye bilinen alan) tanmlayarak "kap"nn yani bilgisayar sisteminin iindeki srelerin
adreslenebilmesine imkan verirler. Bylece gnderilen veri IP dzeyi sayesinde belirli bir bilgisayara/cihaza ulamakla kalmaz, UDP/TCP dzeyi i adres alan
sayesinde bilgisayarn iindeki ok sayda i adresten birini hedeflemi olur. Ayn ey veri gndericisi taraf iin de geerlidir.

5.1 Paket tabanl a iletiimi: UDP protokol


UDP protokol tek paketle snrl bir iletiim iin tasarlanmtr. Esasen IP prokolnn zerine ekledii tek ey bir i adres alandr. Bu protokoln paket yaps
aada verilmitir (kaynak RFC 768):
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| | |
| Length | Checksum |
+--------+--------+--------+--------+
|
| data octets ...
+---------------- ...

User Datagram Header Format

Pakette 16 bitlik kaynak "i kap adresi", ve ayn ekilde hedef i kap adresi bulunuyor. Bu paketi oluturan ve aan -neredeyse sadece- iletim sistemidir.
Szkonusu adresler verinin global ada, yani nternet'te dolam asndan hibir anlam ifade etmez. Bunlar yaygn deyiiyle "port" numaralardr, ve kapnn (tekil
bir IP adresine sahip bilgisayar/a-arayz) arkasndaki i kaplardan birine iaret eder. adres alan sayesinde veri trafii "bilgisayar sisteminin iinde", toplam
2
16
, yani 65536 farkl i adresten birine ynlendirilebilir. Ayn ekilde gnderilen cevaplarnn adreslenebilmesi iin farkl i adreslerden biri gnderici adresi olarak
konulur. Bu sayede bir bilgisayarda alan srelerden biri, uzakta baka bir birgisayarda alan srelerden biriyle belirli bir i adreste "randevulap" buluabilir.

UDP paket yapsndaki Length verisi tm paketin uzunluudur (byte cinsinden), Checksum ise daha nce rneklerini grdmz 16 bitlik, paket bal ve verilerin
toplanmasyla elde edilen, hata tespiti iin kullanlan veridir.

UDP de IP gibi hata tespitine elverse bile paketlerin teslimatna dair bir garanti vermez. Bu yzden bir UDP paketine cevap gelmesi de garanti deildir, ve uygulama
yazmnda bu gznne alnmaldr. UDP'nin IP'nin zerine ilave olarak salad tek ey i-adresleme, yani port numaralardr.

5.2 -adres/port numaralarnn tahsisi ve kullanm ile ilgili temel kurallar


Bir randevulama rnei olarak NTP'yi (Network Time Protokol) verebiliriz. Bilgisayar sistemlerinin belirli, grece hassas bir saati olan sunucuya/sunuculara
balanarak kendi saatlerini ayarlamalar iin tasarlanmtr. NTP buluma noktas 123 numaral i-kapdr. Eer nternete bal X.Y.Z.W adresli sunucunun NTP
servisi verdiini biliyorsanz bir istemci program altrp o IP adresi ve 123 i-kap adresine NTP standardnda tanmlanm bir veri paketi gnderirsiniz, ve cevap
alrsnz (merak edenler iin almasnn detaylar http://tools.ietf.org/html/rfc958 ). 123 gibi yaygn servislerce kullanlan i-kap/port numaralar uluslararas
kurulularca (balcas IANA, Internet Assigned Numbers Authority) tarafndan sabitlenmitir. Bunlarn yaygn bilinenler arasnda rnein HTTP (web sayfalarnn
tamasnda kullanlan protokol) iin 80 port numaras belirlenmitir. Port numaralarnn, yani randevu adreslerinin bu ekilde sabitlenmesi bulumay son derece
kolaylatrr. Eer IP adresi belirli bir bilgisayarn/cihazn 123 numaral portuna NTP veri paketi gnderiyorsanz bilirsiniz ki orada NTP sunucusu almaktadr ve
gnderdiiniz veri paketi yapsn tanyabilir, ap okuyup size cevap gnderebilir; ayrca o bilgisayarda NTP sunucusu alyorsa baka bir porta deil belirlenmi
olan 123 portuna bal olacaktr.

UNIX iletim sistemiyle elele gelimi olan port adresi standartlar 1990'larn ortalarna kadar birok temel servis iin (NTP servisi, HTTP, e-posta iin kullanlan
SMTP, vb.) 1024'ten daha kk olan port numaralarn tahsis etmiti. UNIX sistemlerinde de bu portlarn kt kullanm bir bilgisayar dardan ziyaret eden ve
standart servis beklentileri olanlar kt duruma drebileceinden, bu portlarn kullanm sper kullanc yetkileri gerektirir. te yandan giderek a servislerinin
artmas sonucu gnmzdeki chat, veya canl sesli/grntl grme gibi protokoller giderek IANA'y ap, de facto standartlar olarak kullanlmaktadr. Bu tr
protokoller deneysel olarak kullanma girdiinde 1024'ten byk port numaralar kullanlabilir. Yine ayn ekilde dosya paylam sistemleri gibi yazlmlar her
kullancnn bir sunucu sreci altrmasn gerektirdiinden byk port numaralarn kullanrlar.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 15/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

5.3 rnek: Paket tabanl tarih-zaman servisi


RFC 867 bir adaki bilgisayarlarn birbirlerinin tarih-saatini okumas iin NTP'den de basit bir protokol tanmlar. Bu protokol iin IANA tarafndan 13 numaral port
tahsis edilmitir. Hem UDP hem TCP kullanm olan bu protokoln basit bir UDP gerekletirmesini yapalm.

RFC 867'ye gre tarih-zaman servisine balanan bir istemci bo bir paket gnderir, cevaben una benzer, metin kodlanm bir tarih-zaman bilgisi alr: "02 FEB 82
07:59:01 PST", veya "Tuesday, February 22, 1982 17:37:43-PST".

Aadaki rnek programmz verilen komut satr parametrelerine gre byle bir servisin sunucusu ya da istemcisi olabilecektir. Szkonusu ileyiin basitlii gerei
ne sunucu ne de istemcinin ok-izlekli (multi-threaded) olmasna gerek yoktur. Dolaysyla paket tabanl bu serviste senktronize ve tek islekli bir sunucu ve ayn
ekilde bir istemci var. rneimiz basit, sadece a soketi kullanmyla ilgili kodlar ieriyor. Program altrrken sistem yetki ayarlarna taklrsanz port numaras
olarak 1024'ten byk bir port kullann:
import sys,socket, os, threading, datetime

def serve(readsocket):
while True:
data,address = readsocket.recvfrom(size)
print("Request from "+address)
currentTime=datetime.datetime.now()
sock.sendto(str(currentTime), address )

print("Usage:")
print(" as client: %s CLIENT server-IP [port]")
print(" as server: %s SERVER [port]")

if sys.argv[1]=="CLIENT":
serverIP=sys.argv[2]
if len(sys.argv)>3:
serverport=int(sys.argv[3])
else:
serverport=13
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
socket.bind( ("",0) ) #Use n available port
socket.sendto(b"", (serverIP,serverport) )
data,tmp = socket.recvfrom(255)
print("Server response:",data)
else: #SERVER
print("SERVER IS RUNNING")
if len(sys.argv)>2:
port=int(sys.argv[2])
else:
port=13
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
socket.bind( ("",port) )
while True:
data,address = socket.recvfrom(255)
print("Request from "+str(address))
currentTime=datetime.datetime.now()
socket.sendto(str(currentTime), address)

Ayn rnek program Java'da u ekilde olacaktr:


/*
* Java UDP datetime client/server
* Author : Mehmet Gencer, mgencer@bilgi.edu.tr
*
* The program can run as UDP datetime server or client, depending on the command line arguments.
* The server will reply to UDP datagrams with timestamp information.
* The client will send an empty datagram to server, wait its response and exit.
*
* Usage:
* UDPexample [CLIENT servername port] | [server port]
*/

import java.net.*;
import java.io.*;
import java.util.*;

class Server{
int port;

public Server (int port) {


this.port=port;
}

public void run() {


byte[] buffer=new byte[1500];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
try {
DatagramSocket serverSocket=new DatagramSocket(port);
for(;;) {
System.out.println("Server waiting");
serverSocket.receive(packet);
System.out.println(String.format("Received request from %s:%d ", packet.getAddress(), packet.getPort()));
Date date=new Date();
String reply=String.format("%1$tY %1$tm %1$te %1$tH:%1$tM:%1$tS",date);
byte[] sendbuffer=reply.getBytes("ASCII");
DatagramPacket replyPacket=new DatagramPacket(sendbuffer,sendbuffer.length,packet.getAddress(),packet.getPort());
serverSocket.send(replyPacket);
}
} catch(IOException e) {
System.out.println(String.format("Error: %s",e));
}
}
}

class Client{
String serverName;
int port;

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 16/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
public Client (String serverName, int port) {
this.serverName=serverName;
this.port=port;
}

public void run() {


String message="";
try {
byte[] sendbuffer=message.getBytes("ASCII");
DatagramSocket clientSocket=new DatagramSocket();
InetAddress srvAddress=InetAddress.getByName(serverName);
System.out.println(String.format("Will try to send to server %s at address %s (my port:%d)",serverName,srvAddress,clientSocke
DatagramPacket packet=new DatagramPacket(sendbuffer, sendbuffer.length, srvAddress, port);
clientSocket.send(packet);
System.out.println("Message sent");
byte[] receiveBuffer=new byte[1500];
DatagramPacket receivePacket=new DatagramPacket(receiveBuffer,receiveBuffer.length);
clientSocket.receive(receivePacket);
System.out.println(String.format("Received reply from address %s:%d --> %s", receivePacket.getAddress(), receivePacket.getPor
} catch(Exception e) {
System.out.println(String.format("Error: %s",e));
}
}
}

public class UDPDatetime {


public static void main(String[] argv){
if (argv.length<1) {
System.out.println("Usage:");
System.out.println(" UDPexample [CLIENT servername port] | [SERVER port]");
System.exit(0);
}
if (argv[0].equals("CLIENT")) {
new Client(argv[1], Integer.parseInt(argv[2])).run();
} else {
new Server(Integer.parseInt(argv[1])).run();
}
}
}

5.4 A arayzleri ve localhost


Bir bilgisayar sistemi birden fazla fiziksel aa bal olabilirler. Gnmzde masast bilgisayarlarda bir kablolu ve bir kablosus a arayz (NIC: Network Interface
Card), olmas, veya USB a arayz taklmas yaygn bir durumdur.

Bunlara ilaveten ou sistemde (Linux, Windows, Mac OsX dahil), "localhost" veya "loopback" ad verilen, ve bu duruma zel 127.0.0.1 IP numaras ile kullanlan
bir sanal arayz bulunur. Bu sanal arayz fiziki bir cihaza/ortama karlk gelmez. Sadece sistemin iinde varolur, ve sistemin iinde alan srelerin standart a
protokolleri ile konuabilmesi, yani i-IPC iin tasarlanmtr. Bu arayze sistemin dndan bir eriim szkonusu olamayacandan gvenlik kaygs duyulmadan
standart IP+TCP/UDP protokolleri ile srelerin zgrce iletiim kurmasna imkan verir. Ayrca web sunucusu/uygulamas gelitirme gibi yazlm gelitirme
senaryolarnda gvenli ve kontroll bir ortamda sistemin denenmesine imkan verir.

Bir Linux, UNIX, veya OsX sistemin tm arayzlerini (sanal ve gerek) `ipconfig' komut ktsyla inceleyebilirsiniz:
$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:0f:fe:f3:cd:88
inet addr:10.20.2.34 Bcast:10.20.255.255 Mask:255.255.0.0
inet6 addr: fe80::20f:feff:fef3:cd88/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:251670966 errors:0 dropped:0 overruns:0 frame:0
TX packets:1468869 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3833080880 (3.5 GiB) TX bytes:722035058 (688.5 MiB)
Interrupt:19 Memory:f0000000-f0020000

lo Link encap:Local Loopback


inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:4023 errors:0 dropped:0 overruns:0 frame:0
TX packets:4023 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:267600 (261.3 KiB) TX bytes:267600 (261.3 KiB)

Yukardaki rnek kt bize sitemde bir gerek bir de sanal arayz olduunu gsteriyor. Arayzlerin IP adreslerini, MTU (Maximum Transmission Unit) yani
tanabilecek maxsimum paket boyutunu, destekledii iletiim biimlerini (daha sonra greceimiz Multicast gibi), alma istatistiklerini (RX: received packets-
alnan paket says, TX: transmitted packets-gnderilen paket says, vb.). Ayrca sadece yerel a konfigrasyonunu ilgilendiren ve daha sonra bahsedeceimiz baz
baka detaylar (Bcast ve Mask) sylyor.

Programlarnzdan bu bilgilere ulamann bir rnei aada Java dilinde verilmitir:


/**
* Original Source: http://java.sun.com/docs/books/tutorial/networking/nifs/index.html
*/
import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

public class ListNetsEx


{
public static void main(String args[]) throws SocketException {
Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netint : Collections.list(nets))
displayInterfaceInformation(netint);
}

static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {


out.printf("Display name: %s\n", netint.getDisplayName());
out.printf("Name: %s\n", netint.getName());
Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 17/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

for (InetAddress inetAddress : Collections.list(inetAddresses)) {


out.printf("InetAddress: %s\n", inetAddress);
}

out.printf("Up? %s\n", netint.isUp());


out.printf("Loopback? %s\n", netint.isLoopback());
out.printf("PointToPoint? %s\n", netint.isPointToPoint());
out.printf("Supports multicast? %s\n", netint.supportsMulticast());
out.printf("Virtual? %s\n", netint.isVirtual());
out.printf("Hardware address: %s\n",
Arrays.toString(netint.getHardwareAddress()));
out.printf("MTU: %s\n", netint.getMTU());

out.printf("\n");

}
}

5.5 Unicast, Broadcast, ve Multicast


imdiye kadar veri paketlerinin tek bir alcya gnderildiini, yani Unicast durumunu varsaydk. Bunun alternatiflerine de ihtiya duyulmaktadr.

Bunlardan biri broadcast, yani paketi mmkn olan tm alclara gndermek. Bu yntem sadece yerel alarda uygulanabilir, ve hemen her zaman bir bilgisayarn
yerel adaki temel baz servislerin yerini kefetmek iin bavurduu bir yntemdir. rnein DHCP servis sunucusunu, veya ofislerde bulunan a yazclarn
kefetmek iin kullanlr, ve elbette belirlenmi portlardan belirli protokollerle uygulanr. Buna ilaveten DAAP(Digital Audio Access Protocol) gibi standartlar
kullanan Rhytmbox ve benzeri multimedya uygulamalar yerel ofiste bulunan ve mzik soayalarn paylaan dier PCleri kefetmek iin protokolde tanmland
gibi broadcast yaparlar.

Multicast ise IP protokolnde tanmland halde daha ok UDP protokol dzeyinde uygulanan, modern ama altyap destei tam olmayan bir tekniktir. Baka bir
deyile tm nternet multicast desteklemez. Burada ama dijital multimedya yaynlarnn herkese deil ama yayn almaya istekli alclara bir elden ulatrlmasdr.
Bir video yaynn/akn UDP paketleriyle tm alclara ayr ayr gnderebilirsiniz elbette. Ancak ayn mahallede oturan alclara giden birbirinin ayn ierie sahip
ok sayda paket yol boyunca internet trafii yaratacaktr. Bunun yerine multicast sisteminde paket bir multicast adresine gnderilir, alclar bu adrese abone
olabilirler. Dolaysyla paket en az bir alc olan a blgelerine gnderilir, ve yolda gerekli ekilde oaltlr. Dolaysyla ngiltere'den yaplan bir yayna stanbul'dan
100 alc kaydolduysa ngiltere'den stanbul'a kadar tek bir paket gelecek, ve burada alclarn mahallelerine gre kopyalar kartlarak datlacaktr. Bu strateji
paket trafiinde ok nemli tasarruflar salar. Basit bir datm senaryosu aada grselletirilmitir (Kaynak Wikipedia):

Multicast datm senaryosu: yolun bir ksmnda paketin tek kopyas gider, sonra gereince alc blgelerine doru kopyalar gnderilir

Multicast yaplabilmesi iin yol boyunca btn router'larn bu stratejiyi uygulayacak zellik ve kapasiteye (rn. abonelikleri takip etmek) sahip olmas gerekir. Bu
yzden multicast nadiren, rnein kampslerde veya ileri dzey a altyapsna sahip kentlerde/kentsel blgelerde, ya da dijital yaynclk hizmeti veren irketlerin
dedii alar ierisinde uygulanabilmektedir.

Broadcast kullanm aadaki basit mesaj sunucu/alc rneinde ele alnmtr. Broadcast paket gnderme alc adresi yerine 255.255.255.255 koyarak
gerekletirilmektedir.
/*
* Java UDP broadcast program
* Author : Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*
* Bu program UDP broadcast ile tek satrlk mesajlar yaynlayarak
* basi bir chat program ilevi grr.
*
* Usage:
* UDPBroadcast port
*/

import java.net.*;
import java.io.*;
import java.util.*;

class Listener implements Runnable {

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 18/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
int port;
DatagramSocket socket;
Thread thread;
public Listener (DatagramSocket socket) {
this.socket=socket;
thread =new Thread(this);
thread.setDaemon(true);
thread.start();
}

public void run() {


System.out.println("Listener has started");
try {
byte[] receiveBuffer=new byte[1500];
while(true) {
DatagramPacket receivePacket=new DatagramPacket(receiveBuffer, receiveBuffer.length);
socket.receive(receivePacket); //THIS IS A BLOCKING CALL!
String what=new String(receiveBuffer,receivePacket.getOffset(),receivePacket.getLength());
System.out.println(String.format("Received from %s:%d --> %s", receivePacket.getAddress(), receivePacket.getPort(), what)
}
} catch(IOException e) {
System.out.println(String.format("Listener error : %s",e));
return;
}
}
}

public class UDPBroadcast {


public static void main(String[] argv){
if (argv.length<1) {
System.out.println("Usage:");
System.out.println(" UDPBroadcast port");
System.exit(0);
}
int port=Integer.parseInt(argv[0]);
try{
DatagramSocket socket=new DatagramSocket(port);
//socket.bind(new InetSocketAddress(0));
System.out.println(socket.getLocalSocketAddress());
socket.setBroadcast(true);
new Listener(socket);
InetAddress broadcastAddress=InetAddress.getByName("255.255.255.255");
while(true) {
try {
String msg=System.console().readLine("Enter your message:");
byte[] buffer=msg.getBytes();
DatagramPacket packet=new DatagramPacket(buffer,buffer.length,broadcastAddress,port);
socket.send(packet);

}catch(Exception e) {
System.out.println(String.format("Announcer error : %s",e));
e.printStackTrace(System.out);
System.exit(0);
}
}
}catch(Exception e) {System.out.println(e);}

}
}

Python ile periyodik olarak tarih-zaman bilgisini broadcast yapan bir sunucu da aada verilmitir:
#!/usr/bin/python3
"""
Bu program periyodik aralklarla tarih-zaman bilgisini istenen alc portuna
broadcast olarak gnderir
"""
import sys, time, datetime, socket

port = 1025
interval= 3 #saniye cinsinden
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 0)) #gnderici port'un nemi yok
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
#Bu seenek aktifletirildikten sonra
#Alc adresinin nemi kalmaz

while True:
data = str(datetime.datetime.now())
s.sendto(data.encode("ASCII"), 0 ,('', port))
print("Tarihzaman duyuruldu")
time.sleep(2)

Bu sunucuyu dinlemek iin kullanabileceiniz aadaki Python program ise normal UDP soketleri kullanr. UDP paketlerinin broadcast ile gnderilmi olmas
istemci tarafndaki program'n soket seeneklerini etkilememektedir:
#!/usr/bin/python3
"""
Bu program periyodik aralklarla tarih-zaman bilgisini duyuran
sunucuy dinler
"""
import sys, time, datetime, socket

port = 1025
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 1025))

while True:
data,addr= s.recvfrom(255)
print("Tarihzaman (sunucu:%s):%s"%(addr,data))

5.6 UDP/paket tabanl baz servisler: DHCP, DNS, ve dierleri


http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 19/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
UDP kimi temel servislerin altyapsn oluturur. Bu servisler ak gerektirmeyen, talep ve cevaplarn ksa olduu servislerdir. UDP'nin bir teslimat garantisi
vermemesinden dolay bu tr servislerde cevap alnamazsa, belirli bir zamanamndan sonra talebin tekrarlanmas gerekecektir. Bu servislerden yaygn bazlar bu
blmde ksaca ele alnmaktadr.

5.6.1 DHCP
DHCP protokol yerel aa yeni balanmakta olan bir bilgisayar sistemine kullanabilecei a konfigrasyon bilgilerini salamak iin tasarlanmtr. Bilgisayarn
geerli ve an tasarmna uygun olarak tahsis edilen bir IP adresine, adaki router bilgisine, vb. ihtiyac olacaktr. Bunun iin broadcast ile DHCP iin tahsis edilmi
olan sunucu port numarasna (547) bir anons gnderir. Bu anonsu alan alclar arasnda ideal olarak tek bir DHCP sunucusu bulunur, ve o da istenilen bilgileri yeni
bilgisayara gnderir. Ayrca tahsis edilen IP numarasn kaydeder ve bakasna vermez ki ada adres akmalar yaanmasn.

Yeni bilgisayar broadcast ile talebini gnderirken henz bir IP adresi yoktur! Bu yzden gnderici IP adresi 0.0.0.0 olarak gider. Tam da bu yzden DHCP sunucusu
da cevabn broadcast olarak gndermek zorundadr, nk cevab adresleyebilecei bir adres yoktur, ve zmeye alt sorun da zaten budur. Karklk
kmamas iin cevaba talebi yapan bilgisayarn MAC adresi konur. Kabaca DHCP-DISCOVER denilen talep ve DHCP-OFFER denilen cevap u bilgileri ieren
UDP paketleridir:
DHCP-DISCOVER:
ALICI:255.255.255.255, PORT:547
GNDERC: 0.0.0.0, PORT: xxx (nemsiz)
lem kodu: "discover"
stemci MAC adresi: xyz

DHCP-OFFER:
ALICI:255.255.255.255, PORT:546
GNDERC: 10.15.2.1, PORT: 547 (sunuc IP adresi)
lem kodu: "offer"
stemci MAC adresi: xyz
Kullanacan IP adresi: 10.15.2.134
Yerel adaki router/gateway: 10.20.2.0
Konfigrasyon parametreleri:
subnet mask: 255.255.255.0
IP lease time: 1 gn
DNS sunucular: 10.20.0.2, 10.20.0.3, 10.20.0.4

Artk sisteminiz aa entegre olmutur. "route" komutu ile kullanlan gateway bilgisini grebilirsiniz.

5.6.2 DNS

Drt paral birer say olan IP adreslerini aklda tutmamz gtr. Bunun yerine internetteki hedef adreslere maksadn ifade eden isimler konulur. DNS sistemi bu
isimleri, yani alan adlarn, nternet'teki paket datm iin gerekli IP adreslerine tercme eden servisi salar. nternet'in ilk yllarnda bu servis her alan ad ve
yannda IP adresini listeleyen bir dosyadan ibaretti. Bu dosya o yllarda internet'i kontrol eden ABD'deki bir kurumdan nternet'e bal sunucular tarafndan gnlk
olarak alnr ve kullanlrd. Bunun bir kalnts sisteminizdeki /etc/hosts dosyasdr. UNIX/Linux sistemleri alan ad zmlemesi iin hala ilk olarak bu dosyaya
bakarlar, burada aradklarn bulamazlarsa yukarda DHCP cevabnda elde ettikleri DNS sunucular ile DNS protokol dilinde soru-cevap balantlarna giriirler.

Gnmzde DNS zmlemeleri iin datk (distributed) bir sistem kullanlmaktadr. Bir alan adnn resmi otoritelere kayd srasnda bu alan ad iin DNS
bilgilerini kimin servis edecei de kaydedilir. Bu bilgilere aadaki rnekteki gibi eriebilirsiniz:
$ whois teknosa.com.tr
** Registrant:
Teknosa ve D Ticaret A.S.
E-5 Karayolu Uzeri Gulsuyu Mevki

Istanbul,
Turkiye
vyilmazkaya@teknosa.com.tr
+ 90-216-4583636-
+ 90-216-4596617
....
** Administrative Contact:
NIC Handle : ta944-metu
Organization Name : teknosa a.s
Address : E-5 karayolu Uzeri Gulsuyu Mevki
Maltepe
Istanbul,81540
Turkiye
Phone : + 90-216-4583636-3618
Fax : + 90-216-4596617

...
** Domain Servers:
ns1.sabancigrubu.com
ns2.sabancigrubu.com

** Additional Info:
Created on..............: 2000-Mar-08.
Expires on..............: 2016-Mar-07.

Bu bilgiler hiyerarik olarak tutulmaktadr. Bir alan ad X.Y.Z eklindedir. Sondaki Z lkesini, Y grubunu (akademik, ticari, sivil, vb.), ve X ise sahibinin bu
sunucuya yktrd alfanmerik bir ismi ierir (Sadece ASCII karakterlerin bir ksm kullanlabilir). Bu alan adn zmlemek iin nce ABD merkezli NIC
(Network Information Center) ile balant kurulup Z lkesinin yetkili yerel NIC'inin IP adresi alnr. Bu NIC ile konuulur ve istenen alan adnn DNS sunucusunun
IP adresi sitenir (yukardaki rnekte ns1.sabancigrubu.com sunucusunun IP adresi), ve nihayet sorumlu DNS sunucusuna alan adnn IP karl sorulur. Bu datk
sistem eskiden olduu gibi tm alan ad zmlemesinin tek bir merkeze yklenmesini nlemektedir.

Alan ad zmlemesini programlarn iinden u rneklerdeki gibi yapabilirsiniz. Java'da (tam program kodu):
/**
* Using Java net libraries for DNS name resolution
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/
import java.net.*;

public class DNSResolver {


public static void main(String[] args) {
try {
String name=args[0];
InetAddress addr=InetAddress.getByName(name);
System.out.println(addr);

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 20/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
}
catch (UnknownHostException e) {
System.out.println("Cannot find host");
}
catch (Exception e) {
System.out.println("Usage: \r\n DNSResolver host.name.to.resolve");
}
}
}

ve Python'da (rnek komutlar):


import socket
socket.gethostbyname("www.teknosa.com.tr")

5.7 Egzersizler
1. "man iptables" komutu ile Linux'taki standart ateduvar (firewall) sistemini inceleyin. Bu servis MAC,IP, ve TCP/UDP dzeylerinde trafik filtrelemesi
yapabildii gibi, trafik hzlarn da dengeli datmak gibi imkanlar sunar.

6 Tama Katman ve A soketleri II: Ak Tabanl letiim ve TCP


Ak tabanl protokollerin en yaygn olan TCP (Transmission Control Protokol) ad stnde ak kontrol yapar. Grevi gndericiden kan verinin paketlere ayrlp
alcya gnderilmesi, alc tarafnda tekrar eksiksiz ve ayn srada birletirilip teslim edilmesidir. Tayc olarak kulland IP protokol gvenilmez olduundan
paketlere numara vermek, alndklarn onaylamak ve eksikleri yeniden istemek, paketleri sraya dizmek gibi ilevleri yerine getirmesi gerekir.

6.1 Paket yaps


TCP'nin bu ilemler iin tasarlanm paket yaps aada gsterilmitir (Kaynak IETF RFC-793):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TCP Header Format

Gnderici ve alc port numaralar UDP'deki gibidir. Hata tespiti iin kullanlan Checksum bilgisi de yle. TCP paketlerinde giden paket numaras (Sequence
number) bir taraftan kan paketlere atlamadan ve srayla verilir. Kar taraf baarl olarak ald paketleri ACK (acknowledge-Onay) komutu ile ve onaylanan
paketin numarasn da Acknowledgement Number alanna koyarak onaylar, veya pakette hata bulundu yada hi gelmediyse not acknowledgement mesaj ve
eksik/hatal paket numaras gnderilir. Diyagramda data offset ile balayan satrdaki birka bitlik alan bu ve baka baz ilemlerden hangisinin seildiini ifade
etmek iin kullanlan ilem alandr.

Paketteki seenekler ksm deiken uzunlua sahip olduundan "data offset" alan paket balnn toplam uzunluunu belirtir ki data'nn nerede balad
anlalabilsin.

Window bilgisi kar tarafn daha ne kadar paket almaya hazr olduunu belirtir. Her bilgisayar/cihazn tampon alan (buffer) farkl kapasitede olduundan gnderici
tarafn bu snr amamas gerekir, yoksa ar sklkta paket kayplar yaanacaktr.

Gnmzde nadiren kullanlan urgent pointer sistemi ak iinde ikinci bir ak tanmlar. Bu sistem youn bir veri aknn ierisinde karlkl kontrol mesajlarn
ncelikli olarak gndermek (yani paket sra numaralarna ve tampon doluluklarna ramen) iin tasarlanmtr, ancak nadiren ihtiya duyulmaktadr.

Seenekler ksm ise akla ilgili baz seenekleri, rnein azami paket bykl gibi parametreleri gndermek iin kullanlmaktadr.

6.2 Balant ynetimi


TCP ak tabanl bir protokol olduundan akn balamas, akla ilgili seeneklerin/parametrelerin belirlenmesi, ve akn sonlandrlmas ilemlerinin karlkl bir
protokol ile yrtlmesi gerekir.

TCP paket yapsndaki ilem alannda ifade edilen ilemler balant kurma ve sonlandrma aamalarnda, ve aradaki tm paket deiimlerinde kullanlr. Balant
kurma aamas u ekilde gerekleir (Kaynak http://condor.depaul.edu/jkristof/technotes/tcp.html):

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 21/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

TCP balant kurma aamas

Balant kurulduunda iki taraf ta paket sra numaralarn sfrlam ve balant parametreleri (window size, max paket bykl gibi) zerinde anlam
durumdadr. Artk Paket gnderimi ve AKC/NACK ilemlerini yaparlar. ki taraftan biri balanty sonlandrmak istediinde ise sonlandrma ilemi u ekilde bir
mesajlama ile gerekleir:

TCP balant sonlandrma aamas

6.3 TCP "yava balama" sorunu


TCP'nin ak tabanl bir protokol olmas ve iki tarafta paket tamamlama ve sralama gibi gereksinimleri olmasndan dolay bu protokoln gerekletirildii yazlm
kitaplklar kanlmaz baz taktikler benimser. Bunlardan bir tanesi iki tarafn iletiim hznn ayarlanmasyla ilikilidir. Paket kayplar ve tampon tamalarnn sk
olmas durumunda iletiim son derece yavalayacaktr. Byle bir durum iki taraftan birinin ya da ikisinin ak hzyla baedemediini gsterir. Byle bir durum bir
kez ortaya karsa bu sorunlarn halledilmesi zaten sorun yaayan taraf iyice yoracak ve iletiimin kopmasna (hatta sistemin kilitlenmesine) yol aabilecektir.

Bu sebepten dolay TCP ak kontrol "yava balama" zerine kurulmutur. letiimin iki taraf nce temkinli bir hzda paket alveriine balarlar. Sorunlarn olup
olmadn ve derecesini yoklayarak yava yava bu ak hzlandrrlar. Bu anlamda TCP sistemi balang hz konusunda olduka "muhafazakar" davranmak
zorunda kalmtr, nk tersi bir yaklamn getirdii balant riskleri daha ar basmaktadr.

Bu sorun balant performansyla ilgili olarak knedini gsterir. rnein web kullanmnn yaygnlat gnmzde web sayfalar giderek zenginlemektedir. Bir
web sayfas ierisnde ok sayda grsel, programck, vb. bulunur. Bunlarn herbiri iin sunucu/sunucular ile ayr ayr TCP balantlar kurulmaktadr. Oysa bu
balantlarn herbiri, getirdii balant kurma yknn yansra, yava balama problemi yaarlar. Bu yzden zengin web ierii, nternet altyapsnn hzlanmasna
ramen, TCP'nimn yava balama durumu karsnda ciddi sorunla karlamaktadr [@Thomas2012]. Bunun iin HTTP'ye alternatif tasarmlar denenmektedir.
HTTP dndaki ihtiyalarda da benzer bir durum sorun yaratabilmektedir.

6.4 Programlama rnei: Echo servisi


Buradaki rneimiz son derece basit TCP tabanl bir sunucu ve istemci. Bu sunucu istemciden gelen tek satrlk metinleri istemciye aynen geri gnderiyor. Gerek
bir ilev saylmaz, ancak bir TCP soket kullanmnn temel yapsn bize gstermektedir.

6.4.1 Java sunucu ve istemci

Java'da yazlm bir sunucu:


/*
* Single threaded Echo Server which can serve only a single client at once.
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/
import java.net.*;
import java.io.*;

public class TCPEchoServer {


public static void main(String[] args){
if (args.length<1) {
System.out.println("Usage:");

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 22/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
System.out.println(" TCPEchoServer portno");
System.exit(0);
}
try {
System.out.println("Opening server socket at port : "+args[0]);
ServerSocket serverSocket = new ServerSocket(Integer.parseInt(args[0]));
System.out.println("Accepting clients");
while (true) {
Socket clientSocket = serverSocket.accept();
clientSocket.setReceiveBufferSize(1500);
System.out.println("Client accepted. Remote address:"+clientSocket.getInetAddress());
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
String inputLine, outputLine;
while (true) {
try {inputLine = in.readLine();}
catch (Exception x) {break;}
System.out.println("Got msg from client : "+inputLine);
outputLine = inputLine;
out.println(outputLine);
out.flush();
}
System.out.println("Client disconnected");
out.close();
in.close();
clientSocket.close();
}
//serverSocket.close();
} catch (Exception e) {
System.out.println("Something went wrong!");
System.out.println(e);
}

}
}

ve istemcisi:
/*
* TCP EchoClient.java
* Author : Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*
* Run the program without any parameters to see its usage.
*/
import java.net.*;
import java.io.*;
import java.util.*;

public class TCPEchoClient{


public static void main(String argv[]){
if (argv.length<2) {
System.out.println("Usage:");
System.out.println(" TCPEchoClient servername portno");
System.exit(0);
}
try{
Socket socket = new Socket(argv[0], Integer.parseInt(argv[1]));
socket.setSoTimeout(1000); //socket timeout 1000 ms
BufferedReader fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter toServer = new PrintWriter(socket.getOutputStream());
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Enter something to send to server:");
String toSend = console.readLine();
System.out.println("Sending to server...");
toServer.println(toSend);
toServer.flush();
Thread.sleep(1);
try {
System.out.println("Reading from server...");
String line=fromServer.readLine();
System.out.println("Response:"+line);
} catch (Exception e){
System.out.println("Something went wrong when reading from socket!");
System.out.println(e);
}
}
}
catch(Exception e){
System.out.println("Something went wrong!");
System.out.println(e);
}
}
}

6.4.2 Python sunucu ve istemci


Python'da yazlm bir sunucu:
#!/usr/bin/python
"""
COMP 322 Example: Echo Server

Author : Mehmet Gencer, mgencer@cs.bilgi.edu.tr

This non-concurrent server accepts a single connection and echoes back lines
"""

import sys, socket

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 23/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
if len(sys.argv)< 3:
print "Usage:"
print sys.argv[0], " hostname port-to-bind"
sys.exit(0)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #First create a socket
sock.bind( (sys.argv[1], int(sys.argv[2])) )
sock.listen(5) #Allow up to 5 clients to hold on line
print "listening..."

while 1:
conn, addr = sock.accept() #This blocking call will wait until a client comes in
print 'Connection opened with', addr
while 1:
data = conn.recv(1024)
if not data:break
print "Received from %s: %s" % (addr, data)
conn.sendall(data) # echo it back
print 'Connection closed', addr

ve istemcisi:
#!/usr/bin/python3
"""
COMP 322 Example: Echo Client
Author : Mehmet Gencer, mgencer@csbilgi.edu.tr

Connect to given host and port, then send lines user enters to server
and display what it receives from server to the user.
"""

import sys, socket

if len(sys.argv)<2:
print("Usage:")
print(sys.argv[0]," hostname port")
sys.exit(0)
hostname = sys.argv[1]
port = int(sys.argv[2])

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


sock.connect((hostname, port))
print("Connected to ", hostname)
print("type 'quit' to end session")
inp = input("> ")
while inp !="quit":
sock.send(inp.encode())
data = sock.recv(1024)
print('Received:', data)
inp = input("> ")
sock.close()
print("Goodbye")

6.4.3 C sunucu ve istemci


C dilinde yazlm soket programn farkl nedenlerle tercih edenler olabilir. Buradaki rnekler hemen tm programlama dillerinin Berkeley soket kitapln
benimsemesinden dolay dier dillerde grdmz rneklere genel yap olara son derece benzemektedir.

Tek izlekli C sunucumuz u ekildedir:


/* TCP server program

Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr

This program simply echoes back what the client sends.


To test it connect to it with 'telnet' program.
Note that only one client can connect to ths server!
*/

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

#define BUFFERSIZE 1024

int main(int argc, char *argv[]) {


int sock,clientconn;
int port=8080;
struct sockaddr_in server,client;
char buf[BUFFERSIZE];
int retval,addrlen;

/*Create socket*/
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Error creating socket.");
exit(1);
}

/* Bind socket to port */


server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(port);
if (bind(sock, (struct sockaddr *)&server, sizeof(server))) {
perror("Error binding soket");
exit(1);

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 24/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
}
printf("Server is started at port %d \n", ntohs(server.sin_port));

/* Indicate how many clients may wait on the queue*/


listen(sock,5);

/*Start accepting connections, one after the other*/


for ( ; ; ) {
clientconn = accept(sock, (struct sockaddr *)&client, &addrlen);
if (clientconn == -1)
perror("Error accpting client connection");
else {
printf("A client connection is accepted from %s port %d\n",
inet_ntop(AF_INET, &client.sin_addr, buf, BUFFERSIZE),
ntohs(client.sin_port));
do {
bzero(buf,BUFFERSIZE);
retval= read(clientconn,buf,BUFFERSIZE);
if (retval < 0)
perror("Error reading from client socket");
else
if (retval == 0)
printf("Client ended connection\n");
else {
printf("Message from client: %s\n", buf);
if (write(clientconn,buf,strlen(buf)) < 0)
perror("Error echoing back to client");
else
printf("Message successfully echoed back to client\n");
}
} while (retval > 0);
}
}
}

stemci de aadadr:
/* TCP client example

Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr

Run the program with ahost name and page path:


$ progname cs.bilgi.edu.tr /
*/

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

#define BUFFERSIZE 1024

int main(int argc, char *argv[]) {


int sock;
struct sockaddr_in server;
struct hostent *hp;
char buf[BUFFERSIZE];
int retval;

/*Create socket*/
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Error creating socket.");
exit(1);
}

/* prepare HTTP server address */


server.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
if (hp == 0) {
perror("Cannot resolve host");
exit(1);
}
memcpy( (char *)&server.sin_addr, hp->h_addr, hp->h_length);
server.sin_port = htons(80);

/* Connect to server */
if (connect(sock, &server, sizeof(server)) < 0) {
perror("Error connecting to server");
exit(0);
}

/* send HTTP request */


sprintf(buf, "GET %s HTTP/1.0\r\n\r\n\r\n", argv[2]);
if (write(sock, buf, strlen(buf)) < 0)
perror("Error sending HTTP request");
else {
printf("Request sent, waiting for reply.\n");
do {
bzero(buf, BUFFERSIZE);
retval = read(sock, buf, BUFFERSIZE);
printf("XXX");
if (retval > 0)
printf("%s", buf);
} while (retval > 0);
}
}

6.5 Ezamanl (ok-izlekli, multi-threaded) TCP sunucu rnei


http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 25/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
Yukardaki rnek sunucular ayn anda sadece bir istemciye cevap verebiliyor. imdi bunlarn ezamanl, yani ok-zilekli/multi-threaded versiyonlarn grelim. Bu
sunucular yukardaki istemcilrle kullanabilirsiniz, istemcide bir deiiklik gerekmez.

6.5.1 Java ok-izlekli sunucu


Java'da yazlm ok-izlekli sunucumuz u ekilde:
/*
* Single threaded Echo Server which can serve only a single client at once.
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/
import java.net.*;
import java.io.*;
import java.util.ArrayList;

class Handler implements Runnable {


Socket clientSocket;
public Handler(Socket clientSocket) {
this.clientSocket=clientSocket;
}
public void run() {
try{
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
String inputLine, outputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Got msg from client : "+inputLine);
outputLine = inputLine;
out.println(outputLine);
out.flush();
if (inputLine.indexOf("exit")>=0)
break;
}
System.out.println("Client disconnected");
out.close();
in.close();
clientSocket.close();
}catch(Exception e) {
}
}
}

public class TCPEchoServerConcurrent {


public static void main(String[] args){
if (args.length<1) {
System.out.println("Usage:");
System.out.println(" TCPEchoServer portno");
System.exit(0);
}
ArrayList<Thread> threads=new ArrayList<Thread>();
try {
System.out.println("Opening server socket at port : "+args[0]);
ServerSocket serverSocket = new ServerSocket(Integer.parseInt(args[0]));
System.out.println("Accepting clients");
while (true) {
Socket clientSocket = serverSocket.accept();
clientSocket.setReceiveBufferSize(1500);
System.out.println("Client accepted. Remote address:"+clientSocket.getInetAddress());
Thread t=new Thread(new Handler(clientSocket));
threads.add(t);
t.start();
}
//serverSocket.close();
} catch (Exception e) {
System.out.println("Something went wrong!");
System.out.println(e);
for(int i=0;i<threads.size();i=i+1)
try {
threads.get(i).join(); //wait for the thread
}catch(InterruptedException ie) { //if CTRL-C is pressed
System.console().format("Interrupted");
}
}

}
}

6.5.2 Python ok-izlekli sunucu

Python'da yazlm ok-izlekli sunucumuz ise u ekilde:


#!/usr/bin/python3
# Concurrent Echo Server
# Author : Mehmet Gencer, mgencer@bilgi.edu.tr
import sys, socket, threading

if len(sys.argv)<3:
print("Usage:")
print(sys.argv[0]+" hostnametobind portno")
sys.exit(0)

def myhandler(conn,addr):
while 1:
try:
data = conn.recv(1024)
if not data: break
print("Data received from ", addr," : ", data)
conn.sendall(data)
except:

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 26/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
print("Client disconnected :",addr)

serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


mySide = (sys.argv[1],int(sys.argv[2]))
serverSocket.bind(mySide)
serverSocket.listen(5)
print("Accepting clients...")
while 1:
conn, addr = serverSocket.accept()
print('Connection from', addr)
t=threading.Thread(target=myhandler,args=[conn,addr])
t.setDaemon(True)
t.start()

6.5.3 C fork() kullanan ok-sreli sunucu


C'de yazlm sunucu yine yap olarak benzemektedir. Ancak burada izlek kitaplklarnn dikkat datmasn engellemek iin izlek yerine fork() ile yaplan ok-
sreli bir rnek tercih ettim:
/* TCP server program: Concurrent version

Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr

This program simply echoes back what the client sends.


To test it connect to it with 'telnet' program.
The program uses fork() calls to serve multiple clients concurrently.
*/

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

#define BUFFERSIZE 1024

int main(int argc, char *argv[]) {


int sock,clientconn;
int port=8080;
struct sockaddr_in server,client;
char buf[BUFFERSIZE];
int retval,addrlen;

/*Create socket*/
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Error creating socket.");
exit(1);
}

/* Bind socket to port */


server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(port);
if (bind(sock, (struct sockaddr *)&server, sizeof(server))) {
perror("Error binding socket");
exit(1);
}
printf("Server is started at port %d \n", ntohs(server.sin_port));

/* Indicate how many clients may wait on the queue*/


listen(sock,5);

/*Start accepting connections, one after the other*/


for ( ; ; ) {
clientconn = accept(sock, (struct sockaddr *)&client, &addrlen);
if (clientconn == -1)
perror("Error accepting client connection");
else {
printf("A client connection is accepted from %s port %d\n",
inet_ntop(AF_INET, &client.sin_addr, buf, BUFFERSIZE),
ntohs(client.sin_port));
printf("Now I will fork to serve that client.\n");
if (fork()== 0) { // THE CHILD PROCESS
do {
bzero(buf,BUFFERSIZE);
retval= read(clientconn,buf,BUFFERSIZE);
if (retval < 0)
perror("Error reading from client socket");
else
if (retval == 0)
printf("Client ended connection\n");
else {
printf("Message from client: %s (serving process: %d)\n", buf,getpid());
if (write(clientconn,buf,strlen(buf)) < 0)
perror("Error echoing back to client");
}
} while (retval > 0);
printf("The child process is exiting\n");
exit(0);
}
}
}
}

7 A topolojileri ve Sre Modelleri

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 27/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
A uygulamalar olduka farkl ihtiyalarla karmza karlar. Bu ihtiyalara gre a yaps ve adaki ilemleri destekleyecek sreler ekillenir. Bu blmde a
uygulamalardaki baz tercihler ve bunlara karlk gelen program ve srelerin tasarm konusunu kimi zaman rnek senaryolar zerinden bir snflandrmaya
oturmaya alacaz.

Sre tasarm esasen tercih zerinden belirlenir:

1. Paket veya ak tabanl iletiim kullanm: Kimi uygulamalarn gereksinimleri birine, kimisi dierine uygunken bazlar ikisi arasnda tercih yapmaya olanak
verir. rnein ses/grnt iletiimi aktaki nadir karklk veya paket kayplarn tolere edebildiinden ikisine de uygundur. Oysa dosya aktarm sra
bozulmas veya kayplara izin vermediinden ak tabanl iletiim gerektirir.
2. stemcilerin biribiriyle ilikisi olup olmamas: Kimi durumalarda istemcilerin eylemleri biribirinden tamamen bamszdr, oysa sohbet sunucusu gibi
durumlarda istemciler biribiriyle iliki kurarlar. Bu durumda sre tasarm farkllar.
3. Uygulamadaki istemci says uygulamann sre tasarmn etkiler. Binlerce, hatta daha fazla istemci szkonusuysa zel teknikler kullanmak gerekecektir.

Farkl senaryolardaki ihtiyalar kimi durumlarda ak veya paket tabanl iletiim arasnda tercih yapma imkan verebilir. Bu gibi durumlarn uygulamann servis
yk ve bununla ilikili olarak sre modeliyle ilikili olarak ele alnmas gerecekektir.

imdi bu tercihleri baz ablon senaryolar zerinden ele alacaz.

7.1 Birebir iletiim


Burada iki ucun ayn anda sadece biribiriyle iletiim kurmas szkonusudur. Dolaysyla lekleme sorunu yoktur. letiim tek ynl, ift ynl olabildii gibi ift
ynl durumda iki taraf senkron veya asenkron da alabilir.

ekilde gsterilen modellerde iki taraftaki izlekler daireler ile temsil edilmitir. Senktron modelde iki tarafn ilemleri senkronizedir. Dolaysyla iki tarafn
birleiminden oluan sre esasen tek bir sral (sequential) sre gibi almaktadr. Oysa asenkron srelerde veri gnderme ve alma ilemleri sral deildir, bu
yzden ikini de idare etmek iin birden fazla izlek (thread) gerekir.

Birebir iletiim sre modelleri

Szkonusu modeller hem paket hem de ak tabanl iletiim iin geerlidir.

7.1.1 rnek (tek ynl, ak tabanl): netcat??


Linux sistemlerinde bulabileceiniz netcat tr programlar bir utan dier uca dosya aktarm iin kullanlrlar.

7.1.2 rnek (ift ynl, senkron, ak tabanl): uzaktan komut satr

Telnet tr basit bir program uzaktaki bir sistemde komut altrp ktlarn geriye getirir. Byle bir programn ak tabanl olmas kanlmazdr. Komut-cevap
eklinde ilediinden senktron alacaktr.

7.1.3 rnek (ift ynl, asenkron, paket tabanl): Sesli (audio) iletiim

Burada problemimiz iki bireyin karlkl sesli iletiim kurmas. Bu rneimizin yukardakinden temel fark (1) iki tarafl veri ak olmas, ve (2) gizlilik gereksinimi
olabilmesi. Ancak ikinci gereksinimi yoksayarsak yine paket tabanl (UDP) yapabiliriz. Buradaki fark iki srecin de ift izlekli olmasdr.

7.2 Yayn
Yayn yapma UDP kullanarak yaplr. Yerel alarda DHCP servisi, veya aa bal yazclarn kendini duyurmas gibi durumlarda yaygn olarak kullanlr. Ayrca yine
yerel alarda mzik/grnt aklarnn da yayn yaplabilir. Bu gibi durumlarda bilinmeyen sayda alc olduu halde gnderici asndan bir nemi yoktur ve sre
tek izlekli yaplabilir.

7.2.1 rnek: Yerel a mzik yayn

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 28/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
Yerel adaki alclara mzik yayn yapmak istiyoruz. Burada akmas istenilen ierik, yani dijital mzik, srekli ve olduka youn bir veri ak gerektirmektedir. te
yandan mzik, ses, ve grnt ak, rnein belge dosyalarnn aktarmndan farkl olarak hatalar tolere edebilir. Yani mzik ak srasnda nadiren de olsa arada
kesintiler ve bozulmalar olmas belirli bir lde tolere edilebilir. Oysa bir zengin metin dosyasnda byle bir bozulma ieriin btnln kabul edilemez ekilde
zedelerdi.

Dijital mzik ak doal olarak ak tabanl bir soket kullanmay akla getirir. Oysa ok sayda alcnn herbiriyle ak yrtme ar bir yk getirir. Ayrca sre
tasarm da performans zorluklaryla karlar. Byle bir senaryoda ak yerine paket tabanl bir dijital mzik datmn tercih etmek sorunu byk lde
zecektir. TCP yerine UDP kullanabiliriz. Bu durum (1) zaman zaman paket kayplar riski tasa da bunun tolere edilebileceini biliyoruz, ama (2) te yandan eer
"gizlilik" gerekiyorsa TCP'nin aksine UDP bize tama dzeyinde bir gizlilik imkan salamaz. imdilik gizlilik kriterinin olmadn varsayacaz, ancak illa ki
gerekiyorsa bu durumda geriye sadece IP dzeyi gizlilik mekanizmalar kalacaktr.

Bu problemde tek tarafl bir iletim (iletiim deil) szkonusu olduundan paket aknn iki tarafndaki srelerin tek izlekli olmas yeterli olacaktr (sre model 1).
rnek bir program Java dilinde aada verilmitir (Not: rnek tam olarak almyor!):
/*
* Simplistic Java music broadcasting over UDP, where server and client are threads of the same process.
* For a better working program, one would need to figure out how to transfer Audio file format to client.
* Author : Mehmet Gencer, mgencer@cs.bilgi.edu.tr
* Date: 2010
*
*/

import java.net.*;
import java.io.*;
import java.util.*;
import javax.sound.sampled.*;
import javax.sound.sampled.AudioSystem.*;
import javax.sound.sampled.DataLine.*;

/**
* Ald paketleri bir mzik dosyasna yar. i bitince almaya balar.
*/
class MPListener implements Runnable{
private static final int BUFFER_SIZE=500000;
private int port;
private DatagramSocket socket;
private File outfile;
public MPListener(int port, File outfile) {
this.port=port;
this.outfile=outfile;
}
public void run() {
FileOutputStream stream=null;
try {
stream=new FileOutputStream(outfile);
socket=new DatagramSocket(port);
socket.setSoTimeout(10000);//wait ten seconds of no data transfer to start playing
socket.setReceiveBufferSize(BUFFER_SIZE);
byte[] receiveBuffer=new byte[BUFFER_SIZE];
while(true) {
DatagramPacket receivePacket=new DatagramPacket(receiveBuffer, receiveBuffer.length);
try {
socket.receive(receivePacket);
} catch (SocketTimeoutException e) {
System.out.println("Broadcast seems to have been stopped");
stream.close();
break;
}
stream.write(receiveBuffer,receivePacket.getOffset(),receivePacket.getLength());
socket.setSoTimeout(500);//be less patient once started
}
stream.close();
MPlayer player=new MPlayer(outfile);
player.run();

} catch(Exception e) {
System.out.println(String.format("MPListener error : %s",e));
e.printStackTrace();
return;
}
}
}

class MPlayer implements Runnable{


private File infile;
private FileInputStream instream;
SourceDataLine dataLine;
private static final int BUFFER_SIZE = 500000;
public MPlayer (File infile) {
this.infile=infile;
}

public void run() {


System.out.println("Listener has started");
try {
//instream=new FileInputStream(infile);
int c=0;
while (infile.length()<10000 &&c++<100)
Thread.currentThread().sleep(100);
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(infile);
AudioFormat audioFormat = audioInputStream.getFormat();
Info info = new Info(SourceDataLine.class, audioFormat);
dataLine = (SourceDataLine) AudioSystem.getLine(info);
dataLine.open(audioFormat, BUFFER_SIZE);
dataLine.start();
int readBytes = 0;
byte[] buffer=new byte[BUFFER_SIZE];
while (readBytes != -1) {
readBytes = audioInputStream.read(buffer, 0,
buffer.length);
if (readBytes >= 0)
dataLine.write(buffer, 0, readBytes);

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 29/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
}
} catch (SocketTimeoutException e) {
System.out.println("Broadcast seems to have been stopped");
dataLine.stop();
} catch(Exception e) {
System.out.println(String.format("Listener error : %s",e));
e.printStackTrace();
dataLine.stop();
return;
}
}
}

class Broadcaster {
DatagramSocket socket;
int port;
String filename;
Broadcaster(String filename,DatagramSocket socket,int port){
this.socket=socket;
this.port=port;
this.filename=filename;
}
void broadcast() {
try {
InetAddress broadcastAddress=InetAddress.getByName("255.255.255.255");
socket.setBroadcast(true);
File file=new File(filename);
int EXTERNAL_BUFFER_SIZE = 1500;
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
AudioFormat audioFormat = audioInputStream.getFormat();
Info info = new Info(SourceDataLine.class, audioFormat);
int readBytes = 0;
byte[] buffer = new byte[EXTERNAL_BUFFER_SIZE];
int total=0;
while (readBytes != -1) {
readBytes = audioInputStream.read(buffer, 0,
buffer.length);
if (readBytes>0) {
DatagramPacket packet=new DatagramPacket(buffer,readBytes,broadcastAddress,port);
socket.send(packet);
}
total+=readBytes;
System.out.print(String.format("\rSent:%d",total));
Thread.currentThread().sleep(8);

}
//dataLine.stop();
}catch(Exception e) {
System.out.println(String.format("Announcer error : %s",e));
e.printStackTrace(System.out);
System.exit(0);
}
}
}

public class MusicBroadcast {


public static void main(String[] args){
if (args.length<1) {
System.out.println("Usage:\n MusicBroadcast mode port [wavfile]");
System.out.println(" mode: 0 server, 1 player");
System.exit(0);
}
int mode=Integer.parseInt(args[0]);
int port=Integer.parseInt(args[1]);
String filename=null;
if (args.length>2) {
filename=args[2];
}
try{
if (mode==1) {
File tempfile=File.createTempFile("mplayer",".wav");
MPListener listener=new MPListener(port,tempfile);
Thread lthread=new Thread(listener);
lthread.start();
}else
new Broadcaster(filename,new DatagramSocket(),port).broadcast();
}catch(Exception e) {}

}
}

7.3 Sunucu ve bamsz istemciler


Kimi sunucular birden fazla istemciye ezamanl olarak servis verdii halde bu istemcilerin aralarnda bir iletiim yoktur. stemcilerin birinin yapt ilemler
dierleriyle bir etkileim, veya ortak verilerin kullanmn iermez.

Paket tabanl bir sunucu ise tek izlekle yaplabilir. Daha nce yaptmz tarih-zaman sunucusu buna bir rnektir.

Ak tabanl bir sunucuyu ise ok-izlekli (multi-threaded) olarak yapabiliriz (istemci says ok fazlaysa bu tekniklerin dikkatle kullanlmas gerekir, ki bu konuya
gelecek blmde deineceiz). Byle bir sunucu tipik olarak u dngy ierir:
sunucuSoketi = olutur()
sunucuSoketi.bala(port)
sunucuSoketi.dinle(sra uzunluu)
dng:
istemciSoketi = sunucuSoketi.kabulEt()
yeni izlek veya fork() ile yeni sre olutur ve istemciSoketi'ne servise bala
...

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 30/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
...
servis(istemciSoketi):
dng:
oku
cevapla

Ortaya kan sre modeli ekilde grselletirilmitir. Burada servis sreleri biribirinden tamamen bamsz olarak grlmektedir.

Birebir iletiim sre modelleri

7.3.1 rnek: HTTP sunucusu ve Python st dzey sunucu soket kitapl


HTTP belgelerin (HTML olsun ya da olmas) aktarlmas iin bir protokoldr. Dolaysyla paket kayplar tolere edilemez ve ak tabanl (TCP) balant kullanlmas
kanlmazdr. Bir istem alnp cevaplandktan sonra balant kesilmektedir. Bu durumda tek izlekli bir sunucunun istemcileri srayla yantlayabileceini
dnebilirsiniz. Ne var ki istemcilerin -kimisi uzun olabilen- dosyalar almas farkl zamanlar alacandan ezamanl servise hazr olmak en dorusudur.

Aadaki rnek son derece basit bir HTTP sunucusunu Java ile gerekletirmektedir.
/**
* A simplistic multi-threaded HTTP server.
* Author:Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/
import java.io.*;
import java.net.*;
import javax.net.*;
import javax.net.ssl.*;
import java.security.*;
import java.util.*;

class ClientHandler implements Runnable{


Socket socket;
ClientHandler (Socket socket) {
this.socket=socket;
}
public void run() {
//Socket clientSocket;
System.out.println("Serving client");
try{
BufferedReader in =
new BufferedReader(
new InputStreamReader( socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
String request, response;
request=in.readLine();
StringTokenizer st = new StringTokenizer( request );
try {
st.nextToken();
String path=st.nextToken();
File f=new File("."+path);
//write out HTTP headers. This simple server does not support MIME types
out.write("HTTP/1.0 200 OK\r\n");
out.write("Content-Length: " + f.length() +"\r\n");
if (f.isDirectory()){ //Produce a directory listing
out.write("Content-Type: text/html \r\n\r\n");
for (String s: f.list())
out.write(String.format("<a href=%s>%s</a><br/>\n",s,s));
} else {
out.write("Content-Type: text/plain \r\n\r\n");
FileInputStream file=new FileInputStream(f);
try {
while(true)
out.write(file.read());
}catch(Exception ignore) {}
}
} catch(Exception e) {
System.out.println(e);
}
out.close();
in.close();
socket.close();
} catch(Exception e) {

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 31/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
System.out.println("Something went wrong!");
System.out.println(e);
}
}
}

class Server implements Runnable {


ServerSocket socket;
List<Thread> clients;
Server(ServerSocket socket) {
this.socket=socket;
clients=new LinkedList<Thread>();
}
public void run() {
Socket clientSocket;
try {
socket.setSoTimeout(1000);
while(true) {
try {
clientSocket=socket.accept();
Thread clientThread=new Thread(new ClientHandler(clientSocket));
clientThread.setDaemon(true);
clientThread.start();
clients.add(clientThread);
}catch(SocketTimeoutException e) {
if (Thread.currentThread().interrupted())
return;
}
}
}catch(Exception e) {
e.printStackTrace();
System.out.println(e);
}
}
}
public class HTTPserver {
public static void main(String[] args) {
System.out.println("Usage:\n HTTPserver [port] (default 8080)");
int port=8080;
try {
port=Integer.parseInt(args[0]);
} catch(Exception e) {}
try {
Thread serverThread=new Thread(new Server(new ServerSocket(port)));
serverThread.start();
System.console().readLine("Press ENTER to stop server.");
serverThread.interrupt();
} catch(Exception e) {
System.out.println("Something went wrong!");
System.out.println(e);
}
}
}

Bu ok tipik bir senaryo olduundan Python gibi birok programlama dilinde bu senaryoya uygun kitaplklar bulunur. Dolaysyla daha nce hem soket hem de
oklu-izlek ynetimini elle yaptmz programlar daha basite yazabiliriz. Aada bir HTTP sunucusu iskeletini grebilirsiniz (bu sunucu dosyay bile
sunmamaktadr!). Bu program Python SocketServer kitapln kullanyor. Bu kitaplk soketleri ve sreleri elle ynetmek yerine tipik bir dngde kabul edilen
istemciye servis verecek sreci dorudan tanmlamamz salyor. Ayrca yeni servis srelerinin tercihan izlek (thread) ile altrlmasn da seebiliyoruz ama
sreleri bizim ynetmemize gerek kalmyor:
import socketserver, threading

class MyRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
firstLine = str(data)
requestedFile=firstLine.split()[1]
cur_thread = threading.current_thread()
response = "You have requested %s"%requestedFile
self.request.send(response.encode())
print("Service: %s, %s: %s" % (self.server,cur_thread.getName(),requestedFile))

class MyTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):


pass

server = MyTCPServer(("localhost", 8081), MyRequestHandler)


server_thread = threading.Thread(target=server.serve_forever)
server_thread.setDaemon(True)
server_thread.start()
print("Server loop running in thread:", server_thread.getName())
input("Press Enter to exit:")
server.shutdown()

Bu rnekte SocketServer ad verilen st-dzey kitaplktan ThreadingTCPServer isimli snf kullandk. Bu snf bizim sunucu soketi oluturma, balama, accept() ile
balant kabulu ve her istemci balant soketi iin bir izlek yaratma ilemlerini "tipik senaryo" ablonu dahilinde yapmaktadr, ve bu sayede programmz hem
ksalyor hem de uygulama mantna odaklanabiliyor. Her istemci balants kurulduunda bizim belirttiimiz "MyRequestHandler" snfndan bir nesne yaratlyor.
Hemen sonrasnda gelen veri ak iin "handle()" metodu arlyor. Dolaysyla bu metod bizim istemci servis dngmze karlk geliyor, yani asl servise zgn
kodun yazld ksma. Bu sayede tipik ve tekrarlanan soket kodlarndan kurtuluyoruz.

7.4 Sunucu ve baml istemciler


Kimi tr servislerde birden fazla istemciye ezamanl servis verilmekle kalmaz ayrca istemcilerin aralarnda iletiim szkonusudur. Sohbet sunucusu bu tr bir
ihtiyaca tipik bir rnek oluturur.

Bu sunucuda ilemlerin ak yukardakine benzer. Tek farkla ki istemcilere servis veren sreler izlek/thread ile yaratlmak zorundadr. Ancak bu durumda bu
izlekler ortak verilere eriebilir ve dolaysyla biribirleriyle de etkileim kurabilirler. Bunun sebebi ok-izlekli srelerin hepsinin ortak bir "heap" alann, yani en zt
dzey (global scope) verilerin bulunduu bellek alann paylaabilmeleridir (ekilde grlyor). Bu durum fork() ile oluturulan sreler iin geerli deildir.

!Sunucu ve baml istemciler sre modelleri](images/model-sunucubagimli.png)

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 32/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
7.4.1 rnek: Sohbet sunucusu (Python st dzey soket kitapl ile)

Aadaki rnek yuakrda grdmz Python'daki SocketServer kitapln kullanmaktadr. Bu servisi kullanmak iin standart telnet programyla balanabilirsiniz.
rneimiz son derece basittir, zel yazma gibi komutlar vb. iermiyor.
"""
A Simple chat server (concurrent).

Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr

Run by giving the port number as argument.


"""

import SocketServer, sys

clients={}

class MyRequestHandler(SocketServer.StreamRequestHandler):
def setup(self):
print "New connection from ", self.client_address
clients[self.client_address]=self

def finish(self):
del clients[self.client_address]

def handle(self):
while 1:
data = self.request.recv(1024)
print "Message from ", self.client_address, " : ", data
for c in clients.values():
c.request.send("%s : %s " % ( str(self.client_address), data))

port = int(sys.argv[1])
server = SocketServer.ThreadingTCPServer( ("localhost",port) ,MyRequestHandler)
print "Server started at port", port
server.serve_forever()

Bu rnekte yine "MyRequestHandler" snfmz var. Ancak bu kez istemci balants kurulduunda, "handler()"dan hemen nce ve sadece bir kez altrlan
"setup()" metodunu kullanyoruz. Yine benzer ekilde istemci balanty kesince bir kez arlan "finish()" metodunu da kullanyoruz.

Bu sunucu programdaki "clients" deikenine dikkatinizi ekerim. En zt dzeydeki bu deikende bal bulunan istemcilerin soketlerinin bir listesi bulunur, ve tm
istemciler de bu deikene eriebilmektedirler. ok izlekli srelerde bu tr deikenler "heap" ad verilen ve izleklerin hepsinden eriilebilen bir bellek alannda
tutulurlar. Tam da bu sayede istemci servis sreleri biribirlerinin soketine yazabiliyorlar. nk dosya tanmlayc (file descriptor) da dier deikenlerden farkl
deildir, ve ortak bir heap varsa ortak kullanlabilir.

Programmzdaki setup() metodu her yeni yaratlan istemci servis nesnesini (MyRequestHandler nesnesinin kendisi) "clients" st dzey deikenine kaydediyor, ve
finish() metodu da oradan kartyor. Bu sayede istemciler kendileri dahil tm istemcilerin gncel listesini o deikende bulabiliyor. Bu kitapla zgn olarak her
istemci soketi MyRequestHandler nesnesinin "request" alannda tutuluyor (bir dosya tanmlayc/file descriptor). stemciler bylece dier istemcilerin soketlerini
kullanp "send()" metodu ile onlara veri aktabiliyorlar. stemci servis sreci kendi istemcisinden veri geldiinde tm istemcilere bunu gndererek ilevini yerine
getiriyor.

7.4.2 rnek: Grup scribble

Bu rnekte bir grup bireyin bir izim paneli zerinde beraber alabilmesini istiyoruz. Bir bireyin yapt izimin paracklarnn dier bireylere de iletilip orada da
panele yanstlmas gerekiyor. Bu kez birden fazla seeneimiz var ve baz kriterlere gre karar vermek gerekiyor. Bu sistemi yerel ada uygulayacaksak UDP
broadcast ile ok basit bir sre ynetimi ablonu kullanabiliriz. te yandan uzaktan kullanabilmek istiyorsak gvenlik (gizlilik deilse bile) sorunu yznden TCP
kullanmak gerekecektir.

Problemin daha ilgin noktas ise lekle ilgili. izimlerin n birey arasnda paylalmas iin her bir bireyin yapt izim paracklarnn kalan 4n-1$ bireye
gnderilmesi gerekir. Bu durumda n (n 1)/2 TCP balants m kurulacak? Bu lekleme asndan problemli bir duruma iaret ediyor. Oysa bu sistemi
sunucu-istemci modeliyle yaparsak ortadaki bir sunucu her bireyden/istemciden gelen bilgileri dierlerine iletebilir. Bylece 1 sunucu n istemci ve toplam n TCP
balants yeterli olacaktr. Gvenlik kriterine gre ayn yap UDP ile de gerekletirilebilir.

Yine bu problemde istemciler birbirleriyle ilikilidirler. Yani birinin yapt eylem (izime bir para ekleme) dierlerini de etkilemektedir. Ama tam da budur.
Dolaysyla TCP ve ok sreli bir program kullanlacaksa bunun veri paylamna izin veren, multi-threading/ok-izlekli bir srele yaplmas zorunludur. te
yandan birden fazla grubun ayn anda ama bamsz izim yapmasna izin verecek bir sunucu her grup iin bir sre (rnein fork() ile) ve grup iinde ok-izlekli
srelerle servis verebilir.

Problemin sadece izim ilemi aadaki Python kodunda rneklenmitir:


#!/usr/bin/python3
"""
A simple scribble program in Python which can draw on the canvas along mouse drags.
See http://www.pythonware.com/library/tkinter/introduction/
Author: Mehmet Gencer
"""
import sys
from tkinter import *
x,y=None,None
count=0
def quit(event):
sys.exit()

def drag(event):
global x,y, count
newx,newy=event.x,event.y
if x is None:
x,y=newx,newy
return
count+=1
sys.stdout.write("\revent count %d"%count)
c.create_line(((x,y),(newx,newy)))
x,y=newx,newy

def drag_end(event):
global x,y
x,y=None,None

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 33/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

root = Tk()
c=Canvas(root)
c.bind("<B1-Motion>",drag)
c.bind("<ButtonRelease-1>",drag_end)
c.pack()
b=Button(root,text="Quit")
b.pack()
b.bind("<Button-1>",quit)
root.mainloop()

Problemi zmek iin bu programda retilen izim "olay"larn ilgili grup yelerine iletmek gerekiyor.

Ayn izim ileminin Java versiyonu aadadr:


/**
* This applet follows mouse drags and sketches its trace.
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*
* To record the line segments that make up the sketch, a linked list is used.
*/
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;

class Scribble extends Canvas implements MouseListener,MouseMotionListener{


int lastX=-1, lastY=-1;
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {}
public void mousePressed(MouseEvent event) {
lastX=event.getX();
lastY=event.getY();
}
public void mouseReleased(MouseEvent event) {}
public void mouseClicked(MouseEvent event) {}
public void mouseDragged(MouseEvent event) {
int currentX=event.getX();
int currentY=event.getY();
if (lastX<0) return;
getGraphics().drawLine(lastX,lastY,currentX,currentY);
lastX=currentX;
lastY=currentY;
}
public void mouseMoved(MouseEvent event) {}
}

public class ScribbleGUI{


public static void main(String[] args) {
Frame myFrame = new Frame( "Scribble" );
Scribble s = new Scribble();
s.addMouseListener( s );
s.addMouseMotionListener( s );
myFrame.add( s );
myFrame.setSize( 600, 600 );
myFrame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent we ) {
System.exit( 0 );
}
} );
myFrame.show();
}
}

Problemin a programlama ksm egzersiz olarak braklmtr.

7.5 Tek istemci ok sunucu


Kimi problemlerde ise kulaa artc da gelse tek bir istemci ve ok sayda sunucu bulunur. Bu tr sistemler tipik olarak datk/paralel bir algoritmay yrtmek
iin kullanlr. Merkezdeki istemci, ya da daha dorusu koordinatr hazrda bekleyen sunuculara iinb paralarn datr ve cevaplarn toplar. paralar farkl
zamanlarda tamamlanabilir. i biten sunucuya eldeki i havuzundan yeni bir i paras verilir.
sunucu ---- Koordinatr ---- sunucu
|
|
sunucu

Bu topolojide Koordinatrn ok izlekli olmas zorunludur, nk tek ve ortak bir i havuzunu ynetmesi gerekir. Sunucularn verilen ii ne kadar zamanda
bitirecei belli deildir, bu yzden i havuzu asenkron bir ekilde ynetilmektedir.

7.6 Peer-to-peer (P2P) topolojisi


Son yllarda olduka yaygnlaan P2P topolojisi zellikle dosya paylam alarnda kullanlmaktadr. Bu alar nemli lde multimedya paylam, ve dolaysyla
byk boyda dosyalar tadndan gnmzde nternet trafiinin nemli bir blmn oluturuyorlar.

P2P alarn temel zellii bir merkezinin olmamasdr. Peer'lar, yani katlmclar ortak bir strateji erevesinde davransalar da aralarndaki balant yapsn,
topolojiyi kontrol eden bir merkez yoktur. Zaten bu topolojinin gc tam da bir merkezi olmamasndan kaynaklanr: risk datlmtr. Baz katlmclarn adan
ayrlmas ada yerel boluklar yaratr ama bir merkez sistemin kapanmas tr ykc bir etki yaratmaz. Bu konuyu ileride datk veri ynetimi ksmnda
inceleyeceiz.

P2P sistemleri esas olarak katlmclarn herbirinin sadece birka dier katlmcya bal olduu sistemlerdir:
|
|
P-----P P
| \ /

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 34/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
| \ /
P-----P-----P

Dolaysyla her katlmc sre zerindeki performans yk azdr. Bu alar genellikle paket tabanl iletiim kullandklarndan temel sre, rnein dosya arama
ilemi, tek izlekli alabilir. Ancak bir kez dosya aktarm balants gerektiinde ak balants kurulur ve her bir ak ynetmek iin ek sre izlekleri
gerekecektir. Bunun rneklerini de detayl olarak ileriki blmlerde inceleyeceiz.

8 Yksek performansl sunucular: zlek havuzu (thread-pool) ve asenkron


programlama
HTTP probleminin problemin belirleyici zellii istemcilerin pek te sabrl saylamayacak bireyler olmas ve ilemin abuk sonulandrlmas ihtiyac. Ayrca her
istemcinin ii (eer sistem fazla ykl deil, istenen dosya ar byk deilse) ksa srede biter. Bu durumda problemin can alc noktas servis srelerinin naasl
yaratlp yokedilecei konusudur.

8.1 Sreli ve srekli grevlerin fark


Bu konuda uygulamadaki en iyi zmlerden biri izlek havuzu (thread-pool) kullanmdr. Bu yntemde servis iin yaratlan izlekler yokedilmez, ii bitince yeni
istemlere cevap vermek iin tekrar grevlendirilir. Bylece izlek yaratma ve yoketmeden kaynaklanan sistem yk ortadan kaldrlr. Ayrca izlek says kontrol
altnda tutularak sistemin ar yklenme durumlarnda servis hz dse bile ar ykten dolay kilitlenme riski kontrol altna alnr. Ancak izleklerin grevden
greve geebilmesi iin szkonusu grevlerin "sreli" olmas, yani bir sre sonra bitecek olmas gerekir. zellikle paket tabanl grevler (bir DNS sorgusunun
cevaplanmas, vb.) bu trdendir. Daha nadir de olsa HTTP gibi kimi ak tabanl uygulamalarda da sreli grev szkonusu olabilir.

Buna karlk "srekli" grevler diyeceimiz dier grev kategorisi ak tabanl servislerde grlr. Burada istemciden gelen akn srekli dinlenmesi szkonusudur.
rnein istemcinin keyfine gre devam eden sohbet servisinin sunucusu veya uzun sren bir dosya transferi gibi. Bu durumlarda tm aklarda ne olup bittiine ayn
anda gz atmak ve veri trafii olan aklar iin servis ilemlerini yapmak iin tasarlanm olan bir yntem tasarlanr. Aslnda iletim sistemlerine dosya tantclar
(file descriptor) ve yava ileyen sabit disk gibi cihazlar kontrol etmek iin gelitirilmi bu mekanizma a soketleri iin de kullanlmaktadr.

Gerekletirilmek istenen servisin gereksinimlerine bal olarak iki tekniin birarada kullanm da mmkndr.

8.2 Sreli grevler: grev havuzu ve izlek havuzu


Sreli grevleri daha nceki sunucularmzda (rnein tarih zaman sunucusu) tek bir izlekle gerekletirmitik. Yaptmz uygulamada sunucu u ekilde
alyordu:
dng:
grev=soket.oku()
cevap=gerekletir(grev)
soket.yaz(cevap)

Oysa kimi durumlarda bu sunucunun gerekletirme adm biraz uzun srebilir. Bu arada soketten gelen paketlerin kamas veya sradaki istemcilerin uygulamann
gereklerine gre fazla bir sre bekletilmesi szkonusu olabilir. stelik bu yavalama ou zaman CPU'nun yavalndan deil, cevab retmek iin yaplan
ilemlerin bir paras olan dosya okuma, vb., admlarnn ardk (senktron) bir sre tarafndan yaplmasndan kaynaklanr. Yani bilgisayar sisteminin tam gc
kullanlamam olur.

Byle bir durumla baa kmak iin grevleri bir havuz olarak ynetmek ve o havuzdaki grevleri tketen birden fazla izlek kullanmak geerli bir yntemdir. Ancak
her greve karlk bir izlek yaratmann daha nceki blmde grdmz potansiyel skntlar var: izlekler de sistem kaynaklarn kullanr ve saylar kontrolsz
ekilde artarsa tam da en ihtiya duyulan zamanda bizzat izlekler sistemi kilitler.

Bu sorun gelen grevleri -sral- bir havuza atmak ve snrl sayda grevli srecin bu havuzdan grevleri alp yerine getirmesini salayarak yukardaki trden bir
"rndan kma"y engellemektir. retici/tketici rnts (producer/consumer pattern) denilen bu teknik esasen bir fabrikadaki retim hattnda grlen birok
aamadan birini temsil eden jenerik bir yntemdir.

Grev havuzu ynetimi

Elbette bu yntem uygulanrken retici ve tketici says probleme gre ayarlanr. Kimi zaman tek retici, kimi zaman da tek tketici bulunabilir. Ama her zaman
iin herbir tketici ve retici biribirindne bamsz, paralel almaktadr, ki biz bunu genellikle izleklerle yapacaz (bu paralelliin birden fazla bilgisayara
yaylmas da mmkndr).

Byle bir ok-izlekli sre altrlrken elbette i havuzuna giri klarn uygun ekilde veri senktronizasyonuna tabii tutulmas gerekiyor. Yoksa grevlerin
kaybolmas veya ayn grevin iki tketici tarafndan yaplmas gibi kabul edilemes, sistematik d durumlar ortaya kabilir.

Burada greceimiz program rneinde tek bir retici var. rnt u ekilde hayata geirilmektedir:
RETC (Sunucu ana izlei):

izlekHavuzu=yarat(izlek says) //TKETC HAVUZU


iHavuzu=havuz()
sunucuSoket=soket(adres, port)
ZLEK BALAT(TKETC, izlekHavuzu, i havuzu)
dng:
i=sunucuSoket.oku()
iHavuzu.ekle(i) //SENKRON OLMALI

Bu tipik bir senaryodur. Bu yzden programlama dillerinde bunu gerekletirmek iin standart kitaplklar bulunur. Bu kitaplklar hem izlek havuzu ynetimini hem
de i havuzu ynetimini birarada yapmaktadrlar. Java'da java.util.concurrent kitaplnda bulunan Executor snf bize "newFixedThreadPool(boyut)" gibi bir
yntemle istedimiz boyda bir tketici sre havuzu yaratmamza ve daha sonra sadece "i"leri havuza gndermemize olanak veriyor. Dolaysyla izlek havuzu ayn
zamanda i havuzunun ynetimini de yapyor. Bunun iin standart olarak "i"in sadece Java'daki Runnable arayzn gerekletiren bir snf nesnesi olmas yeterli.
Szkonusu kitaplk i havuzunu ynettii iin senkronizasyon meselesini de stlenmektedir.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 35/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
Aadaki rneimiz UDP tabanl bir servis. Sunucu servisine gelen her paket bir tamsay ieriyor ve sunucu buna cevap olarak tamsaynn asal arpanlarn bulup
gnderecek. Bu biraz zaman alan, dolaysyla senaryolarmza uygun bir problem:
/**
* Using thread pools to serve UDP based prime factor finding service
*
* Author: Mehmet Gencer, mgencer@bilgi.edu.tr
*/

import java.net.*;
import java.io.*;
import java.util.*;
import java.util.concurrent.*;

class Factorizer implements Runnable {


DatagramSocket socket;
int n;
InetAddress clientAddr;
int clientPort;
Factorizer (DatagramSocket socket, int n, InetAddress clientAddr, int clientPort) {
this.socket=socket;
this.n=n;
this.clientAddr=clientAddr;
this.clientPort=clientPort;
}
static boolean isPrime(int i){
for(int j=2;j<i;j=j+1)
if (i%j==0)
return false;
return true;
}
public void run() {
ArrayList factors=new ArrayList();
int m=n;
for(int j=2;j<n;j=j+1)
if (isPrime(j))
while (m%j==0) {
factors.add(j);
m=m/j;
}
String answer=factors.toString();
try {
byte[] sendbuffer=answer.getBytes();
DatagramPacket replyPacket=new DatagramPacket(sendbuffer, sendbuffer.length, clientAddr, clientPort);
socket.send(replyPacket);
System.out.println(String.format("Send prime factors of %d as: %s",n,answer));
} catch (IOException e) {
System.out.println(String.format("Error: %s",e));
}
}

class Server{
int port;

public Server (int port) {


this.port=port;
}

public void run() {


byte[] buffer=new byte[1500];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
int poolSize=4;
ExecutorService pool=Executors.newFixedThreadPool(poolSize); //Create a thread pool of given size
try {
DatagramSocket serverSocket=new DatagramSocket(port);
System.out.println("Server waiting");
for(;;) {
serverSocket.receive(packet);
String numstr=new String(packet.getData(),packet.getOffset(),packet.getLength());
System.out.println(String.format("Received request from %s/%d : %s", packet.getAddress(), packet.getPort(),numstr));
int num=new Integer(numstr);
Factorizer factorizer=new Factorizer(serverSocket, num, packet.getAddress(), packet.getPort());
pool.submit(factorizer);
}
} catch(IOException e) {
System.out.println(String.format("Error: %s",e));
}
try {
pool.shutdown();
System.out.println("Awaiting for the thread pool to finish...");
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Thread pool did not terminate in a fair time. Not waiting any longer.");
}catch(InterruptedException ignored) {}
}
}

class Client{
String serverName;
int port;

public Client (String serverName, int port) {


this.serverName=serverName;
this.port=port;
}

public void run() {


try {
DatagramSocket clientSocket=new DatagramSocket();
InetAddress srvAddress=InetAddress.getByName(serverName);
DatagramPacket packet, receivePacket;
byte[] receiveBuffer=new byte[1500];
Random random=new Random();

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 36/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
for (;;) {
Integer num=random.nextInt(100000);
if (num<0) num=-num;
byte[] sendbuffer=num.toString().getBytes();
System.out.println(String.format("Sending %d ",num));
packet=new DatagramPacket(sendbuffer, sendbuffer.length, srvAddress, port);
clientSocket.send(packet);
receivePacket=new DatagramPacket(receiveBuffer,receiveBuffer.length);
clientSocket.receive(receivePacket);
System.out.println(String.format("Received reply from server: %s", new String(receivePacket.getData())));
}
} catch (Exception e) {
System.out.println(String.format("Error: %s",e));
}
}
}

public class ThreadPoolBasics {


public static void main(String[] args) {
if (args.length<1) {
System.out.println("Usage:");
System.out.println(" ThreadPoolBasics [CLIENT servername port] | [SERVER port]");
System.exit(0);
}
if (args[0].equals("CLIENT")) {
new Client(args[1], Integer.parseInt(args[2])).run();
} else {
new Server(Integer.parseInt(args[1])).run();
}
}
}

8.3 Srekli grevler ve asenkron girdi-kt yntemi


nternet'in yaygnlamasyla ezamanl olarak iletim sistemleri ok sayda balant ve onlarn ilemlerini ynetme konusunda problem yaad. Bu konuda retilen ve
hala kullanmda olan zm asenkron girdi kt olarak tabir edilir.

imdiye kadar grdmz, ok izlekli program ablonlar bir soket zerinde bloke olan okuma komutlarna dayanyordu (blocking call). UDP'de yaamadmz bu
problem TCP'de, ak tabanl servislerde szkonusudur. Bu okuma komutu servis srecinin ta ki istemci bir istem gnderene kadar bloke olmasna yolaar. Bu blokaj
sistem kaynaklarn fazla tketmese bile istemci says kadar dinleyici izlek yaratmak zorunda kalrz, ve nihayetinde yksek lekte sistem snrlarna dayanrz.

8.3.1 Yoklama dngs


Asenkron programlama zm ilke olarak iki ekilde uygulanabilir. Bunlardan biri soketlerin zaman-am (timeout) opsiyonunu kullanarak bloke komutlardan
kurtulmaktr:
Sunucu servisi:
sunucSoket=soketA()
istemciSoketleri=boListe()
dng:
if (istemciSoketi=soket.kabulEt(timeout=0):
istemciSoketleri.ekle(istemciSoketi)
for(soket in istemciSoketleri)
if(veri=soket.oku(timeout=0):
... ilem yap ...

Yukardaki program ablonu hem soket balants kurma (accept) hem de okuma aamalarnda soket ilemlerinde zaman amn sfr olarak kullanarak sorundan
kurtuluyor. Ancak bu arada baka bir sorun yaratmaktadr. Programdaki dng bir "yoklama" (poll) dngs. Bu dng sokette hibir faaliyet olmayan zaman
aralklarnda bile srekli ayn -bloke olmayan- ilemleri yapp durduu iin sistemi ar derecede megul etmektedir.

Yoklama dngs ile asenkron soket programlama

8.3.2 Selektrler ve Java yeni girdi-kt kitapl

kinci ve daha umut vaddeden asenkron programlama yntemi ise iletim sistemini ok daha az megul eder. Bu yntem iletim sistemlerine sonradan eklenen
becerilerden yararlanmaktadr.

Bilgisayar donanm ve onunla iie gelien iletim sistemi "kesme" (interrupt) kullanr. Kesme ilemi evresel cihazlarda (disk, a kart, fare, vb.) olan bir olayn
"annda" iletim sistemine haber verilmesidir, ki bu ilem gerekten donanm dzeyinde, CPU'ya giren bir balantya elektrik sinyali gnderilmesiyle yaplr. Kesme
CPU marifetiyle kontrol -mesela bir kullanc izleini vaktinden nce duraklatarak- iletim sistemine aktarr. Sonu olarak iletim sistemi durumdan annda
haberdar olur ve gereini yapma ansna sahiptir.

letim sistemlerinde yaplan ekleme ile iletim sistemi artk dosya-tantc (file descriptor) ile kullanlabilen bir "selektr" temin edebilmektedir. letim sisteminde
bir selektr yaratldktan sonra nce bir veya birden fazla dosya-tantc ve onlarla ilgili olaylar selektre kaydedilir (bizim durumumuzda bunlar sunucu soketi ve
accept() olay ile herbir ilstemci soketi ve onlarn read() olaylar olacak). Bundan sonrasnda iletim sistemi kesmeler geldike eer bu selektr ilgilendiren bir
girdi-kt olay varsa bunu selektre kaydeder. Uygulama srecine kalan i selektrde bir olay olana kadar beklemek (bloke bir ar), ve olay ortaya knca
gereini yapmaktr. Bu sayede birden fazla soket tek bir izlekte ynetilebilir.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 37/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

Selektr kullanm

Bu teknikle yaplan bir rnek aadadr:


/*
* Java New IO library and its use for asynchronous socket programs
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/
import java.net.*;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.util.*;

class Server{
int port;

public Server (int port) {


this.port=port;
}

/**
* This is a simple message acknowledgement service
*/
void service(SelectionKey key) {
SocketChannel socketChannel = (SocketChannel)key.channel();
ByteBuffer buf = ByteBuffer.allocate(1024);
try {
int n=socketChannel.read(buf);
String reply="Message taken\n";
socketChannel.write(ByteBuffer.wrap(reply.getBytes())); //write back
}catch (Exception e) {
System.out.println("Something went wrong during service!");
System.out.println(e);
}
}

public void run() {


try {
Selector selector = Selector.open();
ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
InetSocketAddress socketAddress = new InetSocketAddress("", port);
server.socket().bind(socketAddress);
System.out.println("Accepting clients");
SelectionKey acceptKey = server.register(selector, SelectionKey.OP_ACCEPT);
while (acceptKey.selector().select() > 0 ){
Set readyKeys = selector.selectedKeys();
Iterator it = readyKeys.iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey)it.next();
it.remove();
if (key.isAcceptable()) {
System.out.println("Clienct Accept");
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel clientSocket = (SocketChannel) ssc.accept();
clientSocket.configureBlocking(false);
SelectionKey another = clientSocket.register(selector,SelectionKey.OP_READ|SelectionKey.OP_WRITE);
}
if (key.isReadable()) {
System.out.println("Readable Key");
service(key);
}
if (key.isWritable()) {
//System.out.println("Writable Key");
}
}
}
} catch (Exception e) {
System.out.println("Something went wrong!");
System.out.println(e);
}
}
}

class Client{
String serverName;
int port;

public Client (String serverName, int port) {


this.serverName=serverName;
this.port=port;
}

public void run() {


try{
Socket socket = new Socket(serverName, port);

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 38/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
BufferedReader fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter toServer = new PrintWriter(socket.getOutputStream());
while (true) {
System.out.println("Enter something to send to server:");
String toSend = System.console().readLine();
System.out.println("Sending to server...");
toServer.println(toSend);
toServer.flush();
Thread.sleep(1);
try {
System.out.println("Reading from server...");
String line=fromServer.readLine();
System.out.println("Response:"+line);
} catch (Exception e){
System.out.println("Something went wrong when reading from socket!");
System.out.println(e);
}
}
}
catch(Exception e){
System.out.println("Something went wrong!");
System.out.println(e);
}
}
}

public class NIOExample {


public static void main(String[] args) {
if (args.length<1) {
System.out.println("Usage:");
System.out.println(" NIOExample [CLIENT servername port] | [SERVER port]");
System.exit(0);
}
if (args[0].equals("CLIENT")) {
new Client(args[1], Integer.parseInt(args[2])).run();
} else {
new Server(Integer.parseInt(args[1])).run();
}
}
}

Bu teknikle iletim sisteminin tahamml edebildii sayda istemci balants tek-izlekli bir srele ynetilmektedir. Ancak basit rneimizin iki kusuru var :(1)
istemcilerin balanty kesip kesmediini kontrol edemiyor, ve (2) "durumsuz" bir sunucu, yani istemcilerin gelip giden komutlara gre durum deitirmesini
izleyemiyor.

8.4 "Durumlu" istemcilerde asenkron yntem


Sohbet sunucusu gibi durumlarda yukardaki iskelet program yetersiz kalacaktr. nk istemcilerin durumunu bir yerde tutmuyoruz. Hatta bal olup olmadklarn
bile kontrol etmiyoruz.

Aadaki rnek son derece basit bir sohbet sunucusu olarak durumlu istemci ynetimini gstermektedir.
/*
* Java New IO library and its use for asynchronous socket programs
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/
import java.net.*;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.util.*;

class Server{
int port;
ArrayList<SocketChannel> clients=new ArrayList<SocketChannel>();
public Server (int port) {
this.port=port;
}

/**
* This is a simple message acknowledgement service
*/
void service(SelectionKey key) {
SocketChannel socketChannel = (SocketChannel)key.channel();
ByteBuffer buf = ByteBuffer.allocate(1024);
try {
int n=socketChannel.read(buf);
if (n>0) {
byte[] data = new byte[n];
System.arraycopy(buf.array(), 0, data, 0, n);
System.out.println("Received: " + new String(data));
for (SocketChannel client: clients) { //write to all clients
String tmp=String.format("Message (from %s)",socketChannel.socket().getRemoteSocketAddress().toString());
client.write(ByteBuffer.wrap(tmp.getBytes()));
client.write(ByteBuffer.wrap(data));
}
System.out.println("Reply sent");
}else {
System.out.println("Client disconnected");
String caddr=socketChannel.socket().getRemoteSocketAddress().toString();
clients.remove(socketChannel); //Remove the client from client list
String tmp="Client "+caddr+" disconnected\n";
for (SocketChannel client: clients)
client.write(ByteBuffer.wrap(tmp.getBytes())); //inform all clients
key.cancel();
}
}catch (IOException e) {
key.cancel();
System.out.println("ClientDisconnected");
}catch (Exception e) {

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 39/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
System.out.println("Something went wrong during service!");
System.out.println(e);
e.printStackTrace();
}
}

public void run() {


try {
Selector selector = Selector.open();
ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
InetSocketAddress socketAddress = new InetSocketAddress("", port);
server.socket().bind(socketAddress);
System.out.println("Accepting clients");
SelectionKey acceptKey = server.register(selector, SelectionKey.OP_ACCEPT);
while (acceptKey.selector().select() > 0 ){
Set readyKeys = selector.selectedKeys();
Iterator it = readyKeys.iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey)it.next();
it.remove();
if (! key.isValid()) {
continue;
}
if (key.isAcceptable()) {
System.out.println("Clienct Accept");
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel clientSocket = (SocketChannel) ssc.accept();
clientSocket.configureBlocking(false);
SelectionKey another = clientSocket.register(selector,SelectionKey.OP_READ);
clients.add(clientSocket); //add client to clients list
}
if (key.isReadable()) {
System.out.println("Readable Key");
service(key);
}
/*if (key.isWritable()) {
//System.out.print("W");
}*/
}
}
} catch (Exception e) {
System.out.println("Something went wrong!");
System.out.println(e);
e.printStackTrace();
}
}
}

class ClientListener implements Runnable {


BufferedReader inReader;
Socket socket;
InputStream inStream;
boolean isFinished=false;
public ClientListener(Socket socket) {
this.socket=socket;
try {
inStream=socket.getInputStream();
BufferedReader inReader = new BufferedReader(
new InputStreamReader(inStream));
} catch (Exception e) {
System.out.println("Something went wrong during client listener initialization:");
System.out.println(e);
e.printStackTrace();
}
}
public void run() {
try {
byte[] buf=new byte[1024];
for(;;) {
int n=socket.getInputStream().read(buf);
if (n<0) {
System.out.println("Server terminated connection!");
break;
}
System.out.print(new String(buf,0,n));
}
} catch (Exception e) {
System.out.println("Something went wrong during client listener loop:");
System.out.println(e);
e.printStackTrace();
}
isFinished=true;
}
}

class Client{
String serverName;
int port;

public Client (String serverName, int port) {


this.serverName=serverName;
this.port=port;
}

public void run() {


try{
Socket socket = new Socket(serverName, port);
PrintWriter toServer = new PrintWriter(socket.getOutputStream());
ClientListener cl=new ClientListener(socket);
Thread t=new Thread(cl);
t.start();
while (true) {
System.out.println("Enter something to send to server:");

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 40/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
String toSend = System.console().readLine();
if (cl.isFinished)
break;
System.out.println("Sending to server...");
toServer.println(toSend);
toServer.flush();
}
}catch(Exception e){
System.out.println("Something went wrong!");
System.out.println(e);
System.out.println(Thread.currentThread().getStackTrace());
}
}
}

public class NIOExampleStatefulChat {


public static void main(String[] args) {
if (args.length<1) {
System.out.println("Usage:");
System.out.println(" NIOExample [CLIENT servername port] | [SERVER port]");
System.exit(0);
}
if (args[0].equals("CLIENT")) {
new Client(args[1], Integer.parseInt(args[2])).run();
} else {
new Server(Integer.parseInt(args[1])).run();
}
}
}

8.5 ki tekniin kombinasyonu ile performans arttrm


Yukardaki rneklerimiz sadece programlama tekniklerini rnekliyor. Gerek bir uygulamada her isteme karlk cevaplarn retilmesi belirli bir zaman alacaktr.
ok ekirdekli bir CPU kullanlacaksa ok-izlekli bir sunucu nemli avantaj salar. Bu yzden iki teknii birarada kullanmak gerekir.

Basite sylersek bu tr bir kombinasyon birok ekilde yaplabilir. Bunlarn en basiti ak soket kanallarnn tek bir selektre deil de birka selektr paylatrlmas
ve her bir selektrn bir izlek ile ynetilmesidir.

8.6 Egzersizler
Aadaki uygulamalarn yksek lekte gerekletirilmesinin izlek havuzu ynetmine mi yoksa asenktron programlamaya m daha uygun olduunu belirleyin. Bir
mimari tasarm yapn ve gerekletirin.

1. Bir sunucu/istemci topolojisi uygulamada sunucu paylalan bir "szlk" (map, dictionary) servisi vermektedir. UDP ile balanan istemciler ya bu szle
yeni bir anahtar-deer iftinin eklenmesini ya da bir anahtar'a karlk deer varsa dndrlmesini istemektedirler.

2. Bir sunucu/istemci mimarisinde yaplan bu ksa mesaj uygulamasnda TCP ile balanan istemciler baka kullanclara tek satrlk ksa metin mesajlar
gnderebilmeli ve kendilerine gelen mesajlar alabilmelidirler.

9 A gvenlii
nternet zerinden iletiimde veri paketleri nceden ngrlemeyen rotalardan giderek hedefine ular. Bu yzden bu verilerin ve paket hareketinin kt niyetli ellere
dme ihtimali her zaman vardr. Kontoll bir kampsn ierisindeki iletiimde bile riskler szkonusudur.

Bilgisayar iletiimindeki gvenlik problemleri kabaca yle snflandrlabilir:

letiim taraflarnn zgnl ve kimlik taklidi: iletiim kurulurken kar taraftaki cihaz veya kiinin gereklen iletiim kurmak istenilen muhatap olduundan
(authenticity) nasl emin olabiliriz? nk nternet trafiinin znde gvensiz yaps nedeniyle baz yapsal mdahaleler sonucunda kimliin ve/veya IP
adresinin taklit edilmesi mmkn olabilir (source IP spoofing). Ayrca bir kimlik dorulama ilemi yaplacaksa da hassas bilgilerin (rn. kullanc ifresi)dei
toku edildii bu ilem srasnda bir bakasnn bunlar ele geirmeyeceinden, veya ele geirse bile daha sonra kimlik taklidi iin kullanamayacandan emin
olunmaldr. Bunun dnda gnderilen veri paketlerinin herbirinin "dijital imza" ile imzalanarak kaynann teyit edilmesi de ou zaman arzu edilen bir
durumdur.
letiimin ieriinin gizlilii: doru muhatapla iletiim kurmann ve bilgilerin kaynan teyit etmenin tesinde dei toku edilen bilgilerin tamamen gizli
kalmas da (secrecy) istenebilir. Bu durumda ieriin ifrelenmesi gerekecektir.
letiimin izlenmesi: gizlilik ve kaynak/hedef teyidinden ayr olarak iletiim trafiinin izlenmesi de (traffic monitoring) bal bana bir risk oluturabilir.
Paketlerin ieriini gremese bile kt niyetli biri sadece paket trafiini izleyerek bir kurumsal an yapsn ortaya kartabilir ve daha sonra hassas
noktalarn belirleyerek bu zaaflar kullanabilir.
Paket tekrar (packet replay): letiim srasnda gnderilen bir veri paketi, rnein kullancnn banka sistemine giri yapmas iin gerekli ifre bilgilerini
ieriyor olabilir. Bu paket ierii gizlenmi bile olsa paketin aynen bir kopyasnn baka biri tarafndan yeniden sunucuya yollanmas yoluyla bir etki
yaratlabiliyorsa bu ok riskli olacaktr. A gvenlik sistemi paketlerin tekrar kullanmn engellemelidir. rnein bu tr ilemler tekrar kullanlmayacak bir
kod eliinde yaplmaldr.
letiimin engellenmesi: Web sunucusu gibi herkese ak servisler ar yk altnda kaldklarnda ihtiyac olan kullanclara hizmet veremezler. Bu tr
sunuculara gerekesiz talep bombardman yaplarak saldrlar gerekletirilebilir (Denial of Service, DoS saldrs). Hatt birden fazla bilgisayardan koordineli
olarak ezamanl saldr gelebilir (distributed DoS attack). Bu saldrlarn mucizevi bir zm yoktur. Ancak bu tr rntleri ate duvar (firewall)
aamasnda tespit edip engelleyerek en azndan sunucunun ar yk altnda ezilmemesi salanabilir. Yine de "meru" kullanclarn sknt yaamas
kanlmazdr.
Anonimlik: gvenlik kaygs hisseden kimi kullanclar (rnein bir bask rejiminde yayor olmalar, vb. nedenlerle) nternet iletiimi srasnda kimliklerini ve
IP lokasyonlarn gizli tutmak isteyebilirler. (kimlii gizli tutma ihtiyac)

Bu problemlerin ounun giderilmesi nemli lde ifreleme-kriptografi (cryptography) ve bozma (hashing) yntemlerinin kullanmyla yaplr. Bu blmde
olduka geni olan bu konuya yzeysel de olsa genilemesine bakmaya ve bu tekniklerin pratikte kullanmn rneklemeye alacaz.

9.1 ifreleme (kriptografi) ve Kripto-analiz


ifreleme zellikle askeri ihtiyalarla ok eskiden beri zerinde allm bir yntemdir. Ispartallarn silindire aput sarma yntemlerinden balayp, Romal Julius
Caesar'n (Sezar) ifreleme yntemi, daha sonra 9. yy'dan itibaren Arap ve daha yakn dnemde Fransiz matematikilerin (rn. Vigenere) giderek gelien yntemler
ortaya atmalaryla ilerlemitir.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 41/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
Sezar ynteminde ifre bir saydr. rnein ifre 5 ise gnderilecek mesajdaki her harf yerine alfabede ondan sonra gelen 5. harf konularak ifreleme yaplr. rnein
ifre 5 iin "sabah toplan" mesajn ifreleyelim:
Alfabe : ABCDEFGHIJKLMNOPQRSTUVWXYZ
ifreli: FGHIJKLMNOPQRSTUVWXYZABCDE

mesaj : SABAH TOPLAN


ifreli: XFGFM YTUQFS

9.1.1 Kriptoanaliz
Sezar'n ynteminde bir semboln/harfin mesajda getii her yerde ifreli mesaja ayn karl koymaktadr (rnein her A yerine F). Bu yzden "SABAH" kelimesi
mesajda ka defa geerse gesin hep "XFGFM" olarak ifrelenecektir. Elbette bu ifre en fazla 26 deneme ile "krlabilir". Ama prensip olarak sabit deitirme yapan
bir ifreleme yntemi (substitution cipher) ne kadar karmak olursa olsun kolayca krlabilir.

Kripto-analiz ad verilen ilem ifrelenmi mesajlarn analiz edilerek ifreleme ileminin nasl yapld ve ifresinin ne olduunu bulmak, dolaysyla ifreyi krmak
ilemidir. Sabit deitirme yntemi zellikle kolay bir hedeftir. rnein Trkede en sk kullanlan harf A'dr. Dolaysyla ifreli mesaj analiz edip en sk geen
harfin F olduunu bulduunuzda ifre yavatan krlmaya balam olur. Sonra ikinci en sk geen harfi bulursunuz, vb.

En yaygn tarihsel rnei 19. yy Fransz matematikisi Blaise de Vigenere tarafndan gelitirilen bir yntem olan poli-alfabetik irfreleme bu kripto-analiz zaafn
gidermeye alr. Esasen Sezar ifresini kullanr. Bu yntemde bir ifre kelime vardr. rnein ifre kelimemiz "LMON" olsun. ifre kelime mesajn altn
tekrarlanarak yazlr:
mesaj: SABAHTOPLAN
ifre: LIMONLIMONL

Sezar ifrelemesi yaplrken mesajdaki her harfin altna denkgelen harf Sezar ifresi olarak kullanlr. Olas tm ifreler tabloda gsterilmitir:

Vigenere'nin ifreleme tablosu

Bylece mesajn bandaki "S" harfini tablodaki "L" satrn kullanarak ifreliyoruz. O satrda "S" harfine karlk D var. kinci harf olan "A" harfini ise tablonun I
satrna gre ifreleyecei, ki orada "A"ya karlk "I" var. te yandan ikinci "A" harfi tablonun "O satrna gre ifrelenecek, yani "O" olarak. Bylece sabit
ifreleme sknts ortadan kalkmaktadr.
mesaj : SABAHTOPLAN
ifre : LIMONLIMONL
ifreli mesaj: DINOUEWBZNY

Almanya'nn Dnya savalar srasnda kulland Enigma ifreleme teknii de temelde ok benzer prensiplerle almaktadr. lk balarda kabaca harfli Vigenere
ifresine denk gelen, yani 26 farkl ifreden birini kullanan makinelerle ifreleme ve ifre zme iini yapyorlard. Gnmzde kripto-analiz iin ocuk oyunca
3

olan bu ifrenin krlmas iin ngiltere ve Amerika'da ordu tarafndan grevlendirilen ok sayda bilim insan alm ve gnmz bilgisayarlarnn temeli olan
yntem ve cihazlar bu abalar srasnda retilmitir.

Elbette kripto-analiz teknikleri de kriptoloji teknikleriyle baaba gelimektedir. Harf skl analizinin ie yaramad durumlarda kelime sklklar, harf uzaklklar
vb. gibi pek ok unsur incelenerek ifreleme teknii ve/veya ifre'nin zmlenmesi yaplabilmektedir.

9.2 Simetrik ifreleme


Bilgisayar ann byk ksm boyunca kullanlan ve hala ok yaygn olan bir grup yntem simetrik ifrelemedir. Bu yntemde ifreleme ilemi hangi ifre
kullanlarak yapldysa alc tarafta ayn ifre kullanlarak zlr. Bu yzden simetrik ifreleme denilmektedir.

Mantksal XOR ilemi bu ifreleme teknii iin ok doal bir ara oluturmaktadr. XOR ilemi ileme giren iki mantksal, 1/0, deeri ayn olduunda 0 farkl
olduunda 1 deerini verir. Komtatif ve asosyatif bir ilemdir, yani, p q = q p ve (p q) r = p (q r). Ayrca p p = 0 olduundan ikili bir sayy
bir ifre ile XOR'layp tekrar ayn ifre ile XOR'laynca orijinal sayy elde ederiz: <------------------- hash(tek kullanmlk kod + kullanc ifresi)

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 42/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
FRE : 01010101
DATA : 11110000 **
FRELEME : data'y ifre ile XOR'la
ifreli data: 10100101
ZME : ifreli datay tekrar ifre ile XOR'la
11110000 **

Bylece bu yntem ASCII, yani her alfabe sembolnn 8 bite kodland metinlerin ifrelemesinde kullanlabilir. Ancak yukardaki rneimizdeki gibi kullanlrsa
bir sabit deitirmeden te gidemeyecei, dolaysyla kripto-analiz karsnda ok zayf kalaca aktr.

Bu sebeple yaygn simetrik ifreleme yntemleri hem 8 bit yerine daha byk (rn. 64 bit) bloklar halinde ifreleme yapar, hem de "yerdeitirme permtasyon a"
(substitution permutation network", SPN) denilen bir ileyici ile bu bloklar tannamayacak ekilde kartrma ilemine tabi tutar. Ancak ilem ifre bilindii takdirde
tersine evrilebilir bir ilemdir. Bu tipik mimari ekilde gsterilmitir:

Simetrik ifrelemede yaygn olarak kullanlan "substitution-permutation network" (SPN) mekanizmas (Kaynak: Wikipedia)

Bu ilemde yerdeitirme kutusu girdiyi (ki ifrelenecek bloun bir parasndan oluuyor) rnein tersi varolan bir kare matrisle arparak ktsn retir. Bylece
ifre zme ilemi matrisin tersi kullanlarak yaplabilecektir. Elbette bunun nasl bir matris olacak ve kripto analitik zaaflar incelenmelidir.

Permtasyon adm ise yerdeitirme kutularnn ktlarn birbirine kartrr. Permtasyon doal olarak tersine evrilebilir bir ilemdir. Bu admlardan nce ve
sonra ise ifrenin tamam veya bir paras ile XOR ilemi yaplmaktadr, ki bunun da tersine evrilebilir bir ilem olduunu yukarda grdk.

Yerdeitirme ve permtasyon ilemleri girdi blou ile kt blou arasnda kirpto-analizle aa kartlabilecek paralellikleri ortadan kaldrmay amalar. Girdinin
bir biti dahi deise yerdeitirmenin kts ve sonra permtasyon ile ktnn farkl yerleri umulmadk ekillerde deiecektir. Ayrca ifre ile XOR ilemi de
kriptoanalizi zorlatracaktr.

9.2.1 DES, 3-DES, ve AES


Bu prensipler uzun yllar simetrik ifreleme standard olan DES (Data Encryption Standard) ve sonras tasarmlarda kullanlmtr:

DES 64-bit bloklar ve 56 bit ifre kullanr. 1999 ylnda EFF (Elctronic Frontier Foundation) tarafndan 24 saatten az bir srede krlabildiinin
belirlenmesinden sonra terkedilmi ve 3-DES kullanmna yerini brakmtr.
3-DES (triple DES): Kabaca DES'in 3 kez tekrarlanmas ile elde edilir. Bu sayede varolan devre ve yazlmlar ksmen kullanlabilmi ve 199 yl itibaryle
gzensizleen DES'in yenilenmesi srecinde yumuak bir teknolojik gei ngrlmtr. ifre 56*3=168 bit'e kartlarak (ancak blok uzunluu ayn kalarak)
ifreleme kriptoanalize kar glendirilmitir.
AES (Advanced Encryption Standard) Temel prensipleri ayn kalmasna ramen farkl bir tasarmla hem blok hem de ifre uzunluunu 128 bite
kartmaktadr. Bu yzden kullanmda 3-DES'in yerini almtr.

Bu temel mimari (SPN) ifreleme ve ama iini ie zgn tasarlanm elektronik devrelerle gerekletirmeye son derece uygundur. Bunun mmkn olmad
durumlarda bile jenerik CPU'lar ile makul bir hzda uygulanabilmektedir. Bu yzden bu ifreleme yntemleri grece daha gsz olan mobil cihazlarda bile
kullanlabilir.

Simetrik ifrelemede en nemli sorunlardan biri iki tarafn kullanlacak ortak ifreyi belirleyip paylamasdr. Bu aama ortada henz gvenli bir iletiim kanal yok
iken yaplmak zorunda olduundan bir problem tekil eder. Bu soruna nerilmi bir zm (Diffie-Hellman Key Exchange) bir sonraki blmde inceleyeceiz.

9.2.2 Java ile DES kullanm

Java'nn crypto kitapl ile DES ifrelemenin kullanmn aadaki rnekte grebilirsiniz. Program rasgele bir byte dizisini DES ile ifreleyip sonra da ama
ilemlerini rneklemektedir:
/*
* DESEncryptionExample1.java
*
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*
* This program uses DES private-key encryption algorithm

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 43/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
*
*/

import javax.crypto.*;
import javax.crypto.spec.*;
import java.util.*;

public class DESEncryptionExample1 {


public static void main (String[] args) {
// We use key generator to generate a key
try {
KeyGenerator desGen = KeyGenerator.getInstance("DES");
SecretKey key = desGen.generateKey();
System.out.print("Using key : ");
System.out.println(key);

// Now create a cipher


Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);

// Generate some dummy data


byte[] data = new byte[1024];
for (int i=0; i<1024; i++) {
data[i] = (byte) (i % 256);
}

// Generate the ciphertext from data


byte[] ciphertext = cipher.doFinal(data);

// Now reverse the things for decryption


cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedMessage = cipher.doFinal(ciphertext);

boolean verified = java.util.Arrays.equals(data, decryptedMessage);


if (verified)
System.out.println("verified");
else
System.out.println("not verified");
} catch (Exception e) {
System.out.println(e);
}
}
}

crypto kitapl baka simetrik ifrelemeleri de desteklemektedir.

9.3 Bozma (hash) fonksiyonlar


Hash fonksiyonlar temel olarak bir girdiyi geri dnlemez ve tannmaz hale getirecek ekilde, ancak deterministik bozar. Geri dndrlemez oluu ile ifreleme
ileminden farkldr. Deterministik olduu iinse ayn girdiye ayn hash fonksiyonu uygulandnda hep ayn kt elde edilir.

Geri dndrlemez olmasna ramen hash fonksiyonlar determinisik olmalar dolaysyla verinin teyidi iin kullanlabilirler. rnein veri ve a katman
protokollerde grdmz, paketlerde hata tespiti iin kullanlan CRC fonksiyonu buna bir rnektir. CRC fonksiyonu basit bir toplama ilemiyle byk bir veri
paketinin kk bir zetini kartr. Kar tarafta ayn ilem uygulanr ve paketin bir biti dahi yolda bozulursa CRC deeri deieceinden hata tespiti yapmaya
imkan verir.

Ancak CRC iin kullanlan toplama ilemi hash fonksiyonu olarak pek uygun deildir. Tercih edilen ilem hem akma ihtimalini azaltmal hem de orijinal girdinin
hash fonksiyonu ktsna bakarak tahmin edilmenini (yine kripto analiz) zorlatrmaldr. Toplama ilemini kullansaydk girdideki tek bir bitin deiimi ktda da
tek bitin deimesiyle snrl kalabilirdi. Oysa hash fonksiyonunu rnein ifreleri hashlemek ve tannmaz hale getirmek iin kullanyorsanz bu gvensiz bir ilem
olacaktr.

Hash fonksiyonlar genellikle sabit uzunlukta iki veri parasn alp yine sabit uzunlukta bir kt retecek ekilde tasarlanrlar. Aadaki ema byle bir
fonksiyonun byk bir veriyi sabit paralar halinde alp "hazmetmesi" ilemini gsterektedir.

Bozma ileminin temel ak (kaynak Wikipedia)

9.3.1 MD5
Yaygn kullanlan hash fonksiyonlarndan biri olan MD5 (Message Digest) girdisini 512 bitlik bloklar halinde alr ve kt olarak 128 bitlik bir hash deeri retir.
Eer girdi verisinin uzunluu 512 bitin katlarn tutmuyorsa o hale gelecek ekilde sonuna ekleme yaplr.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 44/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

MD5 (kaynak: Wikipedia)

ekilde gsterilen MD5 ilemi srasnda 128 bitlik girdilerden biri 32 bitlik 4 paraya (A, B, C ve D) blnr. lk bata bunlar sabit deerlerle doldurulur. bu
paralardan bir tr toplama ilemi (F ) ile birletirilip sonra bataki para ile XOR ileminden geirilir. Daha sonra ikinci girdi, yani hash'lenecek verinin, ilk 32
biti (ekilde M olarak gsterilmitir) bununla XOR'lanr. Sonra bir sabit, K ile XOR'lanr, bir bit kaydrma ilemi yaplr ve paralar kaydrlr. Bu ilem 16 defa
i i

tekrarlanarak 512 bitlik girdi bolu hash'lenmi olur. Bu admlarda farkl F fonksiyonlar srasyla kullanlr, rnein:

F (X, Y , Z ) = (X Y ) (X Z )

G(X, Y , Z ) = (X Z ) (Y Z )

H (X, Y , Z ) = X Y Z

I (X, Y , Z ) = Y (X Z )

Bu sayede CRC'deki toplama ileminin aksine girdideki bir bitlik deiimin bile kty tamamen deitirmesi salanm olur, ki hash gvenlii asndan nemli bir
kalitedir. Ayrca bu tasarm yaplrken olas 2 ktnn eit olaslkla kullanlmas hedeflenmitir ki farkl girdiler iin ayn kt elde etme ihtimali -kanlmaz
128

olarak sfrdan byk olmasna ramen- en aza dsn.

9.3.2 SHA

MD5 algoritmasnda grlen kimi akma sorunlar yznden daha gvenli olduu dnlen bir dizi algoritma gelitirilmitir. SHA-1, SHA-2, ..., olarak
isimlendirilen bu hash fonksiyonlar temelde benzer prensiplerle alrlar:

SHA-2 (kaynak: Wikipedia)

Burada bahsi geen ilemler de yledir:

Ch(E, F , G) = (E\andF ) (E\andG)

Ma(A, B, C ) = (A\andB) (A\andC ) (B\andC )

0 (A) = (A 2) (A 13) (A 22)

1 (E) = (E 6) (E 11) (E 25)

Bu tasarmn MD5'e gre kripto-analiz zaaflarn nemli lde azaltt ve akmalar da azaltt grlmtr. Bu trden karlatrmalar genellikle deneysel
olarak yaplmaktadr.

9.3.3 Programlarda bozma-hash ileminin uygulanmas


Aadaki rnek Java security kitapln kullanarak bir MD5 hash ilemini rneklemektedir:
/*
* HashExample1.java
*
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*
* This program uses SHA for creating and confirming message digests
*
*/

import java.security.*;
import java.util.*;

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 45/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
public class HashExample1 {
public static void main (String[] args) {

//create some dummy chunks of data


byte[] data1 = new byte[1024];
byte[] data2 = new byte[1024];
for (int i=0; i<1024; i++) {
data1[i] = (byte) (i % 256);
data2[i] = (byte) (i % 128);
}

// obtain an object to create message digests

try {
MessageDigest md = MessageDigest.getInstance("SHA");
//Create a digest without using a secret key
md.update(data1);
byte[] digest = md.digest();

//verify the digest like this


md.reset();
boolean verified = java.util.Arrays.equals(md.digest(data1), digest);
if (verified)
System.out.println("Digest 1 verified");
else
System.out.println("Digest 1 verified");

//This time we will create a digest by appending a secret key to data


md.reset();
byte[] secret = new byte[4];
secret[0]=(byte)'a'; secret[0]=(byte)'b'; secret[0]=(byte)'c'; secret[0]=(byte)'d';
md.update(data2);
byte[] digestWithSecret = md.digest(secret);

//verify the digest with secret like this


md.reset();
md.update(data2);
boolean verifiedWithSecret = java.util.Arrays.equals(md.digest(secret), digestWithSecret);
if (verifiedWithSecret)
System.out.println("Digest 2 verified");
else
System.out.println("Digest 2 verified");
} catch (java.security.NoSuchAlgorithmException e) {
System.out.println("Problem creating a digest instance");
}

}
}

9.4 Hash fonksiyonlar ile kimlik/ifre dorulama ve dijital imza


Hash fonksiyonu geri dndrlemez olduundan hassas bir bilginin kendisi yerine zetini gvensiz bir kanaldan gndermeye veya alnma riski bulunan bir yerde
depolamaya imkan verir. rnein Linux sistemi kullanyorsanz /etc/shadow dosyasna gz atn. Burada kullanc ifrelerinin hash'leri tutulmaktadr. Dosya alnsa
bile ifreler alnm olmaz. Ancak kullanc bilgisayara ifresini girdiinde hash'ini alp bu dosyadaki deerle karlatrarak ifreyi dorulamak mmkn olur.

Tabii nternet uygulamalarnda uzaktan giri yaplrken, gvenli bir kanal da yoksa bunun faydas olmayacaktr. nk ya ifreyi gvensiz kanaldan sunucuya getirip
hash'ini alacaksnz ya da karda ifreyi hash'lediini syleyen makinenin szne gveneceksiniz. Ayrca iletiim kanal gvenli bile olsa paket tekrar riski olabilir.

Bu yzden Apache web sunucusu gibi baz web altyap sistemleri soru-cevap (challenge-response) yntemiyle kimlik dorulamas yaparlar. Bu yntemde rnein
sunucu kullancya -muhtemelen o anki saat bilgisi ve rasgele bir say ile oluturulmu- bir kod gnderir. Kullancdan beklenen bu kodun arkasna ifresini eklemesi
ve bunun tamamnn hash'ini alp sunucuya gndermesidir. Sunucu da ayn hash ilemini yapar ve kullancdan gelen deerle karlatrabilir:
Sunucu Kullanc
tek kullanmlk kod ------------------->
|
hash(\ / + ifre)==? <------------------- hash(tek kullanmlk kod + ifre)

Bylece kullanc ifreyi gndermeksizin ifreyi doru bildiini ispatlamakla kalmaz, ispatn kendisi bir daha kullanlmayacak bir kodun hash'ini ierdiinden ispat
ieren paketin alnmas durumu bir risk olmaktan kar. Bunun yaplabilmesi iin sunucunun "challenge" kodunu ve bu kodu hangi kullanc iin kullanacan
(rnein IP adresine bakarak) bir sre hatrnda tutmas gerekecektir. Ayrca kod ilk kullanmdan sonra geersiz ilan edilmelidir ki "replay" saldrs olmasn.

Challenge/response veya gvenli kanal zerinden (ama replay'e dikkat)

9.5 IPSec ve a katman gvenlik


IP standardna sonradan yaplan bir ekleme ile IP protokolne gvenlik zellikleri eklenmitir. IP'nin yaygnl ve ok farkl kullanm senaryolar olabilecei
dnlerek yaplan bu tasarm olduka eitli seeneklerin kombine edilip kullanlmasna izin verdiinden olduka karmaktr. Genel olarak VPN (Virtual Private
Network) ad verilen bu sisteme sadece temel unsurlar asndan bakacaz.

VPN denilmesinin sebebi bir kez IP gibi a katman protokolde gvenlik zelliklerini kullanrsanz iki bilgisayar arasndaki her trl uygulamaya dair veri
alveriinin gvenli hale gelmesidir. Oysa ileride greceimiz gibi rnein "gvenli web sitei" (https neki tayan site adresleri) sadece bir uygulamann belirli bir
port adresinden olan trafiinin gvenliini salamaktadr. VPN ile rnein bir askeri grevlinin merkez komutanlyla, veya bir bankacnn merkez ofisiyle
bilgisayar balants kurmas ve bilgisayarndaki her trl uygulamann hepsinin birden gvenli olmas salanr, nk hepsi sonuta IP dzeyi protokolden
gemektedir.

IPSec ad verilen IP gvenlik zellikleri daha nce grdmz paket yapsndaki "seenekler" blmn kullanarak hangi gvenlik zellikleri kullanlaca ve
bunlar iin gerekli parametreleri ifade eder. rnein sadece veri paketlerinin dijital olarak imzalanmas isteniyorsa yle bir IP paket yaps kullanlabilir:

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 46/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

IPSec sadece dijital ierik imzalama durumunda paket yaps (kaynak:http://www.unixwiz.net/techtips/iguide-ipsec.html)

Burada "authentication data" olarak gsterilen ve dijital imza ieren blmdeki bilgi paras paketin veri ksmnn sonuna nceden belirlenmi bir ifreyi ekleyip
hepsinin hash'ini alarak retilir. Bylece ifreyi bilmeyen biri bu imzay atamaz. Paket gizliliini deil ama paketin gerekten iddia edilen kimlie sahip bir
kiiden/bilgisayardan geldiini kantlar. Bu yntemin uygulanmasnda paketlere normalde IP'de olmayan paket numaras "sequence number" verilmitir. Bu sayede
paket birisinin eline gese bile "packet replay" saldrsna kar gvenlik salanm olur. letiimdeki taraflar paket numaras tekrar ederse tekrar paketini dikkate
almayacaklardr.

Burada kullanlan sistem yukarda Apache web sunucusu iin bahsettiimiz dijital imza sistemine tamamen benziyor. Ancak yine "ortak ifreyi belirleyip paylama
problemi" var. Pek ok kurumsal kullanc bu problemi amak iin zel elektronik cihazlar kullanr. Bu cihazlar kurumsal a merkezindeki sunucu bilgisayarlarn
saatine hassas olarak ayarlanrlar. Kullanc cihaza ifresini girdiinde ifre ve o anki saat bilgisi birletirilerek tek kullanmlk bir ifre retilir. Sunucu taraf da ayn
eyi yapar ve ortak bir ifre belirlenmi olur. Artk bu ifre VPN balantsndaki IP paketlerinin "authentication data" ksmn retmek iin hash ileminde
kullanlabilir.

IPSec zellikleri genellikle hem ieriin imzalanmas hem de ieriin gizlenmesi iin kullanlr. Bu durumda paketin sadece veri ksm ifrelenmi olarak
gnderilecektir:

IPSec hem ifreleme hem de dijital ierik imzalama (kaynak:http://www.unixwiz.net/techtips/iguide-ipsec.html)

9.5.1 VPN tnelleme (tunneling)


IPSec'in yukardaki kullanmlar pek ok gvenlik riskini ortadan kaldrsa da trafik izlemeye kar bir koruma salamazlar. nk paketin veri ksm ifrelenmi
olmasna ramen gnderici ve alc adresleri ifrelenmemitir.

Bunun zm VPN ileminin "tnel" modunda yaplmasdr. Burada bir kuruma ait birbirine uzak iki kamps dnn (rnein ayn orduya ait iki uzak karargah):
A \ / D
\ /
B---Router1 -------------------------- Router2--- E
/ \
C / \ F

A bilgisayar F bilgisayar ile balant kuruyorsa kabloyu dinleyen biri bunu anlayabilir (ierii okuyamasa bile). Bu tr trafiin dinlenmesi kurumsal a yapsnn
aa kmas ve gvenlik riskleri demektir.

Tnel modu kullanmnda A'dan F'ye gidecek bir IP paketinin tamam (yani adres ksmlar da dahil) Router1 tarafndan baka bir d IP paketinin iine ifrelenmi
ierik olarak konulur. Bu dtaki tayc IP paketinin zerinde gnderici olarak Router1 alc olarak Router2 adresleri vardr, bunun dndaki herey ifrelenmitir.
Router2 bu paketi aldnda iini aar ve kan IP paketine bakarak asl alcnn F olduunu anlar ve paketi ona ynlendirir. Bylece A ve F asndan onlar sanki
normal iletiim kuruyorlar gibidir. Ancak Router1 ve Router2'nin anlamal olarak tnel modu VPN kullanmas sayesinde gvenli karagah duvarlarnn dndan
geen trafik bu durumu d gzlerden gizlemektedir.

10 Modern A Gvenlii:Asimetrik ifreleme


Gnmzde bilgisayar gvenlii, ve dolaysyla a haberlemesi gvenliinin en nemli bileenini oluturan asimetrik ifreleme yntemleri 1970'lerde ortaya
kmtr. Bu yntemlerin teorik altyaps modler aritmetik ve ayrk logaritma (discrete logarithm) ile ilgili baz temel kuramlara dayanr.

Bunlardan en nemlisi Fermat'n kk teoremi ve onun Euler tarafndan genelletirilmi halidir. Buna gre p bir asal say ise ve a saysnn p ile 1 dnda bir ortak
bleni yoksa, a 1 (mod p)'dir. Teorem'in basit bir ispat Golomb tarafndan verilmitir:
p1

It is possible to give an interesting, purely combinatorial proof of Fermat's theorem that n n is divisible by p , for any positive integer n, and any
p

prime number p . Suppose we have beads in n different colors, and we wish to make necklaces using exactly p beads. First we put p beads on a string.
Since each of the beads can be chosen in n ways, there are n possible strings. For each of the n colors, there is one string entirely of that color. We
p

throw these away, leaving n n strings. We will join the two ends of each of these strings to form necklaces. But we observe that if two strings, differ
p

only by a cyclic permutation of the beads, the resulting necklaces will be indistinguishable. Since there are p cyclic permutations of the $p beads on a
string, the number of distinguishable necklaces is (n n)/p , which must therefore be an integer. (S. W. Golomb, The American Mathematical
p

Monthly , Vol. 63, No. 10, Dec. 1956, p. 718)

Bu ispata gre n tane farkl rakamla p uzunlukta saylar yazdnz dnn. rnein n = 3 ve p = 5 iin A,B,C sembolleri ile bunu yapabiliriz. Toplam n farkl p

say yazabiliriz. Bu saylardan n tanesi sadece bir sembolden oluan saylar olur. Mesela AAAAA, BBBBB, CCCCC. Kalan n n say iinse yle bir tespit var.
p

Bu saylar ucundan kolye gibi balasanz, baz kolyeler ayn olurdu. Mesela:

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 47/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
BAAAA
ABAAA
AABAA
AAABA
AAAAB

Bu p farkl say ayn kolyenin farkl noktadan kopartlm halleri gibidir. Ve her p uzunluktaki kolye bize p tane farkl say verecektir. Dolaysyla elimizde kalan
n n sayy herbiri bir kolyeye harlk gelen ve p saydan oluan gruplara ayrabiliriz. Dolaysyla n n says p saysn tam olarak blen, yani onu kat olan
p p

bir saydr. Bylece:


p
n n 0 (mod ()p)

ve dolaysyla
p
n n (mod ()p)

elde ederiz. Farkl bir ekilde yazarsak:


p1
n n n (mod ()p)

ve bylece
p1
n 1 (mod ()p)

Euler bu teoremi genelletirmitir. Euler herhangi bir m saysndan kk ve onunla easal (coprime) olan, yani onunla 1 dnda ortak bleni olmayan saylar
kmesinin boyutuna (m) (Euler totient) adn verir. Teoremi de a 1 (mod p) olarak genelletirir. Asal bir p saysnn hibir sayyla 1 dnda bir ortak
(m)

bleni olmadndan (p) = p 1'dir ve Fermat teoremini elde ederiz. Euler ayrca m says iki farkl asal saynn, p ve q , arpm ise, m = pq , bu deerin
(m) = (p)(q) = (p 1)(q 1) olarak bulunabileceini de belirtiyor.

Bu teorem bize bir saynn modler aritmetikteki tersini bulma imkan da vermektedir. Bir p says ve onunla easal bir a says varsa, a 'nn modler tersini de a 1

diye gsterelim, yle ki aa 1 (mod ()p) olsun. Teorem bize byle bir saynn varolduunu ve deerini verir. Teorem a
1
1 (mod ()p) olduunu
(p)

gstermektedir. Dolaysyla a a 1 (mod ()p) . Bylece a


(p)1 1
= a olarak buluruz. Hatta genel olarak pozitif her i tamsays iin a
(p)1
deeri iimizii(p)1

grr, nk teoremden biliyoruz ki fazladan a deerlerinin herbiri a


(p)
1 (mod p)'dir ve dolaysyla arpmada etkisiz elemandrlar.
(p)

Bunlar kullanarak rnein bir arpma ifrelemesi yapabiliriz. Bu ifrelemede n ve a easal saylar olmak zere, elimizdeki bir metini, M , ifrelemek iin u ilemi
yapyoruz:

S aM (mod n)

Euler teoremi a 'nn tersinin varolduunu ve deerini bize sylyor: a 1


= a
(n)1
. Dolaysyla ifreleme iini kolayca tersine evirebiliriz:
1
M a S (mod n)

1
M a aM (mod n)

M 1M (mod n)

Elbette bunun sabit deitirme tipi bir ifre olduunu ve kolayca krlabileceini belirmek gerek. Ancak yine de bize asimetrik bir ifreleme rnei vermektedir. Bir
tarafta a ile ifrelenen mesaj kar tarafta sadece a deeri kullanlarak zlebilir, a 'ya ihtiya yoktur.
1

10.1 Eksponansiyel ifreleme ve arpanlara ayrma problemi


imdi yle iki say, k ve j dnelim ki kj = i(p) + 1 1 (mod (p)) olsun. Baka bir deyile k ve j biribirinin (mod (p)) 'ye gre tersidir, nk
arpmlar 1 ediyor. Eksponansiyel ifrelemenin ifreleme admn u ekilde yapyoruz:
k
S M (mod p)

ve ifre amay da
j
M S (mod p)

j
k
M M (mod p)

kj
M M (mod p)

Ancak kj = i(p) + 1 olduundan ve Fermat-Euler teoremine gre (eer M ve p easal ise!) M (p)
1 (mod p) olduundan geriye

M (mod p)

kalr. Dolaysyla p 'den kk her M saysn bu ekilde ifreleyebiliriz.

Burada da bir asimetrik ifreleme yapyoruz. ifreleme k ile ifre ama ise j ile yaplyor. Yani kar taraf farkl bir ifre ile alyor.

Ayrca bu krlmas zor bir ifreleme yntemidir. Eer (p) saysn biliyorsanz k verildiinde j 'yi kolayca bulabilirsiniz. Ama (p) saysn bulmak iin p 'yi asal
arpanlarna ayrmak gerekir. Byk p saylar iin hesaplamas son derece zordur. Bylece p saysn ok byk iki asal saynn arpm olarak seersek, ve M
mesajnn bunlarn ikisinden de kk (ve dolaysyla p ile easal) olmasn salarsak bu yntemi kullanabiliriz. Birisinin p 'nin asal arpanlarn bulmas hesaplama
olarak imkansza yakn olacandan ifreyi kramayacaktr.

10.2 Diffie-Hellman ifre deiim yntemi ve ayrk logaritma


Whitfield Diffie ve Martin Hellman'n 1976'da ortaya att bir yntem benzer bir kuramsal zemni kullanarak iki tarafn -mesela simetrik ifrelemede kullanmak
zere- bir ortak ifre belirlemesi iin bir zm vermektedir. Hemen sonrasnda bu yntemden ilham alan asimetrik ifreleme yntemlerine de zemin oluturmutur.

Ynteme gemeden nce unu ele alalm. Bir p asal says, ve g ve a saylar dnelim. Ayrca A g (mod p) saysn hesaplayalm. Bu durumda a says
a

A 'nn g tabannda ayrk logaritma deeri olmaktadr. Ancak bildiimiz logaritmadan farkl olarak A , p ve g saylar verildiinde a deeri sistematik olarak

bulunamaz. Ancak deneme yanlma yntemiyle bulunabilir. Dolaysyla ok byk p , a ve g saylar szkonusu olduunda yaptmz hesaplama geri evrilemez,

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 48/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
ancak ok uzun srecek deneme yanlma yntemiyle A saysna karlk gelen a says bulunabilir (eer bunu sistematik olarak yapacak bir yntem kefedilirse
btn modern ifreleme yntemlerimiz p olacak).

Diffie-Hellman yntemi (Diffie and Hellman 1976) bu zemini kullanarak u ekilde iler. Ortak bir ifre belirlemek isteyen iki taraf, isimlerine Alice ve Bob diyelim,
karlkl olarak u ilemleri yaparlar:

Alice Bob
Byk bir p asal says ayrca yine byk g ve a saylarn se
(mod p) p ,g , ve A 'yi Bob'a gnder (herkes grebilir)
a
A = g

Ortak ifreyi hesapla K = B


a
(mod p) K = g
ab
(mod p) Ortak ifreyi hesapla K = A
b
(mod p) K = g
ba
(mod p) \

Bylece iki taraf, sadece a ve b deerlerini gizlemek marifetiyle aslnda hi dei toku etmedikleri ortak bir K ifresini elde etmi oldular.

10.3 RSA asimetrik ifreleme


Diffie-Hellman ynteminin bulunmasndan ksa bir sre sonra Ron Rivest, Adi Shamir ver Leonard Adleman tarafndan ortaya atlan bu ifreleme yntemi gnmz
bilgisayar gvenliinin en nemli mekanizmalarndan biri haline gelmitir (Rivest, Shamir, and Adleman 1978).

Bu yntemde kullanlacak byk (rnein 1024 bit uzunluunda) saylar seilirken iki byk asal saynn arpm olarak seilirler. rnein p ve q asal saylarn
kolayca bulunabilen byk Mersenne asal saylar arasndan "yeterince rastlantsal olarak" seelim, ve n saysn n = pq olarak bulalm. Bu durumda
(n) = (p 1)(q 1) olduunu biliyoruz. Ancak p ve q deerlerini bilmeyen birinin bunu bulmas asal arpanlara ayrma gerektirir ve pratikte yaplamayacak

kadar uzun srer.

Daha sonra (n) ile easal bir e says belirlenir. Bu say "kamusal ifre" olacak, yani herkese bilinmesine izin verilecektir, ayrca n says da kamuya aktr. Daha
sonra onun modler aritmetik tersi olan bir d says bulunur: d e (mod (n)) , ve dolaysyla de 1 (mod (n)). Bu bizim gizli ifremiz olacak.
1

Yukardaki teoremler bize bunu bulmann yolunu veriyor. Ancak (n) saysn bilmeyen biri e 'ye bakarak bunu bulamaz.

ifreleme ilemi iki ekilde yaplabilir. Kamudan ifreleme diyebileceimiz birinci yntem yle:
e
S M (mod n)

Bu durumda ifrenin zlmesi ise u ekilde olur:


d
M S (mod n)

ed
M M (mod n)

Bu sonuncu adm Euler-Fermat teoreminden biliyoruz.

Burada yaplan ileme dikkat ederseniz ifreleme ilemi herkesin bilmesine izin verilen e ve n saylar kullanlarak herkese yaplabilir. Ancak ifreyi ama ilemi
e 'den farkl, d ifresi ile yaplmaktadr, ve bunu ancak gizli ifrenin sahibi yapabilir. ifreleme ve ama admlar iki anlamda asimetriktir: hem farkl ifrelerle

yaplyorlar hem de birini ancak gizli ifre sahibi yapabiliyor.

Bu ekilde ifreleme rnein unun iin kullanlabilir: A ve B iletiim gizlilii istiyorlar. Bu durumda A B'ye gnderecei mesajlar B'nin kamusal ifresiyle ifreler
(sadece B aabilir), B de cevaplarn A'nn kamusal ifresiyle ifreler (sadece A aabilir). Bylece iletiimin her iki yn de gizli kalr, ancak nceden ortak bir ifre
belirlemeye de ihtiya yoktur.

lem tersi ynde de yaplabilir, buna kamuya ifreleme diyebiliriz:


d
S M (mod n)

bu ifrelemeyi ancak gizli ifre sahibi yapabilir. Ancak herkes ifre ama ilemini yapabilecektir, nk bu kez ifre ama kamusal olan e ifresi ile yaplabilir.

Bu ifrelemede byk saylarn yine ok byk sleri bulunmaktadr. Ancak ilk grndnn aksine bu ilemler makul bir hesaplama kapasitesi ile yaplabilirler.
Dnn ki bir x saysnn y ssn almak istiyoruz. nce x 'in karesini sonra onun karesini alarak, vb., x 'in byk slerini bulabiliriz. Eer y = 2 ise, yani
z

log y = z ise, x says sadece z admda bulunabilir. 2'nin katlar olmayan y saylar iin de bundan yola karak ok hzl hesaplama yaplabilir. Ayrca
y
2

hesaplamalar modler aritmetikte yapldndan saylar bydke (mod n) ilemiyle onlar ksaltp arpma ilemlerine devam edebiliriz.

Eer Linux kullanyorsanz ve openssl paketini kurarsanz aadaki komut ile siz de bir RSA gizli ve kamusal ifre ifti yaratabilirsiniz:
$ openssl genrsa -des3 -out privkey.pem 2048

Bu komut size bir ifre soracaktr. nk privkey.pem dosyasna konulacak olan gizli ifreniz kimsenin bilmemesi gereken gizli bir bilgidir. Aklda da tutamazsnz
nk ok uzundur. Bu yzden dosyann kendisi hatrlayacanz trden sizin belirlediiniz bir ifreyle ifrelenir, ve sonra kullanmak iin bu ifreye ihtiyacnz
olacaktr. ifrelerden kamusal olann aadaki komut ile ayr bir dosyaya alp bakalaryla paylaabilirsiniz:
$ openssl rsa -in privkey.pem -pubout > mehmetkey.pub

10.4 RSA "Public Key" Sertifikalar: PKI ve Web-of-trust


RSA asimetrik ifrelemenin kullanm gizli bilgilerin ancak belirli bir muhatap tarafndan alabilecek ekilde paketlenip gnderilmesine dayanr. Ancak bu
yaplrken kullanllan kamusal ifrenin gerekten istediimiz muhatapa ait olduundan bir ekilde emin olmalyz. Aksi takdirde nternet gibi kalabalk ve gvensiz
bir ortamda birileri kendi kamusal ifrelerini sanki baka birininmi gibi bize verebilir ve gnderdiimiz bilgiler umduumuzdan baka bir muhatabn eline geer.

Kamusal ifre sertifikas (Public Key Certificate) bu problemi zer. Bu sertifika gvenilir bir merci tarafndan mhrlenip imzalanm, bir kamusal ifrenin belirli
bir isim/kimlie sahip muhataba ait olduunu onaylayan "dijital" bir belgedir. Byle bir ilemin yaplabilmesi iin sertifikasyon yapacak mercilerin belirlerip
duyurulmas, sertifikalarn ve kullanm protokollerinin tm bilgisayar uygulamalarna uygun bir ekilde tasarlanp standartlatrlmas gerekmitir. Bu
standartlamann sonucunda ortaya kan ve dijital sertifikalarn kullanmna elveren altyap PKI (Public Key Infrastructure) olarak isimlendirilir.

Bir dijital sertifika esasen be bilgi parasndan oluur:

Sertifikay alann kimlii: bu genellikle kurum/birey alan adnn yansra ak ismi ve adresinden oluur.
Sertifikay veren otoritenin kimlii: Bu sertifikalarn en gl ve en skntl meselesidir. Sertifika veren otoritenin kimliinin (ve kamusal ifresinin) bu
sertifikalarn kullanlaca her bilgisayarda kaytl olmas gerekir.
Sertifikann kullanm amac: sertifika bireysel ifreleme amacyla kullanlabilecei gibi sertifika sahibine bakalarna sertifika verme yetkisi de tanyabilir.
Sertifika sahibinin kamusal ifresi: bu bilgi yukarda grdmz n ve e saylarndan oluur.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 49/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
Yukardaki tm bilgilerin (veya onun hash'inin) sertifika otoritesinin gizli ifresiyle ifrelenmi hali, yani kamuya ifrelenmi hali. Bylece tm sertifika bilgisi
sertifika otoritesinin kamusal ifresi kullanlarak teyit edilebilir. Bu ksm sertifikadaki dijital imza/mhr yerine geer.

Bir sertifika herkese tannan "kk" otoritelerden biri tarafndan verilebilecei gibi onlarca sertifika verme yetkisi tannan bir otorite tarafndan da verilmi olabilir.
Bu ikinci durumda sertifikaya ek olarak o otoritenin kendi sertifikas da bu sertifikaya eklenir ki dijital mhrler kk otoriteye kadar dorulanabilsin.

PKI genellikle maliyeti yksek bir sertifikasyon ilemi ierdiinden zellikle bireysel kullanm iin bu "resmi" standarda alternatif olarak bir de web-of-trust (gven
a) yntemi de kullanlmaktadr. Bu uygulama zaten tandmz ve gvendiimiz birey/kurumlarn "mhr"n (dijital sertifikasn) baka sertifikalar onaylamak
iin yeterli saymamz esasna dayanr. ou zaman bu sertifikalar "kendi kendine onaylanm" sertifikalar (self-signed certificate) bile olabilir.

Linux zerinde openssl paketi ile yukarda yarattnz ifreden bir "kendi kendine onaylanm" sertifika yaratabilirsiniz:
$ openssl req -new -x509 -key mehmetkey.pem -out mehmetcert.pem -days 1095

Enter pass phrase for privkey.pem:


You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:TR
State or Province Name (full name) [Some-State]:stanbul
Locality Name (eg, city) []:Eyp
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bilgi
Organizational Unit Name (eg, section) []:CMPE
Common Name (eg, YOUR name) []:Mehmet Gencer
Email Address []:mehmetgencer@example.com

10.5 RSA ile dijital imza


RSA sertifikalarndaki dijital mhr, yani kamuya ifreleme, genel olarak asimetrik ifreleme ile yaplan dijital imza ilemlerinin tipik bir rneidir. Asimetrik
ifrelemenin dijital imza iin kullanmndaki avantaj dijital imzay herkesin onaylayabilmesi, bunun iin imza sahibiyle arasnda gizli bir ifre belirlemeye gerek
kalmamasdr.

imdi isterseniz yukarda yarattnz ifreleri kullanarak bir metin dosyas iin dijital imza retebilirsiniz:
$ openssl rsautl -sign -in test.txt -inkey privkey.pem -out test.txt.signature

Bu komut test.txt dosyasnn imzalanm bir halini test.txt.signature dosyasna koyar. Kar taraf sizin mesaj ve dijital imzann yansra gnderdiiniz (veya daha
nceden bildii) kamusal ifreniz ile bu imzay onaylayabilir ve dosyay da grntleyebilir:
$ openssl rsautl -verify -in test.txt.signature -inkey mehmetkey.pub -pubin

veya yukarda yarattnz kendi kendine onaylanm sertifikay kullanarak:


$ openssl rsautl -verify -in test.txt.signature -inkey mehmetcert.pem -certin

Bu ilemin sonucunda dosyay ekrana dkmek yerine bir dosyaya da saklayabilirler:


$ openssl rsautl -verify -in test.txt.signature -out test.txt.verified -inkey mehmetkey.pub -pubin

10.6 RSA ile e-posta gizlilii: PGP


Pretty-Good-Privacy ("olduka iyi gizlilik") e-posta gibi bilgi paketlerini ifrelemek iin tasarlanmtr. Yaygn olarak e-posta mesajlarnn gizlilii iin kullanlr.
Mesaj aslnda simetrik ifreleme kullanlarak ifrelenir; hatrlarsanz bu yntem daha hzldr, hele ki byk dosya ekleri ieren e-postalar iin ifreleme ve ama bu
ekilde ok daha kolay olmaktadr. Ancak simetrik ifrelemede kullanlan ifre asimetrik ifreleme (kamudan ifreleme ynnde) kullanlarak kar tarafa mesajla
birlikte gnderilir.

ekilde gsterildii gibi gnderici rasgele bir ifre belirler. Mesaj bununla ifreler, ve mesajn sonuna, PGP standardnda tarif edilen veri formatna gre, bu ifreyi
alc tarafn asimetrik ifreleme iin kulland kamusal ifreyi kullanarak ifreler. Bylece ifrenin ne olduunu sadece istenilen muhatap anlayabilecektir. Yoksa bu
ekilde ifrelenmi paket bakalarnn eline gese bile alamayacaktr.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 50/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

PGP ifrelemenin ileyii (kaynak: Wikipedia)

Alc taraf nce kendi gizli asimetrik ifresiyle mesaj ifresini aar, ve sonra mesaj bu ifre ile zer.

PGP'nin uygulanmasnda yaygn olarak web-of-trust sertifikalar kullanlr. nk PKI sertifikalar bireysel kullanm iin edinmesi zahmetli ve pahaldr. Genellikle
kendi kendine imzalanm web-of-trust sertifikalar kullanlr. Dnya apnda niversiteler gibi kimi gvenilir kurumlarn salad bir sunucu servisi bireylerin
tandklar arkadalarnn sertifikalarn onaylamalarna izin verir. Bu sayede tandnz birilerinin zaten onaylad nc ahsalara ait sertifikalar bir lde
gvenle kullanmanz salanr.

PGP'de istenirse yukardaki gizlilik tedbirlerinin yansra dijital imza da kullanlabilir. Bunun iin mesajn hash'ini alp kendi asimetrik gizli ifrenizle bu hash'i
ifreleyip mesajn sonuna eklemeniz yeterli olacaktr. Kar taraf sizin kamusal ifrenizi kullanarak dijital imzanz teyit edebilir. Bylece sizden kamuya doru bir
dijital imza, ve kamudan (siz dahil) alcya doru "ifreyi ifreleme" yntemleri birletirilerek hem gizlilik hem de dijital imza birarada kullanlm olur.

11 Ak Katman (TCP) ifreleme: TLS ve SSL'in A Programlarnda


Kullanm
IPSec kullanm her durumda pratik deildir. rnein nternet bankacl kullanacaksanz bankanzla bir VPN koordinasyonu yapmanz gerekir. stelik bunu
kullanacanz her bilgisayarda gerekli ayarlar yapmanz ve sonra iiniz bitince gvenlik iin silmeniz, vb., gerekir.

Bunun yerine yaygn olarak TCP dzeyi gizlilik kullanlr. Bu kullanm sadece ihtiya duyulan uygulama iin ve istenen ak sresince kullanlr. Ayrca IPSec'in
aksine asimetrik ifreleme veya Diffie-Hellman ifre belirlemesi kullanabildiinden zel bir ayarlama gerektirmez.

Transport Layer Security (Ak Dzeyi Gvenlik) denilen bu uygulamayla ilgili standarda daha nce SSL (Secure Sockets Layer - Gvenli Soket Katman)
deniyordu. Gnmzde bu standartlar genelletirilmi ve ismi de ksaca TLS olarak deimitir.

Gvenli TCP ya bu i iin ayrlm bir port zerinden kullanlr (TLS), ya da baz e-posta sunucularnda olduu gibi bir TCP balantsnn en banda gvenlik
kullanp kullanmama konusunu kar tarafa sormaya imkan veren bir protokol ile (STARTTLS protokol) yaplr.

TLS kullanrken hangi protokoln, hangi ifreleme yntemi ve ifrelerin kullanlacann iki taraf arasnda en bata anlaarak belirlenmesi gerekir. TLS "el skma"
protokol (TLS handshake) bunun tipik bir durumdaki admlarn u ekilde belirler:

1. stemci sunucuya ilk mesajnda (ClientHello mesaj) destekledii en yksek TLS protokol versiyonunu syler. Bunun yansra destekledii ifreleme
yntemleri (rn. DES, AES, RSA gibi) bilgisini ekler.
2. Sunucu cevap mesajnda (ServerHello mesaj) kendi destekledii protokollerle istemcinin destekledii protokol versiyonlarna bakarak mmkn olan en
modern versiyonu seer ve versiyon bilgisini gnderir. Ayrca istemcinin ifreleme yntemlerinden setii uygun birinin adn da gnderir. Bylece yntemler
belirlenmi olur.
3. Sunucu sonra kendi RSA sertifikasn gnderir.
4. Sunucu son olarak ta ServerHelloDone mesaj gndererek kendisi asndan anlamann tamam olduunu belirtir.
5. stemci cevap olarak bir ClientKeyExchange mesaj gnderir. Bu cevapta istemcinin setii bir ifre, PreMasterSecret, sunucunun sertifikasnda bulunan
kamusal ifresi ile ifrelenmi olarak gnderilir. Bu sayede sunucu ve istemci arasnda simetrik ifreleme iin kullanlabilecek bir ortak ifre belirlenmi olur.
6. stemci son olarak ChangeCipherSpec mesaj gndererek bundan sonra gnderecei hereyin belirlenen erevede ifrelenmi olarak gnderileceini belirtir.
7. stemci son olarak ifreli ve imzal olarak bir Finished mesaj gnderir.
8. Sunucu Finished mesajn onaylarsa kendisi de bir ChangeCipherSpec mesaj gndererek bundan sonra gnderecei hereyin ifreli olacan belirtir. Sonra o
da ifreli ve imzal bir Finished mesaj gnderir.
9. Bundan sonrasnda ifreli TCP kullanan uygulama herneyse onun gerektirdii ekilde veri dei tokuu yaplr. Bunun iin kullanlan TCP paket yaps her bir
paketin imzal ve ifreli olmasna izin verecek zel bir paket yapsdr.

Yukaridaki sadece tipik bir senaryodur. TLS standard (Dierks and Rescorla 2008) birok varyasyona uygundur. rnein ifre belirlemek iin Diffie-Hellman
yntemi tercih edilebilir. erik ifreleme iin de asimetrik ifreleme kullanlabilir, ancak hem yaval hem de nemli bir avantaj ssalamamas nedeniyle asimetrik
ifreleme genellikle ifre deitokuu iin tercih edilmektedir.

Linux zerinde openssl program bir sunucuyla TLS/SSL kullanarak gvenli balant kurmak iin kullanlabilir::
http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 51/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
$ openssl s_client -host cs.bilgi.edu.tr -port 443

Burada istemcinin herhangi bir gizli/kamusal ifreye ihtiyac yoktur. Senaryoda gereken ifre dei tokuu sunucunun kamusal ifresi ile yaplabilir.

Benzer ekilde daha nce oluturduunuz gizli-kamusal ifre ve sertifika ile servis veren bir sunucu da altrabilirsiniz:
$ openssl s_server -cert mycert.pem -www

Ancak bu sunucuda servis iini elle terminalden yapmanz gerekecektir. Bunu ancak balant testleri iin kullanabilirsiniz. Gvenli sunucu yapmak iin programlama
diline zg kitaplklar kullanmanz gerekecektir.

11.1 Gvenli soketlerin programlamada kullanm


Sunucu ve istemci tarafnda gvenli iletiim kullanm iin gereken programlarn genel ak daha nce grdmz gvensiz programlardan pek farkl deildir. Bu
yzden aada daha nce yaptmz ald satr istemciye aynen geri gnderen basit eko sunucumuzun ve istemcisinin SSL kullanan halini veriyorum.

SSLServer.java
/**
* An Echo server using SSL
* Author:Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/
import java.io.*;
import javax.net.*;
import javax.net.ssl.*;
import java.security.*;

class ClientHandler implements Runnable{


SSLSocket socket;
ClientHandler (SSLSocket socket) {
this.socket=socket;
Thread thread=new Thread(this);
thread.setDaemon(true);
thread.start();
}
public void run() {
System.out.println("Serving client");
try{
BufferedReader in =
new BufferedReader(
new InputStreamReader( socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
String inputLine, outputLine;
while ((inputLine = in.readLine()) != null) {
outputLine = inputLine;
out.println(outputLine);
out.flush();
}
System.out.println("Client disconnected");
out.close();
in.close();
socket.close();
} catch(Exception e) {
System.out.println("Something went wrong!");
System.out.println(e);
}
}
}

public class SSLserver {


public static void main(String[] args) {
int port=8000;
String certFile="";
try {
port=Integer.parseInt(args[0]);
certFile=args[1];
} catch(Exception e) {
System.out.println("Usage:\n SSLserver <port> <servercertificatefile>");
System.exit(0);
}
SSLServerSocket server;
try {
//THE FOLLOWING LINES ARE NEEDED FOR SSL CERTIFICATE LOADING
KeyStore ks = KeyStore.getInstance("JKS");
char storePassword[] = System.console().readPassword("Enter store password:");
char keyPassword[] = System.console().readPassword("Enter certificate key password:");
ks.load(new FileInputStream(certFile), storePassword);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keyPassword);
SSLContext sslcontext = SSLContext.getInstance("SSLv3");
sslcontext.init(kmf.getKeyManagers(), null, null);
ServerSocketFactory ssf = sslcontext.getServerSocketFactory();
server = (SSLServerSocket) ssf.createServerSocket(port);
for(;;) {
SSLSocket client = (SSLSocket) server.accept();
new ClientHandler(client);
}
} catch(Exception e) {
System.out.println("Something went wrong!");
System.out.println(e);
}
}
}

SSLClient.java
/**
* An Echo client using SSL
* Author:Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 52/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
import java.io.*;
import java.net.*;
import javax.net.ssl.*;
import java.security.*;

public class SSLclient {


public static void main(String[] args) {
String serverName="localhost";
int port=8000;
try {
serverName=args[0];
port=Integer.parseInt(args[1]);
}catch(Exception e) {
System.out.println("Usage:\n SSLclient host port");
System.exit(0);
}
try {
//Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
SSLSocketFactory factory = (SSLSocketFactory)
SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket)
factory.createSocket(serverName, port);
socket.setSoTimeout(500);
BufferedReader fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter toServer = new PrintWriter(socket.getOutputStream());
while (true) {
String message = System.console().readLine("Enter something to send to server:");
toServer.println(message);
toServer.flush();
try {
while(true) {
String line=fromServer.readLine();
System.out.println("Response:"+line);
}
}catch(SocketTimeoutException ignore) {
}catch (Exception e){
System.out.println("Something went wrong when reading from socket!");
System.out.println(e);
}
}
}catch(Exception e){
System.out.println("Something went wrong!");
System.out.println(e);
}
}
}

Ancak bu programlar derleyip sunucuyu altrmaya yeltenirseniz aadaki hata mesajn alrsnz:
javax.net.ssl.SSLException: No available certificate or key
corresponds to the SSL cipher suites which are enabled.

Java dili endstriyel kullanm odakl olduundan gvenlik konusunda olduka paranoyak ntanml deerlere sahiptir. Bir asimetrik ifre ifti ve sertifikasn aka
Java sistemine eklemediiniz srece onlar kullanmay reddeder. Bunu gerekletirmek iin Java kurulumunuz srasnda sisteminize eklenen "keytool" programn
kullanmalsnz. nce daha nce yarattmz RSA sertifikasn Java'nn kabul ettii bir dosya formatna dntrn:
$ openssl pkcs12 -export -in mehmetcert.pem -inkey privkey.pem -out mehmetcert.p12 -name mehmet -CAfile mehmetcert.pem -caname root
Enter pass phrase for privkey.pem:
Enter Export Password:
Verifying - Enter Export Password:

imdi keytool program ile Java sisteminde bir "keystore" oluturup iine bu sertifika ve ifreleri ekleyin:
$ keytool -importkeystore -destkeystore mehmetstore -srckeystore mehmetcert.p12 -srcstoretype PKCS12
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
Entry for alias mehmet successfully imported.
Import command completed: 1 entries successfully imported, 0 entries failed or cancelled

Bu sertifikay (sadece sertifikay!) istemcide de kullanmak iin nce Java formatnda sertifika dosyas oluturun:
keytool -export -keystore mehmetstore -alias mehmet -file server.cert

Daha sonra istemci iin de bir keystore oluturun ve sertifikay ona ekleyin:
keytool -import -keystore clientkeystore -alias mehmet -file server.cert

Artk sunucu ve istemcinizi bu keystore'lar kullanmalarn salayacak baz Java seeneklerini ekleyerek altrabilirsiniz:
java -Djavax.net.ssl.trustStore=clientkeystore SSLClient localhost 8000

HTTPSserver.java

Son olarak gvenli HTTP servisi sunan, ve izlekler kullanarak ezamanl hizmet verebilen bir sunucu program rnei aada verilmitir:
/**
* A simplistic secure HTTP server using SSL
* Author:Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/
import java.io.*;
import java.net.*;
import javax.net.*;
import javax.net.ssl.*;
import java.security.*;
import java.util.*;

class ClientHandler implements Runnable{


Socket socket;
ClientHandler (Socket socket) {
this.socket=socket;

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 53/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
Thread thread=new Thread(this);
thread.setDaemon(true);
thread.start();
}
public void run() {
Socket clientSocket;
System.out.println("Serving client");
try{
BufferedReader in =
new BufferedReader(
new InputStreamReader( socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
String request, response;
request=in.readLine();
StringTokenizer st = new StringTokenizer( request );
try {
st.nextToken();
String path=st.nextToken();
File f=new File("."+path);
FileInputStream file=new FileInputStream(f);
out.write("HTTP/1.0 200 OK\r\n");
out.write("Content-Length: " + f.length() +"\r\n");
out.write("Content-Type: text/plain \r\n\r\n");
try {
while(true)
out.write(file.read());
}catch(Exception ignore) {}
} catch(Exception e) {
System.out.println(e);
}
out.close();
in.close();
socket.close();
} catch(Exception e) {
System.out.println("Something went wrong!");
System.out.println(e);
}
}
}

class Server implements Runnable {


ServerSocket socket;
Server(ServerSocket socket) {
this.socket=socket;
Thread thread=new Thread(this);
thread.setDaemon(true);
thread.start();
}
public void run() {
Socket clientSocket;
try {
while(true) {
clientSocket=socket.accept();
new ClientHandler(clientSocket);
}
}catch(Exception e) {
System.out.println(e);
}
}
}
public class HTTPSserver {
public static void main(String[] args) {
String certFile="";
try {
certFile=args[0];
} catch(Exception e) {
System.out.println("Usage:\n HTTPSserver <servercertificatefile>");
System.exit(0);
}
ServerSocket socket;
SSLServerSocket secureSocket;
try {
//THE FOLLOWING LINES ARE NEEDED FOR SSL CERTIFICATE LOADING
KeyStore ks = KeyStore.getInstance("JKS");
char storePassword[] = System.console().readPassword("Enter store password:");
char keyPassword[] = System.console().readPassword("Enter certificate key password:");
ks.load(new FileInputStream(certFile), storePassword);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keyPassword);
SSLContext sslcontext = SSLContext.getInstance("SSLv3");
sslcontext.init(kmf.getKeyManagers(), null, null);
ServerSocketFactory ssf = sslcontext.getServerSocketFactory();

socket =new ServerSocket(80);


secureSocket = (SSLServerSocket) ssf.createServerSocket(443);

new Server(socket);
new Server(secureSocket);
System.console().readLine("Press ENTER to stop server.");
} catch(Exception e) {
System.out.println("Something went wrong!");
System.out.println(e);
}
}
}

11.1.1 Python rnekleri


HTTP istemci tarafnda Python ile gvenli soket kullanmn rnekleyen bir kod aadadr:
#! /usr/bin/python

import sys,socket

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 54/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

if len(sys.argv)<4:
print "Usage:"
print sys.argv[0]," hostname port docpath"
sys.exit(0)
hostname = sys.argv[1]
port = int(sys.argv[2])
docpath=sys.argv[3]
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((hostname,port))
sslsock=socket.ssl(sock)
sslsock.write("GET "+docpath+" HTTP/1.0\n\n")
reply=sslsock.read()
while reply:
print reply
try:
reply=sslsock.read()
except:
sys.exit()

Daha gncel Python versiyonlarnda ssl isimli kitaplk kullanlmaktadr:


#! /usr/bin/python

import sys,socket, ssl

if len(sys.argv)<4:
print "Usage:"
print sys.argv[0]," hostname port docpath"
sys.exit(0)
hostname = sys.argv[1]
port = int(sys.argv[2])
docpath=sys.argv[3]
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket(sock)
ssl_sock.connect((hostname,port))
ssl_sock.write("GET "+docpath+" HTTP/1.0\n\n")
reply=ssl_sock.read()
while reply:
print reply
try:
reply=ssl_sock.read()
except:
sys.exit()

Burada sunucu taraf iin bir rnek sunulmamtr.

12 Datk Sreler
Vasat gce sahip bilgisayarlarn maliyeti giderek dyor. Oysa daha fazla hesaplama gcne sahip bilgisayarlar retmek hibir zaman kolay ve dk maliyetli
olmamaktadr. Daha gl ilemciler (CPU) yapmak kk bir fiziksel alanda ok fazla devre ve dolaysyla snma gibi ok temel fiziksel snrlara arpar. Bir
bilgisayara daha fazla sayda vasat CPU ve RAM koymak ise sistemin nasl iletileceiyle ilgili ok sayda komplikasyonlar karlar. Yine de gnmzde makul
maliyetle belirli bir dzeye kadar ok CPU'lu sistemler yaplabiliyor. Bu trden bilgisayarlardaki ilem gcnn ok izlekli srelerle nasl deerlendirilebileceini
daha nceki blmlerde inceledik.

Bu sebeblerden tr yksek hesaplama gc gerektiren ileri ok sayda vasat bilgisayara paylatrarak halletme yntemi son derece cazip olmaktadr. Bu blmde
bu yntemin hangi tr problemlere uygulanabileceini, ve ne ekilde programlanabileceini inceleyeceiz.

12.1 Hangi problemler paralelletirilebilir ve datlabilir?


ok izlekli sreler konusunu incelerken eer hesaplama biribirinden ksmen veya tamamen bamsz yrtlen srelerden oluuyorsa bunun ok izlekli bir
programla zlebileceini ve daha hzl alan bir sre ortaya kacan grdk. ncelediimiz problemler rnein ok sayda istemciye hizmet veren sunucularn
bu istemcileri izleklere paylatrmas tr zmler ieriyordu. Bu yaklam yaplacak ilerin bamsz blmlerini ayn bir fabrikadaki gibi paralel olarak
yrtmeye dayanmaktadr.

te yandan ok izlekli programlarmzn bir ksm ancak bellek paylalabildii iin iler (rnein sohbet sunucusu). Bu dzeyde bir paylam izleklerle
uygulanabilir, ancak farkl bilgisayarlara datlm srelerde uygulanamaz.

te yandan hesaplama problemlerinin kayda deer bir ksm ya tamamen biribirinden bamsz paralardan olumutur, ya da farkl teorik yaklamlar kullanarak
ksmen bamsz hale getirilebilirler. rnein bilgisayar animasyonuyla yaplan filmlerde bir film karesinin ortaya kartlmas iin boyutlu modelin, k ve
perspektif parametreleriyle beraber ilenerek ok miktarda hesaplama yaplmas gerekir. Ancak filmin her karesi biribirinden bamsz olarak ortaya kartlabilir.
Byle bir problem datk srelere son derece uygundur. Benzer ekilde rnein biyoenformatik problemlerinde gen benzerliklerinin taranmas veya protein
katlanmas problemleri, kriptoanaliz problemleri, uydu grntlerinin ilenmesi, vb. paralelletirilebilir nitelikte problemlerdir.

Bu problemleri temel olarak iki gruba ayrmak faydal olacaktr:

Tamamen bamsz problemler (Embarrassingly parallel problem): Animasyon rneindeki gibi problemin alt paralarnn tamamen biribirinden bamsz
zlebildii problemlerdir.
Ksmen baml problemler: Bu problemlerde srecin belirli aamasnda/aamalarnda alt-problemler arasnda iletiim kurmak gerekmektedir. rnek olarak
daha nceki blmlerde incelediimiz simetrik ifreleme ilemini dnn. Bu ilemde yerdeitirme ilemleri (ilgili ekildeki kapal kutular) paralel olarak
yaplabilir. Ancak bir sonraki ilem katmanna devam etmeden nce, permtasyon aamasnda paralel ilemlerin biribirini beklemesi gerekecektir. Dolaysyla
ilemin ancak kimi aamalar paralel yrtlr, birtakm aamalar ise kanlmaz olarak sral (parelel'in tersi, sequential) yrtlmek zorundadr.

12.2 Datk sre programlama teknikleri ve ilgili standartlar


Bu blmde greceimiz teknikler paralel yrtlebilen ilerin, veya ksmen baml problemlerde iin paralel yrtlebilen ksmlarnn nasl programlanacana
ve paralel ilemlerin koordine edileceine ilikindir. Koordinasyon ihtiyac bu tr problemlerde kanlmaz olarak sunucu/istemci mimarisini gerektirir. Ancak bu
kez daha nce topolojiler blmnde incelediimiz "tek istemci ok sunucu" modeli geerlidir. nk ileri datan merkez i paralarn stlenen bilgisayarlara
aktif olarak talepte/istemde bulunmak durumundadr. Dolaysyla bu mimariyi koordinatr-sunucu mimarisi diye anmamz daha doru olur.

Bu tekniklerin tamamnda merkezdeki bir srecin uzaktaki bir fonksiyonu/metodu armas, fonksiyonun uzaktaki bilgisayarda onun gcyle hesaplanmas ve
cevabn ary yapan koordinatre geri dndrlmesi szkonusudur. Koordinatr ok sayda bu tr ary ayn anda birden fazla sunucuya gndermekte ve ii bitip
http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 55/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
cevap dndren sunuculara hemen yeni iler vermektedir.

Datk srelerde koordinatr ve sunucular arasndaki genel i ak

Btn bunlarn yaplabilmesi iin temel bir ihtiya smzkonusudur: koordinatr sunuculardaki belirli bir fonksiyonu arabilmeli, ary yaparken temel veya
karmak bir veri (rnein tamsay veya bir film karesinin matematiksel modeli) olan fonksiyon parametrelerini gnderebilmelidir. Sunucu da geri dn deeri olan
temel veya karmak veriyi gnderebilmelidir. Her ne kadar iletiim iin TCP'den HTTP'ye kadar birok temel protokol varsa da bunlar bu ekilde "programatik
biim"i olan verileri ifade etme problemine zm getirmezler.

Bu problem farkl zamanlarda popler olan farkl programlama dilleri iin farkl yntemlerle zlmtr:

RPC (Remote Procedure Call): C dilinin yaygn olduu zamanlarda tasarlanmtr. C programlama dili son derece gevek bir tip sistemine sahip olduundan
olduka sorunlu bir yntemdir. Bu yntemin ileyii programlama hatalarna kar son derece savunmaszdr.
CORBA (Commopn Object Request Broker Architecture): C++ dilinin yaygnlamasyla beraber datk ilemleri nesne tabanl programlarda kullanmak iin
tasarlanmtr. Esasen C++ dilini hedeflemekle beraber dilden bamsz bir standarttr ve baka dillerle de kullanlabilir. En nemli sakncas bu yntemle
koordinatr-sunucu arasnda gnderilebilecek verilerin C/C++ dillerine zg olmasdr. rnein bir tamsay veya tamsay dizisi gnderilebilir. te yandan say
ve metinlerin kark depolanabildii bir Python dizisini bu ekilde gndermek mmkn deildir.
RMI (Remote Method Invocation): Java diline zg bir yntemdir. Dilin nemli zelliklerinden biri olan nesnelerin serilmesi/dsallatrlmas (serialization)
becerisinden yararlanr. Her Java nesnesi bir byte dizisi haline getirilebilir, bu dizi nesneyi diske depolanp sonra yeniden alnmak veya adan baka bir
bilgisayara gndermek iin kullanlabilir. Bu byte dizisi nesnenin hangi snftan olduu dahil, onu dsallatrld anki haliyle yeniden canlandrmak iin
yeterlidir. Bu sayede Uzaktaki bir fonksiyon arlrken istenilen nesne/nesneler parametre olarak gnderilebilir ve cevap ta ayn imkandan yararlanr.
XML-RPC RMI ynteminin baarsndan esinlenerek tasarlanan XML-RPC standard birka yenilik birden getirir: (1) bu standart ile RMI'da olduu gibi
nesneler gnderilememekle beraber karmak veri yaplar (rnein kark Pythoon dizileri) gnderilebilir, ve (2) veri dsallatrmas iin XML standardn
ve veri transferi iin de HTTP standardn kulland iin hemen her programlama dili iin XML-RPC kitaplklar yapmak mmkn olmutur. Bu sayede
fonksiyon arsnn iki ucu farkl dillerde yazlm programlardan treyen sreler olabilmektedir.

12.3 Remote Method Invocation (RMI)


Standart Java gelitirici kitleri (SDK) RMI ile datk programlama iin kullanabileceiniz bir kitaplk salarlar (java.rmi). Bu kitaplk iin geni bir
dkmantasyonu web'de bulabilirsiniz: http://java.sun.com/javase/6/docs/technotes/guides/rmi/index.html .

Uzak bir bilgisayardaki bir srete bulunan bir nesnenin bir metodunu arabilmek iin baz koullarn salanmas gerekecektir:

1. aran ve rlan metodun ismi, metod parametlerinin listesi ve veri tipleri, ve metodun geri dn veri tipi hakknda fikir birliinde olmaldrlar.
2. Eer uzaktaki metod bir hata verme potansiyeli tayorsa bu durumu geri dn deeri yerine ary yapana anlatmann bir yolu olmaldr.
3. Hem parametreler hem de geri dn deeri dsallatrmaya uygun olmaldr. Yani Java'nn Serializable arayzn desteklemelidir.
4. RMI iletiimi iin belirli bir a soketi tahsis edilmelidir. Ayrca gerekli grlyorsa gvenlik korumas (rnein SSL) salanmaldr.

Yukardaki birinci koulu salamak iin Java'nn zm arnn iki tarafnn ortak bir arayz tanm kullanmasdr. Arayz tm metod ve veri tiplerini bir kontrata
balam olacaktr. Java RMI altyaps bu i iin kullanlacak arayzn java.rmi kitaplndaki Remote arayznden tretilmesini art komaktadr. rnek bir arayz
aadadr. Bu rnein hedeflerdii datk problem tamsaylarn asal faktrlerine ayrlmas problemidir. Sunucu kendisine verilen tamsaynn asal faktrlerini liste
olarak dndrecektir. Ayrca istenirse o ana kadar ne kadar servis verdiine dair bir istatistiki say da dndrmesi dnlmtr :
/**
* An RMI Interface definition
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/
import java.rmi.*;
import java.util.*;

public interface RMIExampleInterface extends Remote {


/** Check an return whether the given integer is prime*/
boolean isPrime(int n) throws RemoteException;

/** Return a list of prime factors of given integer */


ArrayList factorize(int n) throws RemoteException;

/** Return the number of factorizations or primality checks


* carried out by the remote object*/
int jobCount() throws RemoteException;
}

Bu arayzdeki tm parametre ve geri dn veri tipleri (int ve ArrayList) zaten Serializable arayzn desteklediinden dsallatrma problemi ile ilgili koul yerine
getirilmi oluyor (kendi tanmladmz snflar veri tipi olarak kullansaydk o snflar 'implements Serializable' diyerek tanmlamamz gerekecekti). Arayzn
kendisi Remote arayznden tredii iin Java bu arayzle yaplan snf ve nesnelerde RMI kullanmak iin gerekli altyap nlemlerini kendiliinden alacaktr.

Bu arayz tasarm kodu sunucu ve istemci/koordinatr programlarnda paylalmaldr. Bu ekilde derlendiklerinde RMI zerinden konuabileceklerdir. Sunucu
program iin bunun dnda zel bir programlama koulu bulunmamaktadr. Faktrizasyon ilemini olduka basit (ve muhtemelen verimsiz!) bir biimde
gerekletiren rnek program aadadr:
/**
* An example RMI Server
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.util.*;

class RMIExampleServerImplementation implements RMIExampleInterface{


private int jobcount;
public RMIExampleServerImplementation() throws RemoteException {
jobcount=0;

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 56/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
}
public boolean isPrime(int n) throws RemoteException {
if (n<=0)
throw new RemoteException("Cannot check non-positive numbers");
synchronized (this) {
jobcount+=1;
}
for(int j=2;j<n;j=j+1)
if (n%j==0)
return false;
return true;
}
public ArrayList factorize(int n) throws RemoteException {
if (n<=0)
throw new RemoteException("Cannot factorize non-positive numbers");
synchronized (this) {
jobcount+=1;
}
System.console().format("Factorizing %d\n",n);
ArrayList factors=new ArrayList();
int m=n;
for(int j=2;j<n;j=j+1)
if (isPrime(j))
while (m%j==0) {
factors.add(j);
m=m/j;
}
return factors;
}
public int jobCount() throws RemoteException{
return jobcount;
}
}

public class RMIExampleServer {


public static void main(String[] args) {
try {
//Create the shared object
RMIExampleServerImplementation object = new RMIExampleServerImplementation();
//Export the object to RMI subsystem to be served on a random suitable network socket
RMIExampleInterface shared = (RMIExampleInterface) UnicastRemoteObject.exportObject(object, 0);

// Bind the remote object's stub in the registry so that


// socket can be found by callers and named object can be located
Registry registry = LocateRegistry.getRegistry();
registry.bind("Factorizer", shared);

System.out.println("Server is ready");
} catch (Exception e) {
System.out.println(e);
}
}
}

Bu sunucu programnn RMI ile ilikili olarak yapt en nemli ey yukardaki koullara uygun olan RMIExampleServerImplementation snfndan bir nesneyi
yarattktan sonra Java VM'de alan ve RMI eriimini koordine etmekle ykml olan RMI kayt noktasna (RMI registry) bu nesneyi kaydettirmektir. Ancak ondan
sonra nesne baka bilgisayarlardan gelen RMI taleplerini alabilecek ve cevaplayabilecektir. Bu yzden nce RMI kayt noktas ilevini yrten standart Java SDK
uygulamasn altrn:
$ rmiregistry

Merak edenler iin bu uygulamann standart olarak 1099 nolu portu atn ve RMI arlarn buradan beklediini belirtelim.

Bu uygulama alr haldeyken artk sunucuyu altrabilirsiniz:


$ java RMIExampleServer
Server is ready

Sunucu programn main() metodunda grdnz ilemler oluturulan nesneyi "factorizer" adyla b kayt noktasna kaydetmektedir. Daha sonra greceimiz gibi
istenirse bu ilemlerin gvenlik korumasnda (SSL ile) yaplmas iin seenekler de bulunmaktadr. Nesnenin RMI kayt noktasna kaydedilmesiyle beraber Java
RMI altsistemi devreye girer ve ar/dn ilemlerinin gerekli ekilde dsallatrmasn, ayrca hata durumlarnn iletiiminin ve yakalanmasn otomatik olarak
yapar.

Dardan eriecek istemci/koordinatr srelerinin kayt ktne gelerek ayn ismi kullanp bu nesney bulmalar yeterli olacaktr. Byle bir istemci kodu aada
verilmitir:
import java.io.*;
import java.util.*;
import java.rmi.*;
import java.rmi.registry.*;

public class RMIExampleClient {


public static void main(String[] args) {
String host="";
String objectname="";
try {
host=args[0];
objectname=args[1];
}catch(Exception e) {
System.out.println("Usage:\n RMIExampleClient <server> <object>\n for example: RMIExampleClient localhost Factorizer");
System.exit(0);
}
try{
//Locate the serve and the object on it
Registry registry = LocateRegistry.getRegistry(host);
RMIExampleInterface server = (RMIExampleInterface)registry.lookup(objectname);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

for(;;) {
try{
System.console().format("Enter an integer:");

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 57/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
String input=in.readLine();
int n=Integer.parseInt(input);
ArrayList factors=server.factorize(n); //call remote method
boolean isPrime=server.isPrime(n); //call remote method
System.console().format("%d is prime? :%s \nPrime factors of %d: %s\n", n, isPrime, n, factors);
} catch (Exception e){
System.out.println(e);
break;
}
}
} catch (Exception e) {
System.out.println(e);
}
}
}

Bu istemci program ncelikle uzaktaki bilgisayarda aktif olan RMI kayt noktasn bulmak zorundadr. Yerelde altrsanz bile bu 1099 nolu porttan TCP
balants yaplarak gerekleecektir. Daha sonra istemci nceden zerinde anlalm olan "factorizer" kod adn kullanarak RMIExampleInterface arayznden
treyen sunucu nesnesini elde eder. Artk istemci bu sunucu nesnesinin metodlarn sanki kendi nesnesiymi gibi kullanabilecektir. Tabi bu kullanma ileminin bloke
bir ar olduunu hatrlatmak gerek. Yani istemci server.factorize(n) komutunu altrdnda RMI sistemi devreye girecek, talep sunucuya iletilecek, sunucuda
alp cevap retilecek, cevap istemciye geri gelecek. stemci btn bu sre boyunca komutta bloke olur ve cevab bekler.
$ java RMIExampleClient localhost Factorizer
Enter an integer:18
18 is prime? :false
Prime factors of 18: [2, 3, 3]
Enter an integer:

12.3.1 RMI Ezamanllk


Hemen belirtelim ki bu altrma senaryosunda herhangi bir paralellik kullanmadk. Stemci aslnda yerelde yapabilecei bir ilemi uzaktaki bir srece yaptrm
oldu. Gerek bir paralelletirme iin koordinatr programnn birden fazla sunucuyu ezamanl olarak kontrol etmesi gerekecektir. Bunun iin ok izlekli veya izlek
havuzu gibi kullanan koordinatr programlar kullanlabilir.

te yandan sunucu iin bambaka bir problem szkonusudur. RMI altsistemi paralel arlara izin verir. Yani yazdnz sunucu programna birden fazla istemciden
ezamanl arlar gelebilir, ve bu durumda herbiri bir izlekte altrlr. Bu sizin kontrolnz dnda olmaktadr. Ancak yazdnz snc program bunu dikkate
almak durumundadr. Bu yzdendir ki sunucu programmzda i sayac arttrlrken u ekilde bir kod paras kullanlmtr:
synchronized (this) {
jobcount+=1;
}

12.4 RMI ve SSL Gvenlii


RMI kullanlrken RMI altsisteminin standart olarak salad gvensiz soketler yerine SSL ile gvenli soket kullanlabilir. Hatta byk verilerin akn
hzlandrmak iin dsallatrlm nesnelerin sktrlarak gnderilmesi gibi ek zellikler de devreye sokulabilir. Gvenli soket kullanmn rnekleyen bir sunucuyu
aada grebilirsiniz:
/**
* An example RMI Server
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*/

import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.util.*;
import java.net.*;
import javax.net.ssl.*;
import java.security.KeyStore;
import javax.net.*;
import javax.security.cert.X509Certificate;

//This implementation extends UnicastRemoteObject


class RMIExampleServerImplementation extends UnicastRemoteObject implements RMIExampleInterface{
private int jobcount;
public RMIExampleServerImplementation(String storename, char[] storepass, char[] keypass) throws RemoteException {
//Following changes the underlying socket mechanism of UnicastRemoteObject
super(0, new RMISSLClientSocketFactory(),
new RMISSLServerSocketFactory(storename,storepass,keypass));
jobcount=0;
}
public boolean isPrime(int n) throws RemoteException {
if (n<=0)
throw new RemoteException("Cannot check non-positive numbers");
synchronized (this) {
jobcount+=1;
}
for(int j=2;j<n;j=j+1)
if (n%j==0)
return false;
return true;
}
public ArrayList factorize(int n) throws RemoteException {
if (n<=0)
throw new RemoteException("Cannot factorize non-positive numbers");
synchronized (this) {
jobcount+=1;
}
System.console().format("Factorizing %d\n",n);
ArrayList factors=new ArrayList();
int m=n;
for(int j=2;j<n;j=j+1)
if (isPrime(j))
while (m%j==0) {
factors.add(j);
m=m/j;

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 58/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
}
return factors;
}
public int jobCount() throws RemoteException{
return jobcount;
}
}

class RMISSLServerSocketFactory
implements RMIServerSocketFactory, Serializable {
SSLContext ctx;
RMISSLServerSocketFactory(String storename, char[] storepass, char[] keypass) {
try {
// set up key manager to do server authentication
KeyManagerFactory kmf;
KeyStore ks;

ctx = SSLContext.getInstance("TLS");
kmf = KeyManagerFactory.getInstance("SunX509");
ks = KeyStore.getInstance("JKS");

ks.load(new FileInputStream(storename), storepass);


kmf.init(ks, keypass);
ctx.init(kmf.getKeyManagers(), null, null);
} catch (Exception e) {
e.printStackTrace();
}
}
public ServerSocket createServerSocket(int port) throws IOException {
SSLServerSocketFactory ssf = null;
try {
ssf = ctx.getServerSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return ssf.createServerSocket(port);
}
}

class RMISSLClientSocketFactory
implements RMIClientSocketFactory, Serializable {

public Socket createSocket(String host, int port)


throws IOException
{
SSLSocketFactory factory =
(SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
return socket;
}
}

public class RMIExampleServerSSL {


public static void main(String[] args) {
try {
int port=8000;
String certFile="";
try {
port=Integer.parseInt(args[0]);
certFile=args[1];
} catch(Exception e) {
System.out.println("Usage:\n SSLserver <port> <servercertificatefile>");
System.exit(0);
}
//THE FOLLOWING LINES ARE NEEDED FOR SSL CERTIFICATE LOADING
char storePassword[] = System.console().readPassword("Enter store password:");
char keyPassword[] = System.console().readPassword("Enter certificate key password:");

//Create the shared object


RMIExampleServerImplementation object = new RMIExampleServerImplementation(certFile,storePassword,keyPassword);
//Since the object extends UnicastRemoteObject, there is no need to export the object to RMI subsystem
//RMIExampleInterface shared = (RMIExampleInterface) UnicastRemoteObject.exportObject(object, 0);

// Bind the remote object's stub in the registry so that


// socket can be found by callers and named object can be located
Registry registry = LocateRegistry.getRegistry();
registry.bind("Factorizer", object);

System.out.println("Server is ready");
} catch (Exception e) {
System.out.println(e);
}
}
}

Bu yeni sunucu programndaki snf tanmmz soket altyapsyla oynayabilmek amacyla UnicastRemoteObject snfndan tremektedir. Bu snf (ve ondan
treyenler) zaten RMI altsistemi ile entegrasyon amacyla varolduundan dolay yeni sunucumuzda bu nesney RMI altsistemine aktaran kodlarn bazlar
deimektedir. Sunucu nesnesini "UnicastRemoteObject.exportObject(object, 0)" diyerek paketlemeye gerek kalmamaktadr.

Bu gvenli sunucuyu kullanmak iin RMI istemci tarafnda hibir deiiklie gerek yoktur. Sunucu program istemcileri ynlendirmek iin gerekli kodlar
iermektedir. Sunucudaki RMISSLClientSocketFactory snf bu ayarlama iin oluturulmutur.

12.5 XML-RPC
XML-RPC'deki tasarm ncelii programlama dilinden bamsz olmasdr. Tam da bu yzden Java RMI'da olduu gibi uzak bir nesneyi sanki yerelmi gibi
kullanmaya uygun deildir. te yandan basit ve karmak veri tiplerini standartlatrmaktadr. Yani bu yntemler saylar, metinler, listeler, vb. gibi veri yaplar ar
parametresi veya geri dn deeri olarak tanabilirler. Standardn tam tarifi web zerinde bulunabilir: http://www.xmlrpc.com/spec .

XML-RPC ar ve cevaplar XML tabanl standart bir formata dntrlr. Aada rneini grdnz ar, hata veya olumlu cevaplar HTTP gibi metin
tabanl ve yaygn bir protokol zerinden tanabilecek ekilde tasarlanmtr:

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 59/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
######## REQUEST ##########
POST /RPC2 HTTP/1.0
User-Agent: Mozilla/1.0 (Ubuntu)
Host: cs.bilgi.edu.tr
Content-Type: text/xml
Content-length: 181

<?xml version="1.0"?>
<methodCall>
<methodName>example.factorize</methodName>
<params>
<param>
<value><i4>12</i4></value>
</param>
</params>
</methodCall>
######## RESPONSE (HTTP Headers omitted)########
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<array>
<data>
<value><i4>3</i4></value>
<value><i4>2</i4></value>
<value><i4>2</i4></value>
</data>
</array>
</param>
</params>
</methodResponse>
######## ERROR RESPONSE (HTTP Headers omitted)#####
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Too many parameters.</string>
</value>
</member>
</struct>
</value>
</fault>
</methodResponse>

XML-RPC standard belirli sayda ama yeterli kapsamda veri tipi tanmlarn standartlatrr. Yukardaki rnekte deer/value geen yerlerde aadaki veri tipleri
kullanlabilmektedir:

i4 veya int: drt byte standart iaretli tamsay.


boolean: doru/yanl deeri.
double: ift hassasiyetli gerek say.
String: metin.
dateTime.iso8601: Tarih/zaman, rn. ``19980717T14:08:55''
base64: base64 ekodlanm her trl veri. Bu veri tipi metin olmayan, rnein resim vb. verileri gndermek iin kullanlabilir.

Bu deerler tek bana yeralabildii gibi bir liste () veya veri yapsnn() altnda da olabilirler. Bylece almak veri yaplar aktarlabilmektedir. XML kodlamasnda
farkl karakter setleri de kullanlabilir. Ancak en yaygn UTF-8'dir.

XML-RPC metin tabanl olduundan web sayfalar iin kullanlan HTTP protokol ve dolaysyla standart web sunucular zerinden servis edilebilir. Gnmzde
yaygn kullanlan "web servisi" terimi web sunucusunun XML-RPC ile programatik arayz sunduu bu durumu ifade etmektedir.

Java'da XML-RPC destei standart SDK'da deildir. Bunun yerinde Apache projesinin salad bir kitaplk fiilen standart olarak kullanlmaktadr diyebiliriz (
http://ws.apache.org/xmlrpc/ ). Aadaki rnek sunucu taraf program yukarda RMI'da kullandmz asal faktr rneinin sadece ilevlerini gerekletirmektedir:
/**
* A class to be shared over XMLRPC
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*
* Since the class has to be public, it is put on a separate file
*/
import java.util.*;

public class XMLRPCShared{


private static int jobCount;

/** Return whether given number is prime*/


public boolean isPrime(int i){
for(int j=2;j<i;j=j+1)
if (i%j==0)
return false;
return true;
}

/** Return prime factors of given number */


//XMLRPC limits return value to some basic types in the standard
// or objects or arrays of objects
public Object[] primeFactors(int n) {
System.console().format("Factorizing %d\n",n);
ArrayList<Integer> factors=new ArrayList<Integer>();
int m=n;
for(int j=2;j<n;j=j+1)
if (isPrime(j))
while (m%j==0) {
factors.add(new Integer(j));
m=m/j;

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 60/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
}
synchronized (XMLRPCShared.class) {
jobCount+=1;
}
System.console().format("Factors of %d: ",n);
System.out.println(factors);
return factors.toArray();
}

public int getJobCount() {


return jobCount;
}
}

Bu ilevleri XML-RPC zerinden sunan program ise aadadir:


/*
* Simple XMLRPC server using Apache's XML-RPC library
*
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*
* This example uses builtin web server of Apache library.
* Download and extract the library from http://ws.apache.org/xmlrpc/
* This program is tested with version 3.1.1 of the Apache xmlrpc library.
* Once you have the lirary extracted somewhere you must compile and run this code similar to following:
*
* CLASSPATH=../xmlrpc-3.1.1/lib/commons-logging-1.1.jar:../xmlrpc-3.1.1/lib/ws-commons-util-1.0.2.jar:../xmlrpc-3.1.1/lib/xmlrpc-common-3
* export CLASSPATH
* javac XMLRPCServerExample.java
* java XMLRPCServerExample 8000
*
*/
import org.apache.xmlrpc.webserver.*;
import org.apache.xmlrpc.server.*;
import org.apache.xmlrpc.common.*;
import org.apache.xmlrpc.metadata.*;
import java.util.*;

public class XMLRPCServerExample{


public static void main(String args[]){
//Read the port number to use for XML-RPC enabled Web server
int port=0;
try {
port=Integer.parseInt(args[0]);
}catch(Exception e) {
System.out.println("Usage:\n XMLRPCServerExample <port-no>");
System.exit(0);
}
try{
WebServer webserver = new WebServer(port);
XmlRpcStreamServer rpcserver=webserver.getXmlRpcServer();
PropertyHandlerMapping phm = new PropertyHandlerMapping();
phm.addHandler("Factorizer", XMLRPCShared.class);
rpcserver.setHandlerMapping(phm);
//Following line enables introspection:
XmlRpcSystemImpl.addSystemHandler((PropertyHandlerMapping)rpcserver.getHandlerMapping());
//Following could be set if Java specific objects (eg. primitive types) needs to be returned
// the so called Vendor specific extensions
//XmlRpcServerConfigImpl serverConfig =(XmlRpcServerConfigImpl) rpcserver.getConfig();
//serverConfig.setEnabledForExtensions(true);
//serverConfig.setContentLengthOptional(true);
webserver.start();
System.out.println("XML-RPC server is awaiting for calls at port:"+port);
} catch (Exception e){
System.out.println(e);
}
}

Bu program da RMI'da olduu gibi servise alan kodu belirli bir isimle kaydetmektedir. Ancak RMI'dan farkl olarak kaydedilen ey bir nesne deil bir snf.
Dolaysyla her gelen talep iin bir nesne yaratlp, servis verilip, sonra da nesne ortadan kaldrlmaktadr (bu yzden jobCount bir snf deikeni olarak
tanmlanmtr). Elbette istenirse singleton bir snf yaratlarak bu sorunun stesinden gelinebilir.

Bu sistemin istemcisi de aadaki rnekteki gibi yazlabilir:


/*
* Simple XMLRPC Client using Apache's XML-RPC library
*
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*
* You will need both Apache xml-rpc library (http://ws.apache.org/xmlrpc/)
* and httpclient library (http://hc.apache.org/downloads.cgi)
* This program is tested with version 3.1.1 of the Apache xmlrpc library and 4.0beta2 of httpclient library.
* Once you have the lirary extracted somewhere you must compile and run this code similar to following:
*
* CLASSPATH=../xmlrpc-3.1.1/lib/commons-logging-1.1.jar:../xmlrpc-3.1.1/lib/ws-commons-util-1.0.2.jar:../xmlrpc-3.1.1/lib/xmlrpc-common-3
* export CLASSPATH
* javac XMLRPCClientExample.java
* java XMLRPCClientExample http://localhost:8000/xmlrpc
*/

import java.util.*;
import java.net.*;
import org.apache.xmlrpc.*;
import org.apache.xmlrpc.client.*;

public class XMLRPCClientExample {


public static void main(String[] args) throws Exception {
String serverUrl="";
try{
serverUrl=args[0];
}catch(Exception e) {

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 61/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
System.out.println("Usage:\n XMLRPCClientExample <server-url>\n Where server url is something like http://localhost:8000/")
System.exit(0);
}
XmlRpcClientConfigImpl config=new XmlRpcClientConfigImpl();
config.setServerURL(new URL(serverUrl));
//Following could be set if Java specific objects (eg. primitive types) needs to be returned
// the so called Vendor specific extensions
//config.setEnabledForExtensions(true);
//config.setContentLengthOptional(true);
XmlRpcClient client= new XmlRpcClient();
client.setConfig(config);
try {
// The parameters needed for call
Object[] params = new Object[1];
int n;
for(;;) {
try{
n=Integer.parseInt(System.console().readLine("Enter a number to factorize:"));
} catch(NumberFormatException e) {break;}
//parameters are always an array and always contain Object types (not primitive types)
//so the following 'packaging' is necessary
params[0]=new Integer(n);
Object[] factors=(Object[]) client.execute("Factorizer.primeFactors",params);
System.console().format("Factors of %d are: ",n);
for (int i=0;i<factors.length;i++)
System.console().format("%d ",((Integer)factors[i]).intValue());
System.out.println();
}
//The following call has no parameters, hence an array of length 0
System.console().format("Server job count: %d \n",client.execute("Factorizer.getJobCount",new Object[0]));
}catch(Exception e) {
System.out.println(e);
}
}
}

Eer isterseniz istemci tarafn istediiniz programlama dilinde yazabilirsiniz. Aadaki Python rnei istemci kullanmna ek olarak XML-RPC'nin inceleme
(introspection) zelliklerini rneklemektedir:
import sys,xmlrpclib

try:
serverurl=sys.argv[1]
except:
print "Usage:\n %s <server-url>"%sys.argv[0]
sys.exit()
server = xmlrpclib.ServerProxy(serverurl) #create server connection
#Display method help
for method in server.system.listMethods():
print "%s: %s\n %s"%(method, server.system.methodSignature(method), server.system.methodHelp(method))
while 1:#Repeadetly input from user
try:n=input("Enter an integer:")
except:
print "Server job count:",server.Factorizer.getJobCount()
break
print "N is prime? ", server.Factorizer.isPrime(n)
print "N factors: ", server.Factorizer.primeFactors(n)

XML-RPC standard uygulamadan gelen talepler dorultusunda zaman ierisinde biraz "gevetilmi" ve dile zg veri tiplerinin kullanmn da destekler olarak
dzenlenmitir.

Bu sunucunun Python versiyonu da aada verilmitir:


from xmlrpc.server import SimpleXMLRPCServer

class Factorizer:
def __init__(self):
self.jobCount=0
def isPrime(self, i):
for j in range(2,i):
if (i%j==0)
return False
return True
def primeFactors(self, n):
factors=[]
m=n
for j in range (2,n):
if (self.isPrime(j)):
while m%j==0:
factors.append(j)
m=m/j
self.jobCount+=1
return factors

def getJobCount(self):
return self.jobCount

server = SimpleXMLRPCServer(("localhost", 8000))


server.register_instance(Factorizer())
server.serve_forever()

12.6 Asenkron XML-RPC


Apache Java XML-RPC kitapl istemci/koordinatr programlarnn yazmn kolaylatrmak iin asenkron arlar destekleme zelliini sunmaktadr. Asenkron
arda istemci taraf bloke olmaz, onun yerine ar tamamlandnda ne yaplmas gerektiini belirtir ve iine devam eder. Bu sayede ok sayda istemcinin
ynetimi son derece kolaylamaktadr. Aadaki kodda grebileceiniz zere bu zellik client.execute() metodu yerine client.executeAsync() metodu kullanlarak,
ve i bittiinde devreye girecek standart bir nesne (AsyncCallback arayznden tretilmi) verilerek yaplmaktadr.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 62/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
/*
* Asynchronous XMLRPC Client using Apache's XML-RPC library
*
* Author: Mehmet Gencer, mgencer@cs.bilgi.edu.tr
*
*/
import java.util.*;
import java.net.*;
import org.apache.xmlrpc.*;
import org.apache.xmlrpc.client.*;

class MyCallback implements AsyncCallback {


int n;
boolean done;
public MyCallback(int n) {
this.n=n;
done=false;
}
public void handleResult (XmlRpcRequest request, Object result) {
System.console().format("Factors of %d are: ", n);
Object[] results=(Object[]) result;
for (int i=0;i<results.length;i++)
System.console().format("%d ",((Integer)results[i]).intValue());
System.out.println();
done=true;
}
public void handleError (XmlRpcRequest request, Throwable error) {
System.console().format("An exception is thrown when factorizing %d:\n %s ", n, error.toString());
done=true;
}
}

public class XMLRPCAsyncClient{


// this method returns a string
public static void main(String args[]){
String serverUrl="";
try{
serverUrl=args[0];
}catch(Exception e) {
System.out.println("Usage:\n XMLRPCAsyncClient <server-url>\n Where server url is something like http://localhost:8000/");
System.exit(0);
}
try{
XmlRpcClientConfigImpl config=new XmlRpcClientConfigImpl();
config.setServerURL(new URL(serverUrl));
XmlRpcClient client= new XmlRpcClient();
client.setConfig(config);
Object[] params = new Object[]{new Integer(1234)};
MyCallback c1=new MyCallback(1234);
client.executeAsync("Factorizer.primeFactors", params, c1);
params=new Object[]{new Integer(12345)};
MyCallback c2=new MyCallback(12345);
client.executeAsync("Factorizer.primeFactors", params, c2);
while (!(c1.done&&c2.done));
}catch(Exception e){
System.out.println(e);
}
}

13 Datk mimariler: Peer-to-peer


imdiye kadar rnek olarak incelediimiz tm senaryolar temel bir asimetriye dayanyor: sunucu ve istemci. Bu senaryolarda rol asimetrisinin gerei olarak her
zaman bir merkez (sunucu veya koordinatr) ve o merkeze balanan ok sayda baka u bulunuyor. Bu merkezli mimariye sklkla "yldz topoloji" ad verilir nk
yapsn izdiinizde yldz sembol gibi merkezde bir noktadan kan nlar andrr.

Yldz topolojisi ou durumda "kanlmaz" olarak kullanlr. rnein bir bankaclk uygulamasnda merkezi otoriteye karlk gelen bir sunucunun bulunmas
kanlmazdr. Ancak web'in (WWW) ortaya k bu yaygn mimarinin de sorgulanmasna neden olmutur. www'in yaps birbirine link'lenmi, belirli bir merkezi
olmayan ierik noktalarndan oluur. www'in yaygnlamasyla beraber ierik paylamnda yldz mimarisi dnda araylar ortaya kmtr.

Bu araylar besleyen en nemli neden yldz mimarisine sahip bir sistemin bymesindeki zorluktur. Sistemin bymesi u saysnn artmas anlamna gelir. Bu
durumu destekleyebilmesi iin merkez noktann giderek daha gl olmas gerekecektir. Bunun zorluklarndan (hem donanm hem srecin programlamas asndan)
birok yerde bahsettik. stelik merkezde oluacak bir problem ok sayda ucun da etkilenmesine yolaacaktr.

Bu durumu amay hedefleyen, merkezsiz topolojilere genel olarak peer-to-peer (P2P) mimari diyoruz. Merkezli mimariye sahip sistemler "komplike" ileyi
prensiplerine sahipken, P2P sistemleri "komplex" sistemlerdir. Baka bir deyile bu sistemler basit bileenlerin ok sayda biraraya gelmesinden ortaya kan
zelliklere sahiptir. Bir anlamda merkezli sistemler bir beyin tarafndan ynlendirilen ok-hcreli organizmaya benzer. Karmaktr. Beynin arzas tm organizmay
ilevsiz klar. te yandan P2P sistemler ise daha ok karnca kolonilerine benzetilebilir. Bu koloniler yaamsal ilevlerini birarada gerekletirirler, ve koloninin
tamamnn zellikleri temel basit zelliklere sahip bireylerin biraraya gelmesi ve belirli biimlerde ilikiler olumasndan kaynaklanr. Ancak koloni yelerinden
bazlar devre d kalsa bile koloni varln srdrebilir ve ilevini yerine getirebilir. Ancak byle bir koloninin karmak bir plan dahilinde hareket etmesi de
beklenmemelidir. Bu anlamda P2P sistemleri basit bir ilevi etkili ekilde yerine getiren, "paralarnn" arzalanmas yznden sistemin genelinin etkilenmedii
sistemlerdir.

ekildeki rnek sistemde nce baz balarn sonra da bileenlerden birinin yokolmas rneklenmitir. Sistem her seferinde bal bir izge olarak kalmtr. Yani
sistemdeki bileenlerin herbirinden dierine giden bir yol bulunmaktadr. Elbette ok fazla sayda iliki veya bileenin yokolmas durumunda byle bir sistem de
"kopabilir" ve ilevini yitirebilir. Ancak merkezli bir sisteme gre bu risk hem ok daha az hem de datlmtr.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 63/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
P2P mimarisinin balarn kaybna kar dayankll

P2P sistemlerinin star topololjilerinden nemli bir fark da bu sistemlerdeki bileenlerin hepsinin ayn rol oynamasdr. Sunucu/istemci mimarisindeki gibi bir rol
asimetrisi szkonusu deildir.

13.1 Hibrid sistemler


P2P sistemlere olan ilginin poplerlemesi 1990larn sonunda Napster mzik paylam sistemiyle balamtr denilebilir. Bu sistemin bir merkezi vard ve
sorgulamaya yaryordu. Ancak mzik paylam dorudan ular arasnda, merkezden gemeye gerek olmadan gerekleiyordu. Bu anlamda hibrid bir sistemdi.

Gnmzde de benzer hibrid sistemler vardr. Gnutella benzeri mimarilerde "ultra-peer" ad verilen baz bileenler merkez grevi grrler. Bu genellikle sisteme
yeni balanacak bileenlerin sisteme ulamasn ve entegre olmasn kolaylatrmak iin yaplmaktadr. Napster gibi tek merkezli sistemler en azndan ilevin baz
aamalar merkezilemi olduu iin yldz topolojisinin risklerine sahiptir. Ancak daha ara sistemlerde risk datlmtr.

13.2 Gnutella
lk baarl P2P uygulamalarndan olan Gnutella 2000 yl civarnda poplerlik kazanm bir dosya paylam adr. Gnutella ana katlan bilgisayarlar bir arama
yapmak iin anahtar kelimeleri ve kendi IP adreslerini bal bulunduklar bilgisayarlara gnderirler. Her bilgisayar bu trden arama taleplerini kendi bal olduklar
bilgisayarlara gnderir. Bylece bir arama gittike kabaran bir dizi ynlendirme ile an tamamna ulaacaktr.

Aranlan anahtar kelimelere uygun bir dosyay paylaan bilgisayarlar genellikle bunu dosya ismi ile anahtar kelimeleri karlatrarak bulurlar. Byle bir eleme
tespit eden bir bilgisayar arama paketinde bulunan arayann IP adresi bilgisine bakar ve ona dorudan bir cevap gnderir ve bu cevapta dosya ad (dosya tipini
gsteren uzants da dahil) ve boyutunu, ayrca kendi IP adresini gnderir. Btn bunlar UDP protokolyle gerekletiinden baland zahmeti azdr. Daha sonra
arayan bilgisayarn kullancs bu dosya bilgisini inceler ve eer indirmeye karar verirse iki bilgisayar arasnda TCP balants kurulu ve indirme gerekleir.

Gnutella'nn en byk problemi bu a ok byk boyutlara ulatnda ortaya kmtr. Aranlan dosyann yeri sistematik olarak deil tm an sorgulanmasyla
bulunduu iin ok fazla sayda bilgisayardan gelen sorgulama paketlerinin herkese ulatrlmas mmkn olamamtr. Yani tasarmda hedeflenen arama yntemi
an boyutlar byynce yrtlemez hale gelmitir.

13.3 Datk hash tablolar


Datk hash tablolar (distributed hash tables) gnmzde P2P uygulamalarnn en yaygnlarn kapsayan ve muhtemelen nternet trafiinin ok byk bir
blmnn kayna olan bir uygulama trdr. Bu uygulama ayn yerel hash tablosuna benzer ekilde aranan bir verinin anahtar verildiinde en ksa srede verinin
yerini bulmay amalar. Ancak datk versiyonu bunu nternet'ten bal ok sayda bilgisayar zerinde yapmaldr.

Datk hash tablolarnda tabloyu oluturan bilgisayarlar dier tm bilgisayarlar takip edemezler. erik paylamnn ilk rneklerinden olan Gnutella P2P a
leklenebilir bir a deildi. Bir arama yapmak istediinizde bal bulduunuz tm a bileenlerine bavuruyordunuz, ve onlar da bunu tm komularna iletiyordu,
vb. Dolaysyla N bileenden oluan bir P2P anda birey aramak yine N zaman sryor ve bir o kadar mesaj trafii yaratyordu, ki pratikte uygulamas bu
aramalarn an ok az bir ksmna ulaabilmesiyle sonulanmtr.

Datk hash tablolar ise Gnutella'dan alnan dersle an sistematik olarak taranmas prensibine dayanr. Bu tasarm grmek iin bu alandaki birok tasarma temel
oluturan Chord sistemine bakacaz (Stoica et al. 2001).

13.3.1 Chord

Datk hash tablosu ayn normal hash tablosu gibi (Cormen 2010) ok sayda "anahtar:deer" iftini tutmak, ve anahtar verildiinde deer'e ulamak iin
kullanlacaktr. Chord ve ardndan gelen tasarmlar hem bileenlerin kimliini hem de tabloda saklanacak anahtar deerlerini ayn deer uzayndan seerler. Bu
tasarmnda her bir peer' tanmlayan kimlik numaras 0 ile 2 1 arasndaki m bitlik saylardan biridir. 'anahtar' deerleri de bu ekildedir. Bu grup tasarmda her
m

bir "anahtar:deer" ifti kendisine en yakn kimlik numarasna sahip bilgisayarda (peer'da) tutulur. 'yakn'dan ne anlalmas gerektii tasarmdan tasarma
deiebilir. Orijinal Chord tasarmnda her anahtar kendisine eit veya sonra gelen ilk ve en yakn kimlik numarasna sahip bileende/peer'da, yani ardlnda tutulur.
Yaknlk hesaplanrken tm say deerleri modulo 2 olarak hesaplanr. Dolaysyla saylarn embersel olarak biribirini takip ettiini dnebilirsiniz.
m

ekilde verilen rnekte m = 3 olan basit bir sistem var. Sistemde sadece 0, 1, ve 3 numaral bileenler bulunuyor. ekilde grld gibi 1 anahtar deeri yine 1
numaral bileende tutuluyor. 2 anahtar deeri ise 3 numaral bileende. 6 anahtar deeri ise emberi dnp 0 numaral bileenin payna dyor.

Chord: anahtarlarn bileenlere yerletirilmesi (Kaynak: http://www.dcs.ed.ac.uk/teaching/cs3/ipcs/chord-desc.html)

Bu sistemde bir bileen verilen bir anahtar sistemde bulmak iin anahtara en yakn ve hemen ondan sonra gelen ardl bulmak zorundadr. Ama kalabalk ve dinamik
olarak deien bir ada bileenler dier her bileenin kimlik numarasn tutamazlar (yoksa Gnutella'dakine benzer bir soruna saplanrd). Chord'daki tasarm
yaklam her bileenin m uzunluunda, dier bileenlerin IP'lerini ieren bir liste tutmasdr. Bu listenin i srasnda tutulan bileen bileenimizden en az 2
i1

uzaklkta olan en yakn dier bileendir. Dolaysyla rnein m = 3 deerine sahip rnek ada her bileen kimlik numaras kendisinden en az 2 11
= 1, 2
21
= 2,

ve 231
= 4 uzakta olan dier 3 bileeni belirten birer tablo tutacaktr. Bu tablo sayesinde bileenler kendi sa taraflarnda kalan blgenin kendilerine yakn

yerlerinde daha sk, uzak yerlerinde daha seyrek olmak zere tm emberi kapsayan baz bileenlere dair bilgiye sahiptirler. Bir anahtar aramalar gerektiinde
bildikleri bu bileenler ierisinde anahtardan hemen nce gelen bir tanesini seerler ve ona sorarlar. O da ayn eyi yaparak, vb., anahtarn tutulduu yer tespit edilir.
rnek bir arama ilemi ekilde gsterilmitir.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 64/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

Chord: anahtarn bulunmas (Kaynak: Wikipedia)

Bu tasarm sayesinde N bileenin olduu ve K anahtar:deer iftinin tutulduu bir sistemde arama ilemi logN zaman/adm almaktadr. Ayrca hem anahtar hem de
kimlik numaras deerlerinin rasgele olduu varsaymyla her bileen/peer bana ortalama K /N anahtar dmektedir. Arama ileminin logN adm srmesi esasen
her admn aranlarn bileene kadar olan yolun yarsn katetmesinden kaynaklanmaktadr. Detayl bir ispat ilgili yaznda bulunabilir (Stoica et al. 2001).

13.4 Kademlia
Gnmzde ok yaygn kullanlan ve olduka kalabalk olan Kademlia a da bir datk hash tablosudur. Chord sisteminden esinlenen bu tasarmda "yaknlk"
hesaplamas peek kimlik numaras ile anahtarlarn XOR ileminden geirilmesiyle hesaplanr. Ancak bu tasarm daha verimli klan baka unsurlar vardr:

Kademlia'daki bileenler Chord'daki gibi m uzunlukta bir liste tutarlar. Ancak bu listenin i srasnda 2 i1
uzaklkta bulunan peer'lardan sadece bir tanesi deil
birka tanesi tutulur, ve srekli gncellenir. Bylece arama ilemi paralelleerek hzlanmaktadr.
Kademlia katlmclar en son ve en sk istenen anahtar:deer iftlerini hafzalar yettiince cache/nbellek'te tutarlar. Bylece ada popler olan deerler ok
uzaklar aramadan, yakn peer'lardan daha hzl ulalabilmektedir.

13.5 Bittorrent
Bittorrent ann tasarm gnmzde ulat haliyle Kademlia'y esas almaktadr. Bu aa konulmak istenen -genellikle byk- bir dosya nce kk (0.5 MB kadar)
paralara blnr. Bu paralarn ve onlarn hash'lerinin listesini ieren bir dosya hazrlanr, ki buna torrent dosyas ad verilmektedir. Bu dosyay Bittorrent ann
dnda yntemlerlerle (rn. web sitelerinden) edinen biri daha sonra P2P aa katlarak Kademlia'daki esaslarla herbir dosya parasn arar ve edinir. Bylece byk
bir dosya paralarndan derlenerek oluturulur.

13.6 Sensr alar ve ad-hoc alar


Merkezsiz oluuyla P2P alara benzeyen baka bir uygulama tr de kk cihazlarn iletiimine ynelik kullanlan sensr alardr. Bu tr alar rnein bir arazinin
fiziki koullarn izlemek iin araziye "salan" kk cihazlar veya robotlar arasna kurulur. Bu cihazlar genellikle ucuz, bozulabilen cihazlardr, ve salmlar da
net bir plana gre olmayabilir. Dolaysyla says, yeri belirsiz, gvenilmez bileenler szkonusudur.

Bu tr cihaz "sr"lerinin birok sebepten dolay biribiriyle haberlemesi istenir. Karnca kolonilerine benzer bir ekilde, basit bileenlerin haberlemesinden ortaya
kan sr davrannn daha karmak problemleri zmesi amalanmaktadr. Byle bir durumda bileenler arasnda oluacak a P2P'ye benzer ekilde plansz ve
merkezsiz bir a olacaktr. Bileenlerin iletiim hz ve kapasitesi de snrl olduundan bu tr alarn yap ve ileyi verimlilii nemli bir aratrma konusu haline
gelmitir. Daha da nemlisi sr zekasnn programlanmas son derece yeni bir aratrma konusudur. Bu problemde basit programlar altrabilen yava ve dk
kapasiteli bileenler iin yazlan algoritmala bileenler arasndaki etkileimi yle tasarlamaldr ki kollektifin davran istenilen amacak hizmet etsin.

13.7 rnek uygulamalar


Python ile yazlm bir rnek P2P program aadadr. Bu rnekte P2P sisteme katlacak her bileen yerel ada broadcast/yayn paketleri gndermek yoluyla dier
bileenleri bulmaya alyor. Dolaysyla P2P sisteme katlma problemi sadece yerel ada zlyor. Bu anlamda bir ad-hoc a oluturulmaktadr. Bir bireye
ulald anda o bireyden kendi ilikilerinin listesi istenerek sistemin kalan bireyleriyle de iliki kurulmaktadr.
"""
An example Python program for a peer-to-peer network

Peers find each other using UDP broadcast, and then communicate using XMLRPC
To test, run on loacalhost as, for example:
python p2p.py 8000 7999 8001
python p2p.py 9000 7998 8002
"""
#import network socket, thread, and XMLRPC libraries
import sys, socket, threading, SimpleXMLRPCServer, xmlrpclib, time

#global variables
findports=[8001,8002] #UDP ports to check with broadcast
bindports=[8001,8002] #Default UDP ports to listen with broadcast
askport=7999 #UDP port to bind asking socket
talkport=8000 #xmlrpcport
url="http://%s:%d"%(socket.gethostname(),talkport) #my xmlrpc address
knownpeers=[]

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 65/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar

def replier(portno):
"""
Function which listens to and replies broadcast requests on a given port
"""
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind( ("", portno) )
while 1:
received,addr = sock.recvfrom(1500)
print "Got request from", addr,received
sock.sendto(url, addr )

def finderASK(sock):
"""
Function which sends packets to find other peers in the local network
"""
while 1:
for portno in findports:
sock.sendto("Hello there", ("255.255.255.255",portno))
time.sleep(10) #sleep 10 seconds before repeating

def addPeer(peer):
"""
Add a new peer to my network
"""
if peer==url:#it is me!
print "Ignoring reply from myself"
return
if not peer in knownpeers:
print "NEW PEER:",peer
knownpeers.append(peer)
#Talk to peer in XMLRPC
s = xmlrpclib.Server(peer) #create xmlrpc connection
print "KNOWN PEERS OF THE PEER"
for p in s.sharePeers():
print p
if p==url:#it is me!
pass
else:
addPeer(p)

def finderLISTEN(sock):
"""
Function which listens to UDP replies
"""
while 1:
received,addr=sock.recvfrom(1500)
addPeer(received)

def sharePeers():
"""
Share xmlrpc peers with others
"""
return knownpeers

#MAIN PROGRAM
#If user gives command line options, change xmlrpc port and broadcast port
print "Usage:\n %s talkport askport binport [bindport [bindport [...]]]"%sys.argv[0]
if len(sys.argv)>1:
talkport=int(sys.argv[1])
url="http://%s:%d"%(socket.gethostname(),talkport)
askport=int(sys.argv[2])
bindports=[]
for p in sys.argv[3:]:
bindports.append(int(p))
#run udp listener threads
for portno in bindports:
t=threading.Thread(target=replier,args=[portno]) #the thread runs the finder function with the given arguments
t.setDaemon(1)
t.start()
#Run the finder threads
fsock=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
fsock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
fsock.bind( ("",askport)) #bind any available port
t=threading.Thread(target=finderASK,args=[fsock])
t.setDaemon(1)
t.start()
t=threading.Thread(target=finderLISTEN,args=[fsock])
t.setDaemon(1)
t.start()

#run the xmlrpc server


server = SimpleXMLRPCServer.SimpleXMLRPCServer(("", talkport))
server.register_function(sharePeers)
server.serve_forever()

Kademlia protokoli ile programlama yapmak iin Python Entangled kitapln kullanabilirsiniz: http://entangled.sourceforge.net/

Cormen, Thomas H. 2010. Introduction to algorithms. PHI Learning. http://www.worldcat.org/isbn/9788120340077.

Dierks, T., and E. Rescorla. 2008. RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2. http://tools.ietf.org/html/rfc5246.

Diffie, W., and M. E. Hellman. 1976. New directions in cryptography. Information Theory, IEEE Transactions on 22 (6): 644654.
doi:10.1109/TIT.1976.1055638.

Licklider, J., and R. Taylor. 1968. The computer as Communication Device. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.4812.

Postel, Jon, ed. 1981. RFC 791 Internet Protocol - DARPA Inernet Programm, Protocol Specification. Internet Engineering Task Force.
http://tools.ietf.org/html/rfc791.

Rivest, R. L., A. Shamir, and L. Adleman. 1978. A method for obtaining digital signatures and public-key cryptosystems. Commun. ACM 21 (2) (feb): 120126.
doi:10.1145/359340.359342. http://doi.acm.org/10.1145/359340.359342.
http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 66/67
16.12.2017 Bilgisayar Alar ve A Programlar - Ders Notlar
Stoica, Ion, Robert Morris, David Karger, Frans M. Kaashoek, and Hari Balakrishnan. 2001. Chord: A scalable peer-to-peer lookup service for internet
applications. In Proceedings of the 2001 conference on applications, technologies, architectures, and protocols for computer communications, 149160. ACM
Press. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.28.6352.

http://mgencer.com/les/BilgisayarAglari-DersNotlari.html 67/67

You might also like