Apa itu soket generik dan bagaimana kaitannya dengan perangkat jaringan?

9

Saya mencoba memahami cara kerja driver jaringan di Linux. T&J ini menunjukkan bahwa perangkat jaringan di Linux tidak diwakili oleh file perangkat. Ini menyatakan bahwa driver jaringan bekerja dengan sockets.

Sebagai contoh, ini referensi cara mengatur perangkat jaringan melalui ioctlpanggilan. ioctlNamun memerlukan deskriptor file , mengingat bahwa tidak ada file perangkat untuk driver jaringan, satu-satunya deskriptor file yang dapat diteruskan adalah yang dari soket.

Ini membawa saya ke titik pertanyaan. Sejauh ini sepertinya antarmuka jaringan, yang akan menjadi representasi perangkat lunak dari kartu jaringan fisik, sebenarnya merupakan objek yang lebih rendah daripada soket.

  • Tetapi apa arti soket dalam pengertian abstrak ini, apakah itu hanya nama lain untuk file perangkat yang mendukung pemberitahuan push? Saya memahami soket TCP dalam hal titik koneksi yang diikat oleh aplikasi userspace ke alamat: pasangan port pada antarmuka jaringan. Saya tidak mengerti soket sebagai prasyarat untuk mengatur antarmuka jaringan.

  • Bisakah antarmuka jaringan di Linux (seperti eth0terdaftar oleh ifconfig) ada tanpa soket?

  • Apakah ifconfigatau beberapa daemon pengelola jaringan membiarkan soket terbuka agar kami dapat mengatur opsi antarmuka jaringan?

TheMeaningfulEngineer
sumber

Jawaban:

6

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, senddan recv. Perhatikan bahwa meskipun berbeda dari file I / O API, socketpanggilan 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 /procdan /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 ioctldeskriptor 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.

dirkt
sumber
Sockets as the network communications API were already not represented in the filesystem, so the NI didn't get one, either.Apakah ini salah cetak?
TheMeaningfulEngineer
Menurut Anda bagian mana yang salah ketik? Soket polos tidak memiliki nama file atau inode yang terkait dengannya (meskipun soket domain Unix memilikinya).
dirkt
Aku hanya tidak mengerti kalimat itu, maaf, jadi ingin memeriksa ulang.
TheMeaningfulEngineer
Maaf, saya bukan penutur asli bahasa Inggris. Saya mencoba untuk mengulanginya, apakah sekarang lebih mudah dimengerti?
dirkt