(bkz: protokol yığıtı)
Soketlere fiziksel bir örnek vermek gerekirse tıpkı dişi prizlere benzerler. Soketler arasındaki bağlantı kanalını da iki ucu erkek bir kabloya benzetebiliriz. Yine bir tür yerel ağ olan süreçler arası iletişim * * işleyişinde de "port" ve "socket" sözcükleri karşımıza çıkarlar. Bu durumdaysa port bir bağlantı noktasının dış tarafını temsil ederken socket yine bağlantının içteki ucunu temsil eder ancak bu örnekte, bir önceki örnekte bahsettiğimiz ağ iletişiminde olduğu gibi birebir eşleşme veya arada bir kanal (örnekteki adıyla kablo) olması gerekmediği için yerel ve yerel olmayan soketleri aynı örnek ile açıklamak da biraz zor.
Kullanım
Bir soket, sistemde tanımlanınca bir tanıtıcısı da olur. Bu tanıtıcı bazen soyut bir referans olurken genellikle integer gibi o sistemin içinden, fiziksel bir tanıtıcıdır. Bu tanıtıcı çalışmakta olan bir sürece * (mesela bir bilgisayarda çalışmakta olan bir programa) refere etmektedir. Soket programlaması yapacak bir sürecin ilk işi, protokol yığıtına * başvurup bir soket oluşturmasını istemektir. Böylece yığıt bir soketin referansını döndürür. Olur da süreç ileride bu soketten bilgi almak veya bilgi yazmak isterse yine yığıta başvurup bu defa sadece soketin tanıtıcı referansını vermesi yeterli olur.
Soketler yereldir (bir ağdaki düğüme özeldir). Bunlar yerel bir kaynak oldukları için de ağdaki başka düğümlere refere edemez, onlarla direkt bağlantı halinde olamazlar ama portlar bunu yapabilir. Bundan da ötesi, soketler iki düğüm arasındaki iletişim kanalının kalıcı ve sürekli açık kalmasına da ihtiyaç duymadıkları gibi bir eşe de ihtiyaçları yoktur, yani tek başına da bulunabilirler. Örneğin datagram socketlerle bağlantısız iletişim * , multicast socketlerle birden fazla ağ noktasına veri gönderimi ve sadece belli bir adres aralığına veri göndermek/göndermemek gibi şeyler soketlerle yapılabilir. Sonuçta uygulamaya dönecek olursak internet üzerindeki iletişim için genellikle bağlantı kurulabilir adresler ve bunların arasında bir bağlantı kurulması gerekir diyebiliriz.
Soket Adresleri
Uygulamada bir soket, Internet Protocol * ağına Transmission Control Protocol * protokolü üzerinden bağlıdır ve başka bir sokete refere etmektedir (ki böyle soketlere internet soketleri denir). TCP birebir bağlantılar * konusunda uzmanlaşmış bir protokoldür. Bu bağlamda, soketlerin belirli bir soket adresi, yani yerel düğüm için IP adresi ve bir bağlantı noktası numarası * ile ilişkili olduğu varsayılır ve kendisinin de ilişkili olduğu yabancı düğümde * oradaki işlem tarafından kullanılabilmesi için karşılık gelen bir soket adresi bulunur. Bir soketi bir soket adresiyle ilişkilendirmeye bağlama * denir.
Unutulmamalı ki yerel bir soket yabancı bir başka soket adresine veri göndermek veya almak isterse, yabancı soketin direkt kendisine veya tanıtıcısına * erişmesi gerekmez, bunlar o soketin yerel öz kaynakları olduğu için dışarıdan direkt erişime kapalı olacaklardır. Örneğin 4.8.15.16:2342 şeklinde bir yerel IP adres ve portu üzerinde dinleme yapan bir soket düşünelim. Karşısında da 90.60.90.123:8888 yabancı IP ve port üzerinde bulunan bir soketle bağlantı halindeler. Bu bağlantının iç taraflarını soketler temsil eder demiştik. Bu soketleri de protocol stack üretiyor ve her birine tanımlama numarası vererek takibini kolaylaştırıyordu. İşte bu takip numaraları da sırasıyla 543 ve 611 olsun. Yerel IP üzerindeki herhangi bir process (çalışmakta olan bir program) yabancı soketle iletişim kurmak isteyince kendi protocol stack arayüzü bu iletişimin yürütüleceği bir soket oluşturup 543 numarasıyla referansını döndürecektir. Bu soket bir defa oluşunca bundan sonra hedefe mesaj göndermek istenirse bu tanımlama numarası kullanılır. Böylece yereldeki process'lerin uzaktaki bir hedefe mesaj göndermek için yapması gereken sadece kendi elinin altındaki bir öz kaynağa basitçe yazmaktan ibarettir. Protocol stack bu işlem sonucunda veriyi 90.60.90.123 IP adresi ve 8888 port numarasına yönlendirecek ve buaradaki protocol stack bu mesajı 611 numarasıyla ilişkili olan sokete ve dolayısıyla onu kullanan processlere bu mesajı devredecektir. Son tahlilde 4.8.15.16:2342 konumundaki process'ler (çalışan yazılımlar, programlar) yabancı kaynaktaki takip numarası olan 611 bilgisini bilmeleri gerekmez. Bunlar yerel ağ için anlamı olmayan sayılardan ibarettir. Yani anlatılmak istenen soketler birbirine direkt bağlı değillerdir.
Uygulama
Protocol stack denen olgu, günümüzde işletim sistemi tarafından sağlanan kapsamlı bir yapıdır. (bir kütüphane değildir mesela) Bir çok farklı yazılımdan meydana gelen bu sistem (yığıt) bir ağ üzerinde iletişim kurarken ön şart olan birçok iletişim protokolünü yerine getirerek bu yükü process'lerin üzerinden alır. Yazılım geliştirenlerin bu protokolleri düşünmesine gerek kalmaz.
Programların, ağ soketlerini kullanarak protocol stack ile iletişim kurmak için kullandıkları uygulama programlama arabirimine * soket programlama API adı verilir. Bu API'ı kullanan yazılımların geliştirilmesine de soket programlama veya ağ programlama adı verilir. İnternet soketi API'ları genellikle Berkeley Sockets standardını temel alır. Berkeley Sockets standardında soketler, "her şey bir dosya" olan Unix felsefesine ve soketler ile dosyalar arasındaki benzerliklere bağlı kalınmıştır ve soketler bir dosya tanımlayıcısı * biçimindedir. Dosyalar ve soketlerin her ikisinin de okuma, yazma, açma ve kapama işlevleri olduğu için birbirine benzerlikleri buradan kaynaklanır ancak elbette uygulamada ortaya çıkan bazı farklılıklar bu benzetimin gücünü düşürür. Örneğin bir sokette dosyadan farklı olarak gönderme * ve alma * arayüzleri mevcuttur. İşlemler arası iletişimde * * her dinleme noktası genellikle kendi soketine sahiptir, ancak bunlar farklı API'lar kullanabilir. Bu tür soketler ağ protokolü tarafından soyutlanır.
TCP ve UDP gibi artık sektörde standart olmuş İnternet protokollerindeki soket adresi, bir IP adresi ve bir bağlantı noktası numarası * kombinasyonundan oluşur. Bu tıpkı bir telefon bağlantısında olduğu gibidir. Bağlantının bir ucu daima başka bir telefon numarasına bağlanır ve her numara da içinde alan kodu, bölge kodu gibi alt birimler taşır. Bu durum IP ve port birleşiminde de karşımıza çıkar. Örneğin, yalnızca veri göndermek için soketlerin bir adrese sahip olması gerekmez, ancak bir program bir soketi bir adrese bağlarsa * , soket bu adrese gönderilen verileri almak için kullanılabilir. Bu adrese dayanarak, İnternet soketleri gelen veri paketlerini uygun uygulama sürecine gönderebilir.
Tanım
Bir soket (iç temsil), soket tanımlayıcı (soyut tanımlayıcı) ve soket adresi (genel adres) arasındaki farklar incedir ve günlük kullanımda kolayca gözden kaçabilir. Ayrıca, çoğu yazar, bir soketi tanımlarken kendi yorumunu kullandığı için "soket"ler yazarlar arasında farklılık gösterir ve genellikle yazarların çoğu soket deyince bir internet soketi veya TCP soketine atıfta bulunur.
Bir İnternet soketi en azından aşağıdaki özellikleri taşır:
Başka bir sokete, örneğin bir TCP bağlantısı kurulurken bağlanan bir soketin uzaktan soket adresi * de vardır.
Bir uygulama tarafından oluşturulan her bir soketin, soket tanımlayıcı adı verilen, o işletim sistemi içinde benzersiz sayısal bir değeri olacaktır. İşletim sistemi, gelen IP paketlerinin yükünü nereye, hangi process'e teslim etmesi gerektiğini, IP'de ve protokol başlıklarında bulunan bilgilere bakarak anlar ve gereksiz bilgileri temizleyerek veriyi ilgili uygulamaya iletir.
Internet Engineering Task Force'un * yürüttüğü Request for Comments * internet standartlarında, birçok ders kitabında ve bu makalede olduğu gibi soket terimi, soket numarası ile benzersiz olarak tanımlanan bir varlığı ifade eder. Bazı ders kitaplarında ise soket terimi, bir yerel soket adresini, yani "bir IP adresi ile bir port numarasının birleşimini" ifade eder. RFC 147'de verilen orijinal soket tanımı, 1971 tarihli ARPA network ile ilişkili olmakla beraber, "soket, alıcı soketlerini tanımlayan soket ve soket tanımlayan tek soketleri tanımlayan bir 32 bitlik numaradır" şeklinde tanımlar ancak, günümüzde soket iletişimleri iki yönlüdür.
Araçlar
Unix benzeri işletim sistemleri ve Microsoft Windows'ta komut satırı araçları olan netstat ve ss, kurulu soketleri ve bilgileri listelemek için kullanılır.
Örnekler
Aşağıdaki örnek Berkeley Socket arayüzünü baz almıştır ve "Merhaba, dünya!" dizesini TCP üzerinden 5.10.15.252 adresli ana makinenin 7687 portuna gönderir. Dize uzaktaki ana makineye bağlantı kurularak gönderilir ve sonunda kapatılır.
Socket socket = getSocket( type = "TCP" )
connect( socket, address = "5.10.15.252", port = "7687" )
send( socket, "Hello, world!" )
close( socket )
Türler
Çok sayıda farklı internet soketi türü bulunur.
- datagram sockets, bunlar connectionless sockets olarak da bilinir, User Datagram Protocol * adı verilen bir protokol kullanırlar
- stream sockets, bunlar connection-oriented sockets adıyla bilinirler, Transmission Control Protocol * , Stream Control Transmission Protocol * veya Datagram Congestion Control Protocol * protokollerini kullanırlar
- raw sockets (diğer adıyla Raw IP sockets), bunlar genellikle ağ yönlendiricileri * ve diğer ağ ekipmanlarında kullanılır. Bunlarda aktarım katmanı * bulunmaz. Ayrıca veri paketlerinde bulunan başlıklar (meta bilgiler) uygulama tarafından erişilebilir olurlar. Adres kısmında port numarası bulunmaz, iletişim için sadece ip adresi kullanılır.
Diğer soket türleri, System Network Architecture * gibi diğer aktarım protokolleri üzerinden kullanılır Ayrıca, inter-process communication * * için Unix Domain Sockets * gibi kullanımlar bulunur.
Soketlerin İstemci-Sunucu Halleri
Bir bilgisayarın içinde o anda çalışmakta olan bir yazılıma process denir. Bunlardan bazıları başka uygulamalara hizmet verir. Onların işlemlerine girdi olarak girecek bilgileri çıktı olarak veren process'ler vardır. Bu tür process'lere sunucu * denir ve bunlar çalışmaya başlayınca dinleme durumunda olan soketler oluştururlar ve oluşturdukları bu soketler üzerinden istek kabul edebilme yeteneği kazanmış olurlar.
Bir TCP sunucusu, sadece bir istemci ile iletişim halinde kalacak olursa diğer istemcilere hizmet veremez ve servis dışı kalır ancak sunucular bunun yerine her istemci için bir alt süreç oluşturup istemciyi bu alt sürece yine TCP bağlantısıyla bağlar ve yeni istemcileri beklemeye devam eder. Her bir bağlantının kendine ait bir de soketi oluşturulur. (istemcinin bir tane soketi olduğunu hatırlayın). Böylece soketten sokete sanal biçimde bir bağlantı oluşturulmuş olur. Bu sanal bağlantılara virtual circuit veya kısaca VC denir. Soketlerin durumu da "established" olarak tanımlanır. Bu olay da genel olarak TCP Session olarak bilinir. Artık bu iki soket birbirine byte akışı yapmak için hazır durumdadırlar.
Bir sunucu çok sayıda soketi aynı port ve IP adresi üzerine established yapıda kurup dinlemeye hazır hale getirebilir ve bütün bunları sunucu kendi process'inde veya çocuk processlerde haritalandırıp saklar ve gerekli olduğunda hizmet etmek için kullanır. Her client kendi IP adresine ve/veya port numarasına sahip olacağı için bunlara ayrılan soketler de farklı tanımlara sahip olur ve sunucu tarafından birbirinden farklı soketler olarak ele alınır.
Bir UDP soketi "established" durumda olamaz, çünkü UDP connectionless'tır. Bu nedenle netstat UDP soketinin durum bilgisini gösteremez. Bir UDP sunucusu başvuran her istemci için yeni bir alt süreç oluşturmaz. Bir process, tek soket üzerinden bütün istemcileri dinler ve gelen veri paketlerini aynı bu soket üzerinden sırayla işler. Elbette gelen veri paketleri, içinde istemciye ait bilgiler barındırdığından, buradaki kimliklendirme process tarafından yönetilir, TCP durumunda olduğu gibi ayrı soketlere bölerek yapılmaz.
Soket Çiftleri
Yereldeki veya uzaktaki bir soketle iletişim kurmak demek, bir socket pairs oluşturmak demektir. Her soket çifti, kaynak ve varış IP adresleri ve port numaralarından, diğer bir deyişle, yerel ve uzak soket adreslerinden oluşan benzersiz bir 4 parçalı tanımlama grubu taşır. TCP durumunda her eşsiz soket çifti için 4 parçalı bir soket tanımlama numarası atanırken UDP durumunda her benzersiz yerel soket adresine bir soket numarası atanır.
Ağ Cihazlarındaki Soketler
Soketler internet işleyiş modelinin * aktarım katmanında * kullanılan bir konsepttir. Yönlendirici * ve anahtarlar * gibi ağ donanımları, bağlantı katmanı * düzeyinde (anahtarlar) veya internet katmanında * (yönlendiriciler) çalıştıkları için aktarım katmanının * uygulanmasına gerek duymazlar. Bununla birlikte, ağ güvenlik duvarları * , ağ adresi çeviricileri * ve proxy sunucuları etkin soket çiftlerini takip etmektedir.
(bkz: WebSocket)
#programlama