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.
Gördüğünüz üzere 4 adet protokol mevcut. Bunlar:
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.
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:
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.
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.
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