Makale Özeti

Bu makalemizde Sql Server Configuration Manager içerisinde yer alan Sql Server Network Configuration sekmesini inceleyip, NetLibrary ve Protocol kavramlarına değineceğiz.

Makale

Merhaba arkadaşlar. Bir başka makale ile daha birlikteyiz. Öncelikle bu makaleyi hazırlarken danıştığım konularda yardımlarını esirgemeyen Rob Vieira'ya teşekkürü bir borç bilirim.

Bu makalemizde Sql Server Configuration Manager içerisinde yer alan Sql Server Network Configuration sekmesini inceleyeceğiz. Genelde bir bağlantı sorunu olduğunda akla 2 şey gelmektedir: client'ın ağ yapılandırması veya client'ın ve server'ın ağ yapılandırmalarının uyumsuzluğu.

İsterseniz daha yakından inceleyelim bu konuyu. Sql Server'ın kullandığı bir yapıya bakalım: NetLibraries (ya da kısaca NetLibs). Peki nedir bu NetLibs..? NetLibs, Sql Server için uygun network protokolünü implemente eden DLL'lerdir. Birazdan inceleyeceğimiz protokoller için NetLibs'ler mevcuttur. NetLibs dediğimiz kavram, Sql Server ile sisteminizdeki diğer nesneler arasında soyut bir katmandır aslında. Burada NetLibs'e bir virgül koyup protokollere geçeceğim arkadaşlar. Tekrar bu noktaya geri geleceğiz.

Protokoller:

Protokol dediğimiz şey, iletişimin kurallarını belirleyen yapılardır. 2 farklı bilgisayar aynı ya da uyumlu protokol kullanarak iletişim kurabilirler. Örnek vermek gerekirse, bir Japon ile yazıştığınızı düşünün. Eğer o Türkçe bilmiyorsa, siz de Japonca bilmiyorsanız anlaşamazsınız değil mi. Eğer ortak bilinen bir dil varsa, örneğin İngilizce, bu şekilde iletişim kurabilirsiniz. İngilizce de protokol olmuş oluyor bir nevi.
Sql Database Engine'e bağlanmak için en azından bir protokolü aktif tutmanız gerekmektedir.





Gördüğünüz üzere 4 adet protokol mevcut. Bunlar:

    1.Shared Memory
    2.Named Pipes
    3.TCP/IP
    4.VIA

Sadece Shared Memory varsayılan olarak aktiftir. Daha önceki versiyonlarda varsayılan olarak TCP/IP de aktifti. Ancak bu güvenlik açığı yaratmakta olduğundan bundan vazgeçildi. Akla gelebilecek yegane soru da:"Neden hepsini aktifleştirmiyoruz" olacaktır. İlk nedenini az önce söyledik. Bir diğer nedeni de, bunun iletişimde yavaşlama yaratmasıdır.


Şimdi bunları yakından inceleyelim.

Named Pipes:

TCP/IP olmadığında ya da TCP/IP altındaki server'ları isimlendirmeye izin veren DNS olmadığı durumlarda kullanışlı olabilir (ancak isim yerine IP ile bağlandığınızda böle bir sorun da kalmaz). Named Pipes kullanımı azalmaktadır. Local ağlarda kullanılır daha çok. Bir process'in çıktısı ikinci bir process'in girdisi şeklindedir iletişim. İkinci process local(aynı makine) de olabilir, uzakta da olabilir(remote).

TCP/IP:

En çok kullanılan protokoldür. Sql Server'a uzaktan bağlanırken kullanabilirsiniz. Çünkü IP kullanan tek protokoldür. Ağ trafiği yönlendiren ve gelişmiş güvenlik özelliklerinin bir standartını bulundurur.

Shared Memory:

En basit ve ayar gerektirmeyen protokoldür çünkü client ile Server aynı makinededir. Varsayılan olarak aktiftir. Client, server'ın veriyi sakladığı bellek dosyasına direkt erişir (çünkü aynı makinede). Dolayısıyla bu yöntem oldukça hızlıdır. Daha ziyade diğer protokollerde problem yaşadığında kullanılır. Microsoft bu konuda bir de uyarı yapıyor: Microsoft Data Access Components (MDAC) 2.8 ve öncesini kullananların bu protokolü kullanamayacağını, kullanmaya kalkışsa bile Named Pİpes protokolüne yönlendirilecekleri belirtiliyor.

VIA:

Virtual Interface Adapter. Özel uygulamaları değişkenlik gösterir. İki sistem arasındaki bağlantıya özel bir ağ ara yüzüdür ancak çok yüksek performans gösterir. Bunun sebebi de, özel olarak o bağlantı için tasarlamış donanımdır. Yüksek seviyede mesaj trafiğini desteklemesi için, aynı data center'daki server'lar arasında kullanılabilmektedir.

