Mari kita cepat meninjau file perangkat: Di Linux, program aplikasi mengkomunikasikan operasi rad dan menulis ke kernel melalui deskriptor file . Itu bekerja sangat baik untuk file, dan ternyata API yang sama dapat digunakan untuk perangkat karakter yang menghasilkan dan menggunakan aliran karakter, dan memblokir perangkat yang membaca dan menulis blok ukuran tetap pada alamat akses acak, hanya dengan berpura-pura bahwa ini juga file.
Tetapi diperlukan cara untuk mengkonfigurasi perangkat-perangkat itu (mengatur baud rate dll.), Dan untuk itu, panggilan ioctl ditemukan. Itu hanya melewati struktur data yang khusus untuk perangkat dan jenis kontrol I / O yang digunakan untuk kernel, dan mendapatkan kembali hasilnya dalam struktur data yang sama, jadi itu adalah API extensible yang sangat generik dan dapat digunakan untuk banyak hal .
Sekarang, bagaimana operasi jaringan cocok? Aplikasi server jaringan tipikal ingin mengikat ke beberapa alamat jaringan, mendengarkan pada port tertentu (misalnya 80 untuk HTTP, atau 22 untuk ssh), dan jika klien terhubung , ia ingin mengirim data ke dan menerima data dari klien ini. Dan operasi ganda untuk klien.
Tidak jelas bagaimana mencocokkan ini dengan operasi file (meskipun itu bisa dilakukan, lihat Paket 9 ), itulah sebabnya para desainer UNIX menemukan API baru: sockets . Anda dapat menemukan rincian di bagian 2 halaman manual untuk socket
, bind
, listen
, connect
, send
dan recv
. Perhatikan bahwa meskipun berbeda dari file I / O API, socket
panggilan tetap juga mengembalikan deskriptor file. Ada banyak tutorial tentang cara menggunakan soket di web, sedikit google.
Sejauh ini semuanya murni UNIX, tidak ada yang berbicara tentang antarmuka jaringan pada saat soket diciptakan. Dan karena API ini benar-benar tua, ia didefinisikan untuk berbagai protokol jaringan di luar protokol Internet (lihat AF_*
konstanta), meskipun hanya sedikit yang didukung di Linux.
Tetapi ketika komputer mulai mendapatkan beberapa kartu jaringan, beberapa abstraksi untuk ini diperlukan. Di Linux, itu adalah antarmuka jaringan (NI). Ini tidak hanya digunakan untuk perangkat keras, tetapi juga untuk berbagai terowongan, aplikasi pengguna titik akhir server sebagai terowongan seperti OpenVPN dll. Seperti yang dijelaskan, API soket tidak didasarkan pada file (khusus) dan tidak tergantung pada sistem file. Dengan cara yang sama, antarmuka jaringan juga tidak muncul di sistem file. Namun, NI tersedia di sistem file /proc
dan /sys
(serta tunables jaringan lainnya).
NI adalah abstraksi kernel sederhana dari titik akhir di mana paket jaringan masuk dan keluar dari kernel. Soket, di sisi lain, digunakan untuk berkomunikasi paket dengan aplikasi. Tidak perlu ada soket yang terlibat dengan pemrosesan paket. Misalnya, ketika penerusan diaktifkan, sebuah paket dapat masuk pada satu NI dan meninggalkan yang lain. Dalam pengertian itu, soket dan antarmuka jaringan sepenuhnya independen.
Tetapi harus ada cara untuk mengkonfigurasi NI, sama seperti Anda membutuhkan cara untuk mengkonfigurasi perangkat blok dan karakter. Dan karena soket sudah mengembalikan deskriptor file, agak logis untuk hanya mengizinkan ioctl
deskriptor file tersebut. Itulah antarmuka netdevice yang Anda tautkan .
Ada beberapa penyalahgunaan panggilan sistem dengan cara yang serupa, misalnya untuk packet filtering, packet capture, dll.
Semua ini telah tumbuh sepotong demi sepotong, dan tidak terlalu logis di banyak tempat. Jika itu dirancang sekaligus, orang mungkin bisa membuat API yang lebih ortogonal.