เหตุใดซ็อกเก็ต TCP / IP จึงถือว่า“ เปิดไฟล์”


29

ฉันต้องการความช่วยเหลือในการเข้าใจสิ่งที่ฉันแน่ใจว่าเป็นแนวคิดพื้นฐานใน Linux: ขีด จำกัด สำหรับไฟล์ที่เปิด โดยเฉพาะฉันสับสนว่าทำไมซ็อกเก็ตเปิดสามารถนับรวมกับจำนวน "ไฟล์ที่เปิด" ในระบบ

ใครบางคนช่วยอธิบายรายละเอียดเกี่ยวกับเหตุผลได้ไหม ฉันเข้าใจว่าสิ่งนี้อาจย้อนกลับไปที่หลักการ "ทุกอย่างเป็นไฟล์" ใน Linux แต่รายละเอียดเพิ่มเติมใด ๆ จะได้รับการชื่นชม

คำตอบ:


34

ข้อ จำกัด ของ "open files" ไม่ได้มีไว้สำหรับไฟล์เท่านั้น มัน จำกัด จำนวนเคอร์เนลที่จัดการกระบวนการเดียวที่สามารถใช้ได้ในครั้งเดียว ในอดีตสิ่งเดียวที่โปรแกรมมักจะเปิดเป็นจำนวนมากคือไฟล์ดังนั้นสิ่งนี้จึงกลายเป็นข้อ จำกัด เกี่ยวกับจำนวนไฟล์ที่เปิด มีข้อ จำกัด ในการช่วยป้องกันกระบวนการพูดเปิดไฟล์จำนวนมากและลืมปิดโดยไม่ตั้งใจซึ่งจะทำให้เกิดปัญหาทั่วทั้งระบบในที่สุด

การเชื่อมต่อซ็อกเก็ตยังเป็นหมายเลขอ้างอิงเคอร์เนล ดังนั้นข้อ จำกัด เดียวกันนี้จึงใช้กับเหตุผลเดียวกัน - เป็นไปได้ที่กระบวนการจะเปิดการเชื่อมต่อเครือข่ายและลืมปิดมัน

ตามที่ระบุไว้ในความคิดเห็นที่จับเคอร์เนลจะเรียกว่าfile descriptorsในระบบเหมือน Unix


23
"เคอร์เนลจัดการ" เป็นคำศัพท์ของ Windows คุณควรอ้างถึง "file descriptors" ซึ่งเป็นวิธีที่เอนทิตีเหล่านี้ถูกเรียกด้วย Unix & Linux
jlliagre

11
คำตอบนี้ป้องกันความเสี่ยงมากเกินไป Sockets เป็นไฟล์ พวกเขาให้การเข้าถึงกระแสข้อมูลของไบต์ผ่านทางread/ writeอินเตอร์เฟสซึ่งเป็นหัวใจสำคัญของการเป็นไฟล์

4
@ WumpusQ.Wumbley แต่คุณมีshutdown(2)syscall อยู่ด้วย แต่ไม่ใช่ในไฟล์และคุณไม่สามารถอ่านจากซ็อกเก็ตได้โดยใช้catนั่นคือเหตุผลที่netcatสร้างขึ้น ฉันจะบอกว่าซ็อกเก็ต (โชคดี) ในเมล็ดเหมือน Unix ทำตัวเหมือนไฟล์ในรูปของ I / O แต่ความคล้ายคลึงกันสิ้นสุดลงตรงนั้น (สุจริตฉันต้องการได้ยินจากใครบางคนที่มีประสบการณ์แผน 9 เพราะฉันได้ยินว่าพวกเขาได้รวมสิ่งต่าง ๆ เหล่านี้ให้ห่างไกลกว่าที่เคยเป็นแบบดั้งเดิม)
kostix

@MikeB หนังสือเล่มนี้ควรทำให้คุณเข้าใจเร็วขึ้นด้วยแนวคิดที่เกี่ยวข้องกับ Unix แนะนำเป็นอย่างยิ่ง
kostix

