python İle ağ programlama

40
Python İle Ağ Programlama Oguzhan Coskun

Upload: oguzhan-coskun

Post on 23-Jun-2015

1.275 views

Category:

Software


4 download

DESCRIPTION

Python ile Ağ Programlama, temel seviye ağ programlama ve soket kavramları içerir. Loglama, tsl bilgileri içerir.

TRANSCRIPT

Page 1: Python İle Ağ Programlama

Python İle Ağ Programlama

Oguzhan Coskun

Page 2: Python İle Ağ Programlama

İçerik HakkındaBu belge Python programlama dili ile ağ programlama bilgileri içerir. Teorik bilgiler az, uygulama örnekleri daha

çok verilmiştir.

Başlamadan önce Python ile çalışırken işimizi kolaylaştıracak bir kaç aracın kurulumundan ve

yararlarından bahsedeceğiz.

Page 3: Python İle Ağ Programlama

Gereksinimler>>> //Bu işareti gördüğünüzde Python yorumlayıcısında çalıştığımızı unutmayalım.root@soulmac://Bu da benim makinem. Bash komutlarını verdiğim zaman burada vereceğim.

Python2.7Python Package IndexVirtualenvPip

Page 4: Python İle Ağ Programlama

Python2.7

Üzerinde çalışacağımız sürüm Python2.7. Geçmişten günümüze Python üzerinde çalışan paketlerin

uyumluluğu ve tarafımdan kod sürekliliği için Python2.7 tercih edilmiştir.

Page 5: Python İle Ağ Programlama

Python Package Index

Python Package Index yani PyPi, Python üzerinde çalışan tüm paketlerin bulunduğu uzak sunucudur. Ağ

programlamada bu depoyu çokça kez kullanacağız.http://pypi.python.org

Page 6: Python İle Ağ Programlama

Virtualenv

Virtualenv: virtual environment (sanal ortam), sanal bir python alanı oluşturup kullandığımız modüllerin,

paketlerin sadece bu sanal ortamda kalmasını, böylelikle kullandığımız alternatif modüllerin asıl sistemimizdeki

python yorumlayıcısını etkilememesini sağlıyor.

Page 7: Python İle Ağ Programlama

Pip

Pip, Linux dağıtımlarında çalışan Python Package Index e erişmenin kolay yolu olarak tanımlayabiliriz. Pip

kurulumunu yaparak sunucudan modülleri direk çekebilir ve kullanabiliriz.

Page 8: Python İle Ağ Programlama

Kurulumlar

Az önce bahsettiğimiz 4 aracın Debian Wheezy dağıtımında kurulumlarından ve kullanımlarından

bahsedeceğiz.

Page 9: Python İle Ağ Programlama

Python2.7root@soulmac:/home/oguzhan# apt-get install python2.7root@soulmac:/home/oguzhan# python2.7Python 2.7.3 (default, Mar 13 2014, 11:03:55)[GCC 4.7.2] on linux2Type "help", "copyright", "credits" or "license" for more information.

>>>

Page 10: Python İle Ağ Programlama

Piproot@soulmac:/home/oguzhan# apt-get install python-piproot@soulmac:/home/oguzhan# pip install django

Page 11: Python İle Ağ Programlama

Virtualenvroot@soulmac:/home/oguzhan# pip install virtualenvroot@soulmac:/home/oguzhan# virtualenv /opt/sanalortamroot@soulmac:/home/oguzhan# source /opt/sanalortam/bin/activate

(sanalortam)root@soulmac:/home/oguzhan#

Page 12: Python İle Ağ Programlama

Ağ Programlamaya Giriş

Ağ programlamaya girişte öğrenmemiz gereken temel terimler ve yöntemler var. Ağ konusu çok geniş olduğu için temel bilgilere çok fazla giremeyiz. Bu yüzden Ağ

programlamaya başlamaya karar veren birinin en azından temel ağ ve python bilgisi olması teknik

anlamda öğrenmeye hız kazandıracaktır.

Page 13: Python İle Ağ Programlama

Portlardan başlayacak olursak, fiziksel terim olarak iki donanımın birbiriyle bağlandığı / iletişime geçtiği

noktadır, bizim ilgileneceğimiz kısımda hemen hemen aynı ancak ortada fiziksel bir birim yok. Tanımlı olan 65535 port bizi sanal ortamda bir çok uygulamaya

