Genel soket nedir ve bir ağ cihazı ile nasıl bir ilişkisi vardır?


9

Linux altında ağ sürücülerinin nasıl çalıştığını anlamaya çalışıyorum. Bu soru-cevap Linux'taki ağ cihazının bir cihaz dosyası tarafından temsil edilmediğini gösterdi. Ağ sürücülerinin birlikte çalıştığını belirtir sockets.

Örneğin, bu , ağ aygıtlarının ioctlaramalar yoluyla nasıl kurulacağını gösterir . ioctlancak ağ sürücüleri için aygıt dosyası olmadığı göz önüne alındığında bir dosya tanımlayıcıya ihtiyaç duyulur , iletilebilen tek dosya tanımlayıcı soketten bir dosya tanımlayıcısıdır.

Bu beni sorunun noktasına getiriyor. Şimdiye kadar, fiziksel bir ağ kartının yazılım temsili olan ağ arayüzü, aslında bir soketin daha düşük bir nesnesidir.

  • Ancak bu soyut anlamda bir soket nedir, push bildirimlerini destekleyen bir cihaz dosyası için başka bir isim mi? Bir kullanıcı arabirimi uygulaması tarafından bir ağ arabirimindeki bir adres: bağlantı noktası çiftine bağlanan bağlantı noktaları açısından TCP yuvalarını anlıyorum. Bir soketi ağ arabirimi kurmak için ön koşul olarak anlamıyorum.

  • Linux'ta bir ağ arabirimi ( eth0listelendiği gibi ifconfig) bir soket olmadan var olabilir mi?

  • Mu ifconfigya da bazı ağ yöneticisi cini bizi ağ arayüz seçeneklerini ayarlamak izin vermek açık bir soket tutmak?


Yanıtlar:


6

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, sendve recv. Dosya G / Ç API'sından farklı socketolsa 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 /procve /sysdosya 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.


Sockets as the network communications API were already not represented in the filesystem, so the NI didn't get one, either.Bu bir yazım hatası mı?
TheMeaningfulEngineer

Sizce bir yazım hatası hangisidir? Düz soketlerin kendileriyle ilişkili bir dosya adı veya inodeu yoktur (ancak Unix etki alanı soketleri de vardır).
dirkt

Cümleyi anlamsal olarak anlamadım, üzgünüm, bu yüzden tekrar kontrol etmek istedim.
TheMeaningfulEngineer

Üzgünüm, ana dili İngilizce olmayan biriyim. Yeniden anlatmaya çalıştım, şimdi anlaşılması daha kolay mı?
dirkt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.