Soket programlama, ağ üzerinden veri iletimi sağlamanın temel yoludur. Python, asenkron soket programlama ve TLS/SSL ile güvenli veri iletimi konusunda güçlü bir dil olarak öne çıkar. Bu eğitimde, asenkron soket programlamanın derinliklerine inecek ve TLS/SSL desteği ile bağlantı güvenliğini sağlayacağız.
Asenkron İstemci Tarafı:
Asenkron Programlamanın Temelleri
- Neden Asenkron Programlama?
- Verimlilik: Aynı anda birçok işlem yapılabilir, bu da CPU ve I/O kaynaklarının daha etkin kullanımını sağlar.
- Yanıt Süresi: Uygulamanızın yanıt süresini azaltır, kullanıcı etkileşimlerine daha hızlı yanıt verir.
- Python'da Asenkron Programlama:
- asyncio modülü, Python'da asenkron I/O işlemleri için kullanılır. Bu modül, asenkron görevlerin yönetimini ve senkronize edilmesini kolaylaştırır.
Asenkron Sunucu ve İstemci Uygulamaları
Asenkron Sunucu Tarafı:
Python:
import asyncio
import ssl
async def handle_client(reader, writer):
addr = writer.get_extra_info('peername')
print(f"Bağlantı kabul edildi: {addr}")
try:
while True:
data = await reader.read(100)
if not data:
break
message = data.decode()
print(f"Alınan veri: {message}")
writer.write(data)
await writer.drain()
except asyncio.CancelledError:
print("Bağlantı iptal edildi")
finally:
print("Bağlantı kapatıldı")
writer.close()
await writer.wait_closed()
async def start_server():
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.load_cert_chain(certfile='path/to/cert.pem', keyfile='path/to/key.pem')
server = await asyncio.start_server(handle_client, '127.0.0.1', 65432, ssl=ssl_context)
addr = server.sockets[0].getsockname()
print(f"Sunucu {addr} adresinde dinleniyor...")
async with server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(start_server())
Python:
import asyncio
import ssl
async def start_client(message='Merhaba, dünya!'):
ssl_context = ssl.create_default_context()
ssl_context.check_hostname = True
ssl_context.verify_mode = ssl.CERT_REQUIRED
reader, writer = await asyncio.open_connection('127.0.0.1', 65432, ssl=ssl_context)
print(f"Sunucuya bağlanıldı")
try:
writer.write(message.encode())
await writer.drain()
data = await reader.read(100)
print(f"Sunucudan gelen veri: {data.decode()}")
except asyncio.CancelledError:
print("İstemci iptal edildi")
finally:
print("Bağlantı kapatılıyor")
writer.close()
await writer.wait_closed()
if __name__ == "__main__":
asyncio.run(start_client())
Açıklamalar
- SSL Context Oluşturma:
- ssl.create_default_context(ssl.Purpose.CLIENT_AUTH): İstemci sertifikası doğrulaması için kullanılan SSL bağlamı oluşturur.
- ssl_context.load_cert_chain(): Sunucunun sertifikalarını yükler.
- Hostname ve Sertifika Doğrulama:
- ssl_context.check_hostname = True: İstemcinin sunucunun hostname'ini doğrulamasını sağlar.
- ssl_context.verify_mode = ssl.CERT_REQUIRED: Sertifika doğrulaması yapar.
- Asenkron Programlamada Hata Yönetimi:
- try ve finally blokları, bağlantı kapanırken kaynakları düzgün bir şekilde temizler.
- asyncio.CancelledError, görev iptallerini yönetir.
Performans Sorunları ve Çözümleri
- Bağlantı Yönetimi:
- Sınırlı Kaynaklar: Yüksek bağlantı sayısı durumunda sınırlı sistem kaynakları problemi yaşanabilir. Bu durumda, bağlantıları etkili bir şekilde yönetmek için asyncio’nun sınırlarını anlamak önemlidir.
- Veri İletim Hızı:
- Paketleme: Büyük veri paketleri kullanmak, ağ üzerinden veri iletimini optimize edebilir.
- Çoklu İşlem/İş Parçacığı: Çoklu iş parçacıkları veya işlemler kullanarak performansı artırabilirsiniz.
Performans Testleri
- Yük Testleri:
- Araçlar: Apache JMeter, Locust gibi araçlarla sunucunuzun yüksek yük altında performansını test edebilirsiniz.
- Senaryolar: Gerçek dünya kullanım senaryolarını test ederek sisteminizin sınırlarını belirleyin.
- Profiling:
- Araçlar: cProfile veya line_profiler gibi araçlarla kodunuzun performansını analiz edin.
- Optimizasyon: Performans darboğazlarını tespit edip iyileştirme yapın.
Güvenlik Konuları
- Şifreleme:
- TLS/SSL: Verilerin şifrelenmesini ve güvenli bir şekilde iletilmesini sağlar. TLS/SSL, ağ üzerindeki verilerin güvenliğini sağlar.
- Kimlik Doğrulama:
- Sertifika Kullanımı: Sunucu ve istemci arasındaki kimlik doğrulamasını yönetir. Sertifikalar, tarafların kimliğini doğrulamak için kullanılır.
TLS/SSL İle Güvenli İletim
- TLS/SSL Uygulama:
- Sunucu ve istemci tarafında TLS/SSL desteğini etkinleştirmek için yukarıda gösterilen kodları kullanarak güvenli veri iletimi sağlayabilirsiniz.
- Sertifika Yönetimi:
- Sertifika Otoriteleri: Sertifikalar genellikle bir sertifika otoritesi tarafından sağlanır ve imzalanır.
- Kendi Sertifikalarınızı Oluşturma: Geliştirme ve test için kendi kendine imzalanmış sertifikalar oluşturabilirsiniz.