bağlar. Bu uygulamalar, servisler en basiti olarak hemen hemen her gün bağlandığımız internet gibi, girdiğimiz sitelerin bize özel sunduğu, yönlendirdiği farklı araçlar

gibi uygulamalardır.

Portlar

Page 14: Python İle Ağ Programlama

TCP / UDPinterneti ele alacak olursak, Global ağ mimarisinde kullandığımız veri

iletişim standartları bu portlar üzerinden dünya üzerindeki tüm mimarilerin haberleşmesini sağlar, internete çıkabildiğimiz port 80 (HTTP) portudur. Bu port yapısı gereği TCP ve UDP protokollerini

kullanır. Nedir TCP ve UDP? Transmission Control Protocol, kısacası kayıpsız veri iletimini sağlar. UDP ise TCP’nin yaptığı bir kaç güvenlik ve sorgu işlemlerini atlayarak iletişimin hızlı olmasını

sağlar ancak kaybı garanti etmez, yani veri kayba uğrayabilir.

Page 15: Python İle Ağ Programlama

Soket Soket kısaca, diğer programlarla standart Unix dosya tanımlayıcılarını

kullanarak haberleşmemizi sağlayan yapıdır. Bu yapıya ulaşmak için socket( ) işlevini çağırmamız gerekir. Bu işlev bize bir soket

tanımlayıcı döndürür.

3 tip soket tanımlayıcı vardır. Bunlar İnternet soketleri, Unix soketleri ve X.25 soketleridir. Hepsini ayrı ayrı incelemek uzun zaman

alacağından, sadece internet soketlerini göreceğiz.

Page 16: Python İle Ağ Programlama

ornek1.1>>>import socket>>>socket.getservbyname(‘domain’)53

Page 17: Python İle Ağ Programlama

ornek1.1

Basit bir örnekle başladık. 1. satırdan inceleyerek gelecek olursak; Python’da kütüphane tanımlamaları import komutuyla dosyaya

eklenir. Biz de socket sınıfını dosyamıza ekledik. 2. satırda socket sınıfının altında tanımlanmış olan bir fonksiyonu çağırdık. Bu

fonksiyon eğer çıktıya bakacak olursak, adını girdiğimiz portun port numarasını döndürür. Çıktıda da gördüğümüz gibi domain portu 53.

Page 18: Python İle Ağ Programlama

DGRAM / STREAM

Şimdi internet soketlerinin ikiye ayrıldığı yol ayrımına gelelim. Daha önce bahsettiğimiz TCP ve UDP transfer çeşitleri burada karşımıza

çıkıyor. İnternet soketleri de TCP için SOCK_STREAM, UDP için SOCK_DGRAM olarak ayrılıyor. SOCK_STREAM; verileri güvenilir kanaldan taşır. SOCK_DGRAM ise SOCK_STREAM’e göre hızlı fakat güvenliği garanti etmeyen soketlerdir. Bu iki yapının seçimi

yapılacak uygulamaya göre farklılık gösterir.

Page 19: Python İle Ağ Programlama

SOCK_DGRAM ornek12.py

# -*- coding: utf-8 -*-#Localhost üzerinde UDP Server ve Clientimport socket, syss=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)max=65535port=1060if sys.argv[1:] == [‘server’]:s.bind((‘127.0.0.1’,port))

print s.getsockname(), ‘dinleniyor’while True:

data, address=s.recvfrom(max)print ‘İstemci ’, address, ‘ üzerinden yazıyor..’,repr(data)s.sendto(‘Veri boyutu %d byte’%len(data),address)

elif sys.argv[1:]==[‘client’]:s.sendto(‘Bu benim mesajım’,(‘127.0.0.1’, port))data, address = s.recvfrom(max)print ‘Server’, address, ‘üzerinden yazıyor’,repr(data)

else:print >>sys.stderr, ‘kullanimi: ornek12.py server|client’

Page 20: Python İle Ağ Programlama

ornek12.py de ne yaptık?

Açıklama satırında yazanı yaptık. Daha önce bahsettiğimiz SOCK_DGRAM kullandık yani UDP transfer. İki tip tanımladık

bunlar, server ve client. Server ı başlattığımızda 1060 numaralı portu dinliyor ve bu porta bağlanana istemcilerin mesajlarını çıktı veriyor. Dikkat edeceğimiz önemli bir nokta var. Aşağıdaki çıktıya

bakarak bunu anlayalım:

