Neden TCP / IP soketleri “açık dosyalar” olarak kabul edilir?


29

Linux'ta temel bir kavram olduğundan emin olduğumu anlama konusunda yardıma ihtiyacım var: açık dosyalar için sınır. Özellikle, açık soketlerin bir sistemdeki toplam "açık dosya" sayısına neden güvenebildiği konusunda kafam karıştı.

Birisi lütfen nedenini açıklayabilir mi? Bunun muhtemelen Linux'taki "her şey bir dosyadır" ilkesine geri döndüğünü biliyorum, ancak herhangi bir ek ayrıntıya müteşekkir olur.

Yanıtlar:


34

"Açık dosyalar" sınırlaması gerçekten sadece dosyalar için değildir. Tek bir işlemin bir kerede kullanabileceği çekirdek tutamaçlarının sayısı için bir sınırdır . Tarihsel olarak, programların genellikle çok fazla açacağı tek şey dosyalardı, bu nedenle bu açık dosya sayısında bir sınır olarak bilinirdi. Süreçlerin engellenmesine, birçok dosya açılması ve yanlışlıkla kapatmayı unutmayacağına ve bunun sonucunda sistem genelinde sorunlara yol açacağına dair bir sınırlama var.

Bir soket bağlantısı aynı zamanda bir çekirdek tutamağıdır. Bu yüzden aynı sınırlar aynı sebeplerden dolayı geçerli - bir sürecin ağ bağlantılarını açması ve bunları kapatmayı unutması mümkün.

Yorumlarda belirtildiği gibi, çekirdek tutamaçlarına geleneksel olarak Unix benzeri sistemlerde dosya tanıtıcısı adı verilir .


23
"Çekirdek işleci" bir Windows terminolojisidir. Bu varlıkların genellikle Unix ve Linux ile nasıl adlandırıldığını gösteren "dosya tanımlayıcıları" nı kullanmayı tercih edersiniz.
jlliagre

11
Bu cevap çok fazla korunuyor. Yuva vardır dosyaları. Bir dosya olmanın ne anlama geldiğinin kalbi olan read/ writearabirimi üzerinden bayt akışlarına erişim sağlarlar .

4
@ WumpusQ.Wumbley, ancak o zaman üzerlerinde shutdown(2)sistem çağrısı var, ancak dosyalar üzerinde değil ve kullanan bir soketten okuyamazsınız cat- nedeni budur netcat. Unix benzeri çekirdeklerdeki (neyse ki) soketlerin G / Ç açısından dosya gibi davrandığını söyleyebilirim, ancak benzerlik tam burada bitiyor. (Dürüst olmak gerekirse, bu şeylerle geleneksel birleşmelerden daha uzakta olduklarını duyduklarını duyduğumda, Plan 9 deneyimi olan birinden de duymak isterim).
kostix

@MikeB, bu kitap Unix ile ilgili kavramların çoğunu hızlandıracak. Şiddetle tavsiye edilir.
kostix

3
"Her şey bir dosyadır" fikri, "dosya" nın birçok alt türden oluşan soyut bir veri türü olduğu anlamına gelir. Alt türlerin çoğu, tüm dosyaların desteklediği temel öğelere ek olarak ek yöntemleri de destekler. soketlerde ekstralar var. engelleme aygıtları ve düzenli dosyaları aramak. dizinler gerçekten garip (yazma çalışmıyor ve eğer okumak işe yararsa, işe yaramaz). Ekstra yöntemlerin varlığı, bu şeylerin "dosya" dediğimiz genel kategori kategorisinin bir parçası olmadığı anlamına gelmez.

27

Nedeni , TCP / IP priz kullanımı dosya tanımlayıcıları neden prizler arayüzü ilk tasarlanmış ve (uygulamaya konulduğunda yani 1983 yılında, BSD Unix yapabilirsiniz -), onun tasarımcılar bir ağ bağlantısı bir dosyaya benzer olduğunu hissetti read, writeve closeher iki ve Unix’in “her şey bir dosya” olduğu fikrine çok iyi uyuyordu.

Diğer TCP / IP ağ yığını uygulamaları, OS'lerin dosya-I / O alt sistemleriyle bir bütünleşmedi, örneğin MacTCP . Ancak BSD soketleri arabirimi çok popüler olduğu için, bu diğer uygulamalar bile soket API'sini Unix benzeri işlevleriyle çoğaltmayı seçti, bu nedenle, yalnızca TCP / IP iletişimi için kullanılan, aksi takdirde yapmayan sistemlerde "dosya tanımlayıcıları" elde ettiniz dosya tanımlayıcıları var.

Sorunuzun diğer kısmı, neden bir limit var? Bunun nedeni, bir dosya tanımlayıcı arama tablosunu uygulamanın en hızlı yolunun bir dizi olmasıdır. Tarihsel olarak, sınır çekirdeğe kodlanmıştı.

İşlem başına 20 dosya tanımlayıcısının kodlanmış bir limiti olan Unix 7 (1979) sürümündeki kod:

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

Karşılaştırma yapmak gerekirse, Linux bir işlemin dosya tanımlayıcı tablosu için dinamik olarak yer ayırır. Mutlak limit varsayılan olarak 8192'dir, ancak bunu istediğiniz şekilde ayarlayabilirsiniz. Sistemim 191072'yi içeriyor /proc/sys/fs/file-max.

Artık Linux'ta mutlak bir sınır olmamasına rağmen, programların çıldırmasına izin vermek istemiyoruz, bu nedenle yönetici (veya dağıtım paketleyicisi) genellikle kaynak sınırlarını belirler. Bir göz at /etc/security/limits.confveya koş ulimit -n.


Bu konuyla ilgili en iyi cevaplardan biri, teşekkürler
user859375

6

Dosyalar sadece diskteki veya bellekteki dosyalar değildir; bunlar yalnızca iki örnek olan veri akışlarıdır.

Uzak uç noktalar üçüncü bir örnektir ve yuva kullananlarla etkileşime girersiniz.


2
U & L.SE’ye hoş geldiniz. Bu cevabı beğendim.
eyoung100 25:14
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.