Mengapa soket TCP / IP dianggap "file terbuka"?

29

Saya butuh bantuan untuk memahami apa yang saya yakini sebagai konsep mendasar di Linux: batas untuk membuka file. Secara khusus, saya bingung mengapa soket terbuka dapat diperhitungkan dengan jumlah total "file terbuka" pada suatu sistem.

Dapatkah seseorang tolong uraikan alasannya? Saya mengerti bahwa ini mungkin kembali ke prinsip "semuanya adalah file" di Linux tetapi detail tambahan akan dihargai.

Mike B
sumber

Jawaban:

34

Batas "file terbuka" sebenarnya tidak hanya untuk file. Ini adalah batasan jumlah kernel yang dapat digunakan oleh satu proses pada satu waktu. Secara historis, satu-satunya hal yang biasanya dibuka oleh banyak program adalah file, jadi ini dikenal sebagai batasan jumlah file terbuka. Ada batasan untuk membantu mencegah proses dari mengatakan, membuka banyak file dan secara tidak sengaja lupa untuk menutupnya, yang pada akhirnya akan menyebabkan masalah di seluruh sistem.

Koneksi soket juga merupakan pegangan kernel. Jadi batas yang sama berlaku untuk alasan yang sama - dimungkinkan untuk suatu proses membuka koneksi jaringan dan lupa untuk menutupnya.

Seperti disebutkan dalam komentar, pegangan kernel secara tradisional disebut deskriptor file dalam sistem mirip Unix.

Greg Hewgill
sumber
23
"Kernel handles" adalah terminologi Windows. Anda lebih suka merujuk ke "file deskriptor" yang biasanya disebut entitas dengan Unix & Linux.
jlliagre
11
Jawaban ini terlalu banyak melindungi. Soket adalah file. Mereka menyediakan akses ke stream byte melalui read/ writeantarmuka, yang merupakan jantung dari apa artinya menjadi file.
4
@ WumpusQ.Wumbley, tetapi kemudian Anda memiliki shutdown(2)syscall pada mereka, tetapi tidak pada file, dan Anda tidak dapat membaca dari soket menggunakan cat- itulah alasannya netcattelah dibuat. Saya akan mengatakan bahwa (untungnya) soket di kernel mirip Unix berperilaku seperti file dalam hal I / O, tetapi kesamaan berakhir di sana. (Jujur, saya juga ingin mendengar dari seseorang dengan pengalaman Plan 9 karena saya pernah mendengar mereka mendapatkan penyatuan hal-hal ini lebih jauh dari kesatuan tradisional).
kostix
@MikeB, buku ini akan membuat Anda lebih cepat dengan sebagian besar konsep terkait Unix. Sangat dianjurkan.
kostix
3
Gagasan "semuanya adalah file" berarti bahwa "file" adalah tipe data abstrak dengan banyak subtipe. Sebagian besar subtipe mendukung metode tambahan selain hal-hal dasar yang didukung semua file. soket memiliki banyak tambahan. blokir perangkat dan file biasa. direktori benar-benar aneh (menulis tidak berfungsi dan jika membaca berfungsi, itu tidak berguna). Kehadiran metode tambahan tidak berarti hal-hal ini bukan bagian dari kategori umum hal-hal yang kita sebut "file".
27

Alasan mengapa TCP / IP soket penggunaan deskriptor file adalah bahwa, ketika antarmuka soket pertama kali dirancang dan diimplementasikan ( di BSD Unix, pada tahun 1983 ), desainer merasa bahwa koneksi jaringan adalah analog dengan file - Anda bisa read, writedan closekedua , dan itu akan cocok dengan gagasan Unix "semuanya adalah file".

Implementasi tumpukan jaringan TCP / IP lainnya tidak selalu berintegrasi dengan subsistem file-I / O OS mereka, contohnya adalah MacTCP . Tetapi karena antarmuka soket BSD sangat populer, bahkan implementasi lain ini memilih untuk mereplikasi API soket dengan fungsi seperti Unix, jadi Anda mendapat "deskriptor file", hanya digunakan untuk komunikasi TCP / IP, pada sistem yang tidak sebaliknya punya deskriptor file.

Bagian lain dari pertanyaan Anda adalah mengapa ada batasan? Itu karena cara tercepat untuk mengimplementasikan tabel pencarian deskriptor file adalah dengan sebuah array. Secara historis, batas tersebut dikodekan ke dalam kernel.

Berikut kode dalam Unix rilis 7 (1979) dengan batas 20 file deskriptor file per proses:

  • user.h :struct file *u_ofile[NOFILE]
  • param.h :#define NOFILE 20

Sebagai perbandingan, Linux secara dinamis mengalokasikan ruang untuk tabel deskriptor file suatu proses. Batas absolut default ke 8192, tetapi Anda dapat mengatur ini untuk apa pun yang Anda suka. Sistem saya mencantumkan 191072 di /proc/sys/fs/file-max.

Meskipun tidak ada lagi batasan absolut di Linux, namun kami tidak ingin membiarkan program menjadi gila, sehingga administrator (atau pengemas distribusi) umumnya menetapkan batas sumber daya. Lihatlah /etc/security/limits.conf, atau jalankan ulimit -n.

Stuart Caie
sumber
Salah satu jawaban terbaik dalam topik ini, terima kasih
user859375
6

File bukan hanya file di disk atau di memori; mereka adalah aliran data, yang hanya merupakan dua contoh.

Remote endpoint adalah contoh ketiga, dan Anda berinteraksi dengan mereka yang menggunakan soket.

Lightness Races dengan Monica
sumber
2
Selamat datang di U & L.SE. Saya suka jawaban ini.
eyoung100