Page 21: Python İle Ağ Programlama

# python ornek12.py+server tarafıroot@soulmac:/home/oguzhan# python ornek12.py server('127.0.0.1', 1060) dinleniyor

+client tarafıroot@soulmac:/home/oguzhan# python ornek12.py clientServer ('127.0.0.1', 1060) üzerinden yazıyor 'Veri boyutu 17 byte'root@soulmac:/home/oguzhan#

+server tarafıroot@soulmac:/home/oguzhan# python ornek12.py server('127.0.0.1', 1060) dinleniyorİstemci ('127.0.0.1', 33495) üzerinden yazıyor.. 'Bu benim mesajım'

Page 22: Python İle Ağ Programlama

ornek12.py

Server tarafında 1060 numaralı portu dinlerken client tarafında uygulamayı çalıştırdığımızda 1060 portuna ‘Bu benim mesajım’

şeklinde bir mesaj gönderiyor, ancak bunu 33495 portu üzerinden gönderiyor. Başlangıçta 1060 portunu kontrol eden client, serverin açık olup olmadığına bakıyor, eğer açıksa 65535 port arasından uygun olan port üzerinden 1060 numaralı porta veriyi gönderiyor.

Page 23: Python İle Ağ Programlama

ornek12.pyÖncelikle bir soket tanımlamalıyız ve bu soketin türünü yani internet, unix ya da x25 soketleri arasından hangisi olduğunu belirtmeliyiz ve

yine TCP mi yoksa UDP mi olduğunu göstermeliyiz. Bu tanımlamaları socket.socket(socket.AF_INET,

socket.SOCK_DGRAM) satırında yaptık. Burada AF_INET internet soketini kullanacağımızı, SOCK_DGRAM ise bu iletişimin UDP protokolü çerçevesinde gideceğini gösteriyor. bind() komutuyla

localhost üzerinde trafiğin hangi porttan akacağını belirtiyoruz ve diğer iletişim kurallarına geçiyoruz. sendto( ) ile verimizi gönderme

işlemini gerçekleştiriyoruz.

Page 24: Python İle Ağ Programlama

SOCK_STREAM

SOCK_STREAM ler veri kayıpsız bir iletişim altyapısı sunan TCP protokolü üzerinde hareket ederler. ornek12.py de konumuz

tamamen UDP yani SOCK_DGRAM dı. Şimdi ise SOCK_STREAM dan bahsedeceğiz. ornek12.py de kullandığımız soket tanımlamanın

aynısını kullanacağız. İşleyiş aynı ancak felsefe farklı.

Page 25: Python İle Ağ Programlama

#python2.7>>>import socket>>>s=socket.socket(socket_AF_INET, socket.SOCK_STREAM)>>>

Page 26: Python İle Ağ Programlama

SOCK_STREAM

Felsefeye gelecek olursak, o da basit, UDP, TCP gibi davranmaz ve bir kaç kontrol noktasını atlayarak iletişimin daha hızlı olmasını ister, ancak bu hız kayıpları da beraberinde getirebilir. TCP ise size hızı garanti edemez, trafik yoğunluğuna göre değişir ancak kayıpsız bir

transferi garanti eder.

Page 27: Python İle Ağ Programlama

SOKET İSİMLERİ

ornek12.py de gördüğümüz ve aslında daha önce görmediğimiz tanımları burada ayrıntılı işleyeceğiz. Her bir tanımın ne işe yaradığını daha iyi anlamak için bu bölüm yeterli olacaktır.

Page 28: Python İle Ağ Programlama

SOKET OLUŞTURMAKsocket(family,type,[protocol])

o family: Bu parametre soketin hangi alan için oluşturulduğunu belirtir. Unix için AF_UNIX, internet için AF_INET tanımlaması yapmak gerekir.

o type: Kullanılacak protokol tipini belirtir. Bu protokoller TCP ya da UDP dir. TCP için SOCK_STREAM, UDP için SOCK_DGRAM tanımlanmıştır. Diğer seçenekler, SOCK_RAW, SOCK_SEQPACKET, SOCK_RDM.

o protocol: Bu parametre varsayılan olarak 0 dır ve bizde böyle bırakıyoruz.

Page 29: Python İle Ağ Programlama