Protokoller bu şekilde arkadaşlar. Şimdi ara verdiğimiz konuya geri gidelim: NetLibs. Client ve Server taraflı olmak üzere 2 bölümden oluşur diyebiliriz.
Client Net-Library, IPC(interprocess communication) bileşenleri ile iletişim için gerekli tüm detaylardan OLEDB Provider, ODBC Provider ve DB-Library'yi korur.
Server Net-Library ise, Client NetLibrary'nin server taraflısıdır, aynı işlemleri server için(databaase engine) yapar.
Sql Server'daki NetLibs'ler:

    1.Shared Memory
    2.Named Pipes
    3.TCP/IP
    4.VIA

Gördüğünüz gibi bu protokollerin aynı zamanda NetLibs'leri var. NetLibs, client uygulaması ile ağ protokolü arasında bir yalıtkan gibidir. Pek tabidir ki server tarafında da aynı mekanizma mevcuttur. Ancak hemen belirteyim, sadece yukarıdakilerle sınırlı değil NetLibs'ler. IPX/SPX(MS'in NWLink'i), AppleTalk(Macintosh sistemlerle iletişim için) ve Banyan Vines(Banyan Vines ortamlar için) gibi NetLibrary'lerden de bahsetmek mümkündür.

Hem client hem de server'da birbirleriyle uyumlu NetLibsler seçilmelidir. Eğer uyumsuz olursa Specified Sql Server Not Found hatasını alırsınız.

NetLibs kavramının iyice oturması için şöyle anlatayım: Eğer network TCP/IP protokolünü kullanıyorsa, Sql Server da TCP/IP NetLib'ini kullanır ki TCP/IP ile nasıl konuşacağını, iletişim kuracağını bilebilsin.

Kullanılan sürücü türünden (Sql Native Client, ODBC, OLEDB) bağımsız olarak, her zaman NetLib ile konuşan bir sürücü olacaktır. İstemci uygulaması sürücü ile konuşur. Sürücü de istemci tarafındaki NetLib'i çağırır. NetLib de uygun ağ protokolü ile(hangisi kullanılıyorsa), veriyi server tarafındaki NetLib'e iletir. Server tarafındaki NetLib de istekleri server'a aktarır. Server da buna cevap verir. Bu cevap da aynı yoldan geri döner. Hızlıca bu şekilde anlattık. :) İsterseniz biraz daha yakından bakarak, bu aşamaları yeniden gözden geçirelim.

Öncelikle Client(istemci) uygulaması OLEDB, ODBC, DB-Library veya Embedded SQL API'sini çağırır. Bu API'ler erişim ve iletişimde(Sql Server'a) rol oynar(API'lerin detaylarına bu makalede girmeyeceğim). Bu API'lerin yardımıyla Client NetLibrary'si çağırılır. Client NetLibrary de, IPC API'yi çağırır. IPC API'sinin ne yaptığını aslında isminden de tahmin edebilirsiniz. Processler(işlemler) arası iletişim olacağından, IPC API'si de, Server NetLibrary'si ile temas kurar. Client NetLibrary'den aldığı istekleri, Server NetLibrary'ye geçirir. Eğer Server ve Client aynı makinedeyse(local bir IPC), istekler shared memory veya local named pipe ile geçirilebilir. Aynı makinede değillerse, istemci tarafındaki protokol stack'i, sunucu tarafındaki protokol stack'i ile haberleşir. Server NetLibrary de istemciden gelen istekleri SQL Server'a iletir. Anlattığım yoldan da cevap, istemciye döndürülür.

Anlattığımız iletişim adımlarını resimlerle gösterelim. Server ile client aynı makinedeyse

Server ile client farklı makinedeyse

Evet arkadaşlar, herhalde Net Library hakkında bir fikriniz vardır artık. Şimdi de Sql Server'ın sınıflandırmasına bakalım. Sql Server, Net Library'leri primary ve secondary diye ikiye ayırmakta. Sık kullanılan OLEDB Provider, ODBC Driver, DB-Library DLL ve database engine direkt olarak 2 primary NetLibrary ile iletişim kurarlar.

  • Varsayılan olarak, local bağlantılarda(aynı makinede istemci ve sunucu) shared memory NetLibrary'si kullanılabilir.
  • Local olmayan bağlantılarda, iletişim için SuperSocket Net-Library kullanılır. SuperSocket NetLibs'in de 2 farklı seçeneği vardır, iletişim kurabilmesi için.
    1. TCP/IP'yi seçtiyseniz şayet(veya NWLİnk IPX/SPX), SuperSocket NetLibrary server ve client arasındaki iletişim için, Windows Socket 2 API'sini çağırır.
    2. Named Pipe, VIA vs. seçtiyseniz şayet, SuperSocket NetLib'inin alt bileşeni olan "Net-Library Router", ilgili protokol için secondary NetLibrary'yi yükler ve tüm NetLibrary isteklerini ona yönlendirir.

