Mengapa antarmuka jaringan tidak di / dev seperti perangkat lain?
70
Saya kebanyakan penasaran, tetapi mengapa tidak ada antarmuka jaringan di / dev? Apakah ada jenis perangkat lain yang tidak direpresentasikan sebagai simpul di bawah / dev?
Saya telah melihat setidaknya satu artikel / kata-kata kasar tentang bagaimana segala sesuatu di Unix bukan file terlepas dari mantra, dan mengutip masalah ini. Saya tidak dapat menemukannya sekarang, tapi itu mungkin artikel tentang Plan 9 atau GNU Hurd.
Shawn J. Goff
3
Setidaknya di bawah Solaris, ada perangkat antarmuka jaringan di bawah / dev (/ perangkat sebenarnya).
jlliagre
2
Segala sesuatu di Unix sebagai file tidak selalu berarti berperilaku seperti itu ke seluruh pengguna, hanya saja API yang mendasarinya beroperasi secara waras dan seragam pada deskriptor file. Ketika Anda membuka soket, misalnya, Anda dapat menggunakan read()dan write()dengan cara yang sama Anda lakukan pada file, tetapi utilitas berfungsi recv()dan send()melakukan lebih banyak kerja keras untuk Anda.
jgoldschrafe
1
Itu adalah pertanyaan yang saya tanyakan pada diri saya selama bertahun-tahun. Terima kasih telah bertanya dan orang-orang telah menjawab!
Dolanor
Jawaban:
43
Pada banyak perangkat, operasi utama adalah mengirim byte dari komputer ke perangkat, atau menerima byte dari perangkat di komputer. Perangkat seperti ini mirip dengan pipa dan berfungsi dengan baik sebagai perangkat karakter . Untuk operasi yang tidak membaca dan menulis (seperti kontrol aliran pada saluran serial), perangkat menyediakan perintah ad-hoc yang disebut ioctl .
Beberapa perangkat sangat mirip dengan file biasa: mereka dibuat dari jumlah byte yang terbatas, dan apa yang Anda tulis pada posisi tertentu nantinya dapat dibaca dari posisi yang sama. Perangkat ini disebut perangkat blok .
Antarmuka jaringan lebih kompleks: apa yang mereka baca dan tulis bukan byte tetapi paket. Meskipun masih mungkin untuk menggunakan antarmuka biasa dengan readdan write, itu akan menjadi canggung: mungkin setiap panggilan untuk writeakan mengirim paket, dan setiap panggilan untuk readakan menerima paket (dan jika buffer terlalu kecil untuk paket cocok, paket akan hilang).
Antarmuka jaringan bisa ada karena perangkat hanya menyediakan ioctl. Sebenarnya, inilah yang dilakukan beberapa varian unix, tetapi tidak untuk Linux. Ada beberapa keuntungan dari pendekatan ini; misalnya, di Linux, antarmuka jaringan dapat memanfaatkan udev . Tetapi keuntungannya terbatas, itu sebabnya belum dilakukan.
Sebagian besar aplikasi yang berhubungan dengan jaringan tidak peduli dengan antarmuka jaringan individu, mereka bekerja pada tingkat yang lebih tinggi. Misalnya, browser web ingin membuat koneksi TCP, dan server web ingin mendengarkan koneksi TCP. Untuk tujuan ini, yang akan berguna adalah perangkat untuk protokol jaringan tingkat tinggi, misalnya
Sebenarnya ksh dan bash menyediakan antarmuka seperti itu untuk klien TCP dan UDP. Secara umum, bagaimanapun, aplikasi jaringan lebih kompleks daripada aplikasi pengakses file. Sementara sebagian besar pertukaran data dilakukan dengan panggilan analog readdan write, membangun koneksi memerlukan lebih banyak informasi daripada hanya nama file. Misalnya, mendengarkan koneksi TCP mengambil dua langkah: satu dilakukan ketika server mulai mendengarkan, dan satu lagi dilakukan setiap kali klien terhubung. Langkah-langkah tambahan semacam itu tidak cocok dengan file API, yang merupakan alasan utama mengapa jaringan memiliki API sendiri.
Kelas perangkat lain yang biasanya tidak memiliki entri di /devLinux (tetapi ada pada beberapa varian unix lainnya) adalah adapter video. Pada prinsipnya, adapter video sederhana dapat diekspos sebagai perangkat framebuffer , yang dapat berupa perangkat blok yang terbuat dari blok yang mewakili warna setiap piksel. Adaptor video yang dipercepat dapat direpresentasikan sebagai perangkat karakter ke mana aplikasi mengirim perintah. Di sini, kelemahan dari antarmuka perangkat adalah lambat: aplikasi menampilkan (dalam praktiknya, server X) perlu melakukan panggilan kernel setiap kali menampilkan apa pun. Apa yang terjadi sebagai gantinya adalah bahwa server X sebagian besar menulis langsung ke memori adapter video, karena lebih cepat.
Bahkan, dipercepat video adapter yang diekspor sebagai chardevs melalui DRI di Linux. Operasi File I / O tidak perlu read/ writebaik; Anda dapat menggunakan mmapuntuk file yang dipetakan dan akses langsung ke memori perangkat.
minmaxavg
11
Anda dapat menemukannya di /sys/class/netdirektori. itu link simbolis ke file lain di /sys/device/../../, berikut ini adalah mesin virtual saya (linux kernel 3.10) output. Dan Anda dapat menggunakan perintah udevadm info <filename>untuk melihat atributnya
Selamat datang di U&L. Selalu gunakan backquotes di sekitar kode sebaris, terutama jika Anda menggunakan <>sebaliknya yang akan diartikan sebagai markup. (Anda mungkin juga ingin mengubah nama Anda untuk memulai dengan transkripsi ASCII, karena orang-orang dengan keyboard sederhana akan mengalami kesulitan mengetik karakter pertama dari nama Anda dalam menanggapi setiap komentar yang Anda buat)
Anthon
9
Cara AT&T / Solaris "Transport Level Interface" (TLI) untuk melakukan jaringan TCP / IP memiliki file khusus seperti "/ dev / tcp" atau "/ dev / udp". Programmer membuka file khusus untuk mendapatkan soket dari keluarga protokol yang sesuai. Saya pikir itu sebabnya Anda harus memiliki "-lnsl" ketika menyusun program yang menggunakan soket pada Solaris: di bawah itu semua itu adalah TLI.
Linux juga memiliki /dev/tcpdan /dev/udp, meskipun sebagian besar kernel menonaktifkannya.
bahamat
3
Walaupun secara tradisional Linux belum sepenuhnya dapat diandalkan, apalagi mengikuti segala standar Open Group (di luar mungkin LSB). Telah ada upaya untuk port lebih banyak fungsi UNIX ke Linux.
Glendix adalah salah satu proyek yang menawarkan port / filesystem virtual dari Plan9 yang memungkinkan Anda untuk melakukan seperti yang Anda gambarkan.
read()
danwrite()
dengan cara yang sama Anda lakukan pada file, tetapi utilitas berfungsirecv()
dansend()
melakukan lebih banyak kerja keras untuk Anda.Jawaban:
Pada banyak perangkat, operasi utama adalah mengirim byte dari komputer ke perangkat, atau menerima byte dari perangkat di komputer. Perangkat seperti ini mirip dengan pipa dan berfungsi dengan baik sebagai perangkat karakter . Untuk operasi yang tidak membaca dan menulis (seperti kontrol aliran pada saluran serial), perangkat menyediakan perintah ad-hoc yang disebut ioctl .
Beberapa perangkat sangat mirip dengan file biasa: mereka dibuat dari jumlah byte yang terbatas, dan apa yang Anda tulis pada posisi tertentu nantinya dapat dibaca dari posisi yang sama. Perangkat ini disebut perangkat blok .
Antarmuka jaringan lebih kompleks: apa yang mereka baca dan tulis bukan byte tetapi paket. Meskipun masih mungkin untuk menggunakan antarmuka biasa dengan
read
danwrite
, itu akan menjadi canggung: mungkin setiap panggilan untukwrite
akan mengirim paket, dan setiap panggilan untukread
akan menerima paket (dan jika buffer terlalu kecil untuk paket cocok, paket akan hilang).Antarmuka jaringan bisa ada karena perangkat hanya menyediakan
ioctl
. Sebenarnya, inilah yang dilakukan beberapa varian unix, tetapi tidak untuk Linux. Ada beberapa keuntungan dari pendekatan ini; misalnya, di Linux, antarmuka jaringan dapat memanfaatkan udev . Tetapi keuntungannya terbatas, itu sebabnya belum dilakukan.Sebagian besar aplikasi yang berhubungan dengan jaringan tidak peduli dengan antarmuka jaringan individu, mereka bekerja pada tingkat yang lebih tinggi. Misalnya, browser web ingin membuat koneksi TCP, dan server web ingin mendengarkan koneksi TCP. Untuk tujuan ini, yang akan berguna adalah perangkat untuk protokol jaringan tingkat tinggi, misalnya
Sebenarnya ksh dan bash menyediakan antarmuka seperti itu untuk klien TCP dan UDP. Secara umum, bagaimanapun, aplikasi jaringan lebih kompleks daripada aplikasi pengakses file. Sementara sebagian besar pertukaran data dilakukan dengan panggilan analog
read
danwrite
, membangun koneksi memerlukan lebih banyak informasi daripada hanya nama file. Misalnya, mendengarkan koneksi TCP mengambil dua langkah: satu dilakukan ketika server mulai mendengarkan, dan satu lagi dilakukan setiap kali klien terhubung. Langkah-langkah tambahan semacam itu tidak cocok dengan file API, yang merupakan alasan utama mengapa jaringan memiliki API sendiri.Kelas perangkat lain yang biasanya tidak memiliki entri di
/dev
Linux (tetapi ada pada beberapa varian unix lainnya) adalah adapter video. Pada prinsipnya, adapter video sederhana dapat diekspos sebagai perangkat framebuffer , yang dapat berupa perangkat blok yang terbuat dari blok yang mewakili warna setiap piksel. Adaptor video yang dipercepat dapat direpresentasikan sebagai perangkat karakter ke mana aplikasi mengirim perintah. Di sini, kelemahan dari antarmuka perangkat adalah lambat: aplikasi menampilkan (dalam praktiknya, server X) perlu melakukan panggilan kernel setiap kali menampilkan apa pun. Apa yang terjadi sebagai gantinya adalah bahwa server X sebagian besar menulis langsung ke memori adapter video, karena lebih cepat.sumber
read
/write
baik; Anda dapat menggunakanmmap
untuk file yang dipetakan dan akses langsung ke memori perangkat.Anda dapat menemukannya di
/sys/class/net
direktori. itu link simbolis ke file lain di/sys/device/../../
, berikut ini adalah mesin virtual saya (linux kernel 3.10) output. Dan Anda dapat menggunakan perintahudevadm info <filename>
untuk melihat atributnyasumber
<>
sebaliknya yang akan diartikan sebagai markup. (Anda mungkin juga ingin mengubah nama Anda untuk memulai dengan transkripsi ASCII, karena orang-orang dengan keyboard sederhana akan mengalami kesulitan mengetik karakter pertama dari nama Anda dalam menanggapi setiap komentar yang Anda buat)Cara AT&T / Solaris "Transport Level Interface" (TLI) untuk melakukan jaringan TCP / IP memiliki file khusus seperti "/ dev / tcp" atau "/ dev / udp". Programmer membuka file khusus untuk mendapatkan soket dari keluarga protokol yang sesuai. Saya pikir itu sebabnya Anda harus memiliki "-lnsl" ketika menyusun program yang menggunakan soket pada Solaris: di bawah itu semua itu adalah TLI.
sumber
/dev/tcp
dan/dev/udp
, meskipun sebagian besar kernel menonaktifkannya.Walaupun secara tradisional Linux belum sepenuhnya dapat diandalkan, apalagi mengikuti segala standar Open Group (di luar mungkin LSB). Telah ada upaya untuk port lebih banyak fungsi UNIX ke Linux.
Glendix adalah salah satu proyek yang menawarkan port / filesystem virtual dari Plan9 yang memungkinkan Anda untuk melakukan seperti yang Anda gambarkan.
Plan9 Port / sistem file bersih ke linux
sumber