3
แนวคิด "ทุกอย่างเป็นไฟล์" หมายความว่า "ไฟล์" เป็นประเภทข้อมูลนามธรรมที่มีชนิดย่อยจำนวนมาก ชนิดย่อยส่วนใหญ่สนับสนุนวิธีการเพิ่มเติมนอกเหนือจากสิ่งพื้นฐานที่ไฟล์ทั้งหมดสนับสนุน ซ็อกเก็ตมีอุปกรณ์พิเศษมากมาย อุปกรณ์บล็อกและไฟล์ปกติได้แสวงหา ไดเรกทอรีนั้นแปลกจริง ๆ (การเขียนไม่ทำงานและหากการอ่านใช้งานได้จะไม่มีประโยชน์) การปรากฏตัวของวิธีการพิเศษไม่ได้หมายความว่าสิ่งเหล่านี้ไม่ได้เป็นส่วนหนึ่งของหมวดหมู่ทั่วไปของสิ่งที่เราเรียกว่า "ไฟล์"

27

เหตุผลที่ว่าทำไม TCP / IP ซ็อกเก็ตอธิบายการใช้งานไฟล์คือเมื่ออินเตอร์เฟซซ็อกเก็ตได้รับการออกแบบครั้งแรกและดำเนินการ ( ใน BSD Unix, ในปี 1983 ) นักออกแบบของความรู้สึกว่าการเชื่อมต่อเครือข่ายที่เป็นคล้ายกับไฟล์ - คุณสามารถread, writeและcloseทั้งสอง และมันจะเข้ากันได้ดีกับแนวคิด Unix ของ "ทุกอย่างเป็นไฟล์"

อื่น ๆ TCP / IP การใช้งานเครือข่ายสแต็คไม่จำเป็นต้องทำงานร่วมกับระบบปฏิบัติการของไฟล์ I / O ระบบย่อยตัวอย่างเป็นMacTCP แต่เนื่องจากส่วนต่อประสานซ็อกเก็ต BSD นั้นได้รับความนิยมอย่างมากแม้แต่การนำไปใช้งานอื่น ๆ เหล่านี้ก็เลือกที่จะทำซ้ำซ็อกเก็ต API ด้วยฟังก์ชั่น Unix ที่เหมือนกันดังนั้นคุณจึงได้ "file descriptors" ใช้สำหรับการสื่อสาร TCP / IP เท่านั้น มีตัวอธิบายไฟล์

ส่วนอื่น ๆ ของคำถามของคุณคือทำไมมีข้อ จำกัด ? เป็นเพราะวิธีที่เร็วที่สุดในการใช้ตารางการค้นหาไฟล์ descriptor คือการใช้อาเรย์ ในอดีตข้อ จำกัด นั้นถูกเข้ารหัสไว้อย่างหนักในเคอร์เนล

นี่คือรหัสใน Unix รีลีส 7 (1979) พร้อมตัวอธิบายไฟล์ จำกัด 20 ไฟล์ต่อกระบวนการ:

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

โดยการเปรียบเทียบลีนุกซ์จัดสรรพื้นที่สำหรับตารางตัวให้คำอธิบายไฟล์ของกระบวนการแบบไดนามิก ขีด จำกัด สัมบูรณ์มีค่าเริ่มต้นที่ 8192 แต่คุณสามารถตั้งค่านี้เป็นสิ่งที่คุณต้องการ /proc/sys/fs/file-maxรายการระบบของฉันใน 191072

แม้ว่าจะไม่มีขีด จำกัด แน่นอนใน Linux อีกแล้ว แต่เราไม่ต้องการให้โปรแกรมเป็นบ้าดังนั้นผู้ดูแลระบบ (หรือผู้จัดจำหน่ายแพ็กเกจ) มักจะตั้งค่าขีด จำกัด ของทรัพยากร ลองดูที่หรือเรียกใช้/etc/security/limits.confulimit -n


หนึ่งในคำตอบที่ดีที่สุดในหัวข้อนี้ขอบคุณ
user859375

6

ไฟล์ไม่ใช่แค่ไฟล์บนดิสก์หรือในหน่วยความจำ มันเป็นสตรีมของข้อมูลซึ่งเป็นเพียงสองตัวอย่าง

ปลายทางระยะไกลเป็นตัวอย่างที่สามและคุณโต้ตอบกับผู้ที่ใช้ซ็อกเก็ต


2
ยินดีต้อนรับสู่ U & L.SE ฉันชอบคำตอบนี้
eyoung100
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.