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 ioctl
panggilan. ioctl
Namun 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
eth0
terdaftar olehifconfig
) ada tanpa soket?Apakah
ifconfig
atau beberapa daemon pengelola jaringan membiarkan soket terbuka agar kami dapat mengatur opsi antarmuka jaringan?
sumber
Jawaban:
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
danrecv
. 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.
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?