Not: Server taraflı Super Socket Net Library, Ssnetlib.dll adıyla; Client taraflı Super Socket Net Library ise,"Dbnetlib.dll" adıyla implemente edilirler.
Aşağıdaki şekilde de NetLib'lerin çalıştıkları API ve protokoller toplu halde gösterilmiştir.

Yukarıdaki şekilde dikkat ettiyseniz, "encryption layer" var. Biz de Net-Library şifrelemesine değinelim o zaman. Sql Server ile uyugulama arasındaki verilerin güvenli iletimi için SSL(Secure Sockets Layer) kullanılır. SSL şifrelemesi, Super Socket NetLib ile çalışır. SSL şifreleme aktifse; Super Socket NetLib'i, TCP/IP veya IPX/SPx için Windows Socket 2 API'sini çağırmadan önce; Named Pipe, AppleTalk için NetLibrary Router'ını çağırmadan önce SSL mekanizmasını çalıştırır.
SSL şifrelemesi(SSL ana konumuz değil) de SSL API'si ile gerçeklenir. Güvenlik derecesi de, uygulama ve server'ın bulunduğu bilgisayardaki işletim sistemlerine göre değişkenlik gösterir.(40-128 bit)
SSl şifreleme güvenliği arttırıyor ancak malumunuz, çoğu güvenlik önlemi performansdan da biraz götürür. İsterseniz SSL'in neden performansı düşürdüğünü inceleyelim.

  • Bağlantı zamanında fazladan network round trip yapmak durumundasınız(Doğrulama mekanizmasından ötürü). Kısaca round trip'ten bahsedeyim. Round Trip, bir sinyalin ya da paketin belirli bir noktadan(kaynaktan), belirli bir hedefe gitmesi ve geri dönmesidir.
  • Uygulamanızdan Server'a giden paketler, Client Net Library'si tarafından şifrelenir, Server Net Library'si tarafından da deşifrelenir.
  • Aynı şekilde, server'dan uygulamaya giden paketler de, Server Net Lİbrary'si tarafından şifrelenir, Client Net Library'si tarafından deşifrelenir.

Güvenlik konusunda söylenebilecek son husus, Shared Memory NetLibrary. Hatırlarsanız, yazının başlarında local'de çalışınca bu NetLib'in avantajlarından ve gücünden bahsettik. Bu NetLib, makineler arası iletişimde bulunmadığından, herhangi bir şifrelemeye ihtiyacı yoktur. Zaten güvenlidir. Bellekte alan, application process ve database engine process diye bölünür ve herhangi bir race condition yaşanmadan(deadlock'a mahal vermeden), diğer windows process'leri tarafından erişilemez olurlar.
Benzer durum Multiprotocol NetLibrary'de de var. Özellikle eski SQL Server sürümleriyle uyumluluk açısından, bu NetLib'in kendi şifrelem sistemi hala desteklenir. SSL şifrelemesinden bağımsızdır. Windows RPC şifreleme API'si çağırılarak şifreleme yapılır. Herhangi bir sertifika gerekmez. (Beyniniz API'lerle doldu farkındayım ama, konu çok temel arkadaşlar. Genel resmi gördüyseniz API'lere takılmayın fazla. İleride API'lerle ilgili yazı yazmayı da düşünüyorum. :) )

NetLiblerle ilgili son bir konu daha var arkadaşlar. Sql Server'ı başlattığınızda karşınıza bir ekran çıkıyor bildiğiniz gibi. Orada Server Name alanı var. Eğer orada localhost anlamına gelen bir değer girerseniz(. ya da 127.0.0.1 gibi), Sql Server, client ile aynı bilgisayarda olduğundan, bağlantı için seçilen NetLibs ne olursa olsun, Shared Memory NetLibs kullanılacaktır. Eğer bu alana gerçek server adını girerseniz, server ile iletişiminiz aynı makina üzerinde olduğuna bakılmaksızın TCP/IP NetLibs'ini kullanacaktır.

Bir makalemizin daha sonuna geldik. Tekrar görüşene dek hoşça kalın..

Gürkan Alkan
İstanbul Üniversitesi Bilgisayar Mühendisliği

Kaynaklar: Robert Vieira - Professional SQL Server 2005 Programming
MSDN