Aygıt dosyalarını hızlı bir şekilde gözden geçirelim: Linux'ta uygulama programları rad ve iletişim işlemlerini çekirdek tanımlayıcıları aracılığıyla çekirdeğe iletir . Bu dosyalar için harika çalışıyor ve aynı API'nın, karakter akışları üreten ve tüketen karakter aygıtları için kullanılabileceği ve rastgele boyutta blokları rastgele erişim adresinde okuyan ve yazan aygıtları engelleyebileceği ortaya çıktı. dosyalardır.
Ancak bu cihazları yapılandırmak için bir yola ihtiyaç vardı (baud hızlarını ayarlayın vb.) Ve bunun için ioctl çağrısı icat edildi. Sadece cihaza özgü bir veri yapısını ve çekirdeğe kullanılan I / O kontrolünü geçirir ve sonuçları aynı veri yapısında geri alır, bu yüzden çok genel bir genişletilebilir API'dir ve birçok şey için kullanılabilir .
Şimdi, ağ işlemleri nasıl uyuyor? Tipik bir ağ sunucusu uygulaması bazı ağ adreslerine bağlanmak , belirli bir bağlantı noktasını (örn. HTTP için 80 veya ssh için 22) dinlemek ister ve bir istemci bağlanırsa , bu istemciye veri göndermek ve ondan veri almak ister . Ve müşteri için ikili işlemler.
Bunu dosya işlemlerine nasıl sığdıracağı açık değildir (yapılabilir, ancak Plan 9'a bakın ), bu nedenle UNIX tasarımcıları yeni bir API: soket icat etti . Aşağıdakiler için bölüm 2 adam sayfalarında ayrıntıları bulabilirsiniz socket
, bind
, listen
, connect
, send
ve recv
. Dosya G / Ç API'sından farklı socket
olsa da , çağrının yine de bir dosya tanımlayıcı döndürdüğünü unutmayın. Google'da soketlerin nasıl kullanılacağına dair çok sayıda öğretici var, Google biraz.
Şimdiye kadar hepsi tamamen UNIX, soketler icat edildiğinde kimse ağ arayüzlerinden bahsetmiyordu. Ve bu API gerçekten eski olduğu için, İnternet protokolünün ötesindeki çeşitli ağ protokolleri için tanımlanmıştır ( AF_*
sabitlere bakın), ancak Linux'ta bunlardan sadece birkaçı desteklenmektedir.
Ancak bilgisayarlar birden çok ağ kartı almaya başladığında, bunun için bir miktar soyutlama gerekiyordu. Linux'ta bu ağ arayüzüdür (NI). Sadece bir donanım parçası için değil, aynı zamanda çeşitli tüneller için de kullanılır, OpenVPN gibi tüneller olarak sunucunun kullanıcı uygulama uç noktaları. Açıklandığı gibi, soket API'si (özel) dosyalara dayanmaz ve dosya sisteminden bağımsızdır. Aynı şekilde, ağ arayüzleri de dosya sisteminde görünmez. Bununla birlikte, NI'ler /proc
ve /sys
dosya sisteminde (ve diğer ağ ayarlamaları) kullanılabilir.
NI, ağ paketlerinin çekirdeğe girip çıktığı bir uç noktasının basit bir çekirdek soyutlamasıdır. Soketler ise paketleri uygulamalarla iletmek için kullanılır. Bir paketin işlenmesi için soketin yer almasına gerek yoktur. Örneğin, yönlendirme etkinleştirildiğinde, bir paket bir NI'ye girip diğerinde kalabilir. Bu anlamda, soketler ve ağ arayüzleri tamamen bağımsızdır.
Ancak, NI'leri yapılandırmanın bir yolu olmalı, tıpkı blok ve karakter cihazlarını yapılandırmak için bir yola ihtiyacınız vardı. Ve yuvalar zaten bir dosya tanımlayıcı döndürdüğünden ioctl
, bu dosya tanımlayıcıda bir izin vermek biraz mantıklıydı . Bağlantı kurduğunuz netdevice arayüzü budur .
Benzer şekilde sistem çağrılarının birkaç istismarı vardır, örneğin paket filtreleme, paket yakalama vb.
Bütün bunlar parça parça büyüdü ve birçok yerde özellikle mantıklı değil. Bir kerede tasarlansaydı, muhtemelen daha dik bir API yapabilirdi.