Bütünleşik bir computer network'a
(*: bilgisayar ağı)
tek başına veri gönderip veri alabilen ağ düğümlerinin iç kısımdaki uçlarına
ağ soketi
(*: socket)
adı verilir. Daha doğrusu soketler, bir ağ iletişimi yazılımındaki bağlantıya ait bilgileri tutan basit bir tablo girdisi gibidir. (iletişim protokolü, hedef, durum, vs) Ağa bağlı bir makinenin bu bağlantıyı iç tarafında temsil eden bir uçtur, bir gösterimdir ve bir
sistem kaynağıdır.
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
(*: inter-process communication)
(*: IPC)
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
(*: process)
(mesela bir bilgisayarda çalışmakta olan bir programa) refere etmektedir. Soket programlaması yapacak bir sürecin ilk işi, protokol yığıtına
(*: protocol stack)
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
(*: connectionless communication)
,
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
(*: IP)
ağına
Transmission Control Protocol
(*: TCP)
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
(*: one-to-one)
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ı
(*: port)
ile ilişkili olduğu varsayılır ve kendisinin de ilişkili olduğu yabancı düğümde
(*: diğer düğüm)
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
(*: binding)
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
(*: descriptors)
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
(*: API)
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ı
(*: file descriptor)
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
(*: send)
ve alma
(*: receive)
arayüzleri mevcuttur. İşlemler arası iletişimde
(*: inter-process communication)
(*: IPC)
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ı
(*: port)
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
(*: binding)
, 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:
- yerel soket adresi
- yerel IP adresi
- port numarası
- protokol: UDP, TCP veya raw IP gibi...
Başka bir sokete, örneğin bir TCP bağlantısı kurulurken bağlanan bir soketin uzaktan soket adresi
(*: remote socket address)
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
(*: IETF)
yürüttüğü Request for Comments
(*: RFC)
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
(https://tools.ietf.org/html/rfc147)
'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.
Diğer soket türleri,
System Network Architecture
(*: SNA)
gibi diğer aktarım protokolleri üzerinden kullanılır Ayrıca, inter-process communication
(*: süreçler arası iletişim)
(*: IPC)
için
Unix Domain Sockets
(*: UDS)
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
(*: server)
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
(*: internet model)
aktarım katmanında
(*: transport layer)
kullanılan bir konsepttir. Yönlendirici
(*: routers)
ve anahtarlar
(*: switches)
gibi ağ donanımları, bağlantı katmanı
(*: link layer)
düzeyinde (anahtarlar) veya internet katmanında
(*: internet layer)
(yönlendiriciler) çalıştıkları için aktarım katmanının
(*: transport layer)
uygulanmasına gerek duymazlar. Bununla birlikte, ağ güvenlik duvarları
(*: network firewall)
, ağ adresi çeviricileri
(*: network address translator)
ve proxy sunucuları etkin soket çiftlerini takip etmektedir.
bkz
WebSocket
#programlama