SOKET BAĞLAMAKOluşturulan soketler sunucu ya da istemci taraflı kullanılabilir. Sunucu taraflı bağlanacaksa bir hosta bağlamamız gerekir. bu bağlama olayını connect( ) metodu ile gerçekleştireceğiz. Örnek olarak 192.168.1.17 ve port numarası 9562 olan bir hosta bağlanmak için:

connect((‘192.168.1.17’, 9562))

Page 30: Python İle Ağ Programlama

SOKETİ BİR ADRESE BAĞLAMAKbind( ) metodu işimizi görecektir. bind( ) parametre olarak soketin bağlanacağı adresi ve port numarasını verir, bu sayede gelen isteklerin dinleneceği bir ortam oluşur.

bind((‘192.168.1.17’,9562))

Page 31: Python İle Ağ Programlama

BAĞLANTILARI DİNLEMEK

Soket belirli bir adrese bağlandıktan sonra, belirtilen porttan gelen istekleri dinlemek için görevlendirilir. Bu amaçla listen( ) metodu kullanılır. Parametre olarak kaç bağlantının kabul edileceği belirtilir. En az 1 olmalıdır.

listen(5)

Page 32: Python İle Ağ Programlama

VERİ GÖNDERMEK / ALMAK

Veri recv( ) ve send( ) metodlarıyla aktarılır. recv( ) metodu sunucu ya da istemciden gönderilen veriyi almak için kullanılır. Parametre olarak buffer size (tampon boyu) ve flags(bayraklar) alır.

buffer_size = 1024recv(buffer_size)

Veri göndermek için send( ) metodu çağırılır. Parametre olarak gönderilecek veri ve bayrak alır.

veri=’test verisi’send(veri)

Page 33: Python İle Ağ Programlama

TSL VE SSL

Secure Socket Layer (Güvenli Giriş Katmanı) protokolü, internet üzerinden şifrelenmiş güvenli veri iletişimi sağlar. E-posta

gönderiminde, FTP transferinde ve bir çok alışveriş sitesinde güvenlik amacıyla kullanılıyor.

Page 34: Python İle Ağ Programlama

TSL VE SSL

Şifreleme esası açık anahtarlı şifrelemeye dayanır.

SSL protokolü geliştirildi ve isim değiştirdi. TLS adıyla sunucu-istemci uygulamaların ağ üzerinde, dinlenmelerinin ve asıl verinin üzerinde

oynama yapılmasının önüne geçecek şekilde tasarlandı. Bu protokol uygulama katmanında çalışır.

Page 35: Python İle Ağ Programlama

TSL VE SSL>>>import ssl>>>ssl.cert_time_to_seconds(“May 7 00:00:00 2014 GMT”)>>>1399410000.0

Page 36: Python İle Ağ Programlama

TSL VE SSL

Burada ssl sınıfına ait olan cert_time_to_seconds fonksiyonunu kullandık. Bu fonksiyon string bir tarih verisini alıp Unix Time da karşılığını verir. Şimdi SSL ile tarihi saniye cinsinden yazdırmak

nedir? sorusuna gelirsek, ssl bir imza olarak kullanılır, imzada tarih önemlidir. Unix Time da saniye olarak geri dönen veri imza için

kullanılır.

Page 37: Python İle Ağ Programlama

LOGLAMA

Ağ uygulamalarında log mesajları önemlidir. Bu mesajları üretip, yedeklemek, uygulamalarımızda karşılaşılan sorunları, hangi

durumda olduğumuzu bilmemizi sağlar. Bu işlem için pythonda bilinen syslog ve logging modülleri vardır. Biz logging modülünü

kullanacağız.

Page 38: Python İle Ağ Programlama

ornek13.pyimport logginglogger=logging.getLogger()logger.setLevel(logging.INFO)handler=logging.FileHandler(‘/home/oguzhan/test.log’)logger.addHandler(handler)logger.error(‘hata mesaji’)logger.info(‘bilgi mesaji’)logger.warning(‘uyari mesaji’)

Page 39: Python İle Ağ Programlama

ornek13.pyroot@soulmac:/home/oguzhan# python2.7 ornek13.pyroot@soulmac:/home/oguzhan# cat test.loghata mesajibilgi mesajiuyari mesaji

Uygulamayı çalıştırdığımızda handler da tanımladığımız yola yani test.log dosyasına bu çıktıları yazdığını göreceğiz.

Page 40: Python İle Ağ Programlama

KAYNAKFoundations of Python Network Programming - Brandon Rhodes,

John Goerzen 2010