ซ็อกเก็ตทั่วไปคืออะไรและเกี่ยวข้องกับอุปกรณ์เครือข่ายอย่างไร


9

ฉันพยายามที่จะเข้าใจว่าไดรเวอร์เครือข่ายทำงานภายใต้ Linux อย่างไร คำถาม & คำตอบนี้แสดงให้เห็นว่าอุปกรณ์เครือข่ายใน Linux ไม่ได้แสดงอยู่ในไฟล์อุปกรณ์ socketsมันระบุว่าไดรเวอร์เครือข่ายการทำงานร่วมกับ

ตัวอย่างเช่นสิ่งนี้อ้างอิงถึงวิธีการตั้งค่าอุปกรณ์เครือข่ายผ่านการioctlโทร ioctlอย่างไรก็ตามจำเป็นต้องมี file descriptorเนื่องจากไม่มีไฟล์อุปกรณ์สำหรับไดรเวอร์เครือข่ายไฟล์ descriptor เดียวที่สามารถส่งผ่านได้คือไฟล์จากซ็อกเก็ต

นี่นำฉันมาสู่ประเด็นของคำถาม จนถึงตอนนี้ดูเหมือนว่าอินเทอร์เฟซเครือข่ายซึ่งจะเป็นตัวแทนซอฟต์แวร์ของการ์ดเครือข่ายที่มีอยู่จริงเป็นวัตถุที่ด้อยกว่าซ็อกเก็ต

  • แต่ซ็อกเก็ตคืออะไรในแง่นามธรรมนี้มันเป็นเพียงชื่ออื่นสำหรับไฟล์อุปกรณ์ที่รองรับการแจ้งเตือนแบบพุช ฉันเข้าใจซ็อกเก็ต TCP ในแง่ของจุดเชื่อมต่อที่ผูกไว้โดยแอพ userspace กับที่อยู่: จับคู่พอร์ตบนอินเตอร์เฟสเครือข่าย ฉันไม่เข้าใจซ็อกเก็ตเป็นสิ่งที่จำเป็นต้องมีเพื่อตั้งค่าอินเทอร์เฟซเครือข่าย

  • สามารถเชื่อมต่อเครือข่ายบน Linux (เช่นที่eth0อยู่ในรายการifconfig) โดยไม่มีซ็อกเก็ตได้หรือไม่?

  • ifconfigหรือผู้จัดการเครือข่าย daemon เปิดซ็อกเก็ตไว้หรือไม่เพื่อให้เราสามารถตั้งค่าตัวเลือกส่วนต่อเครือข่ายได้


คำตอบ:


6

ลองทบทวนอย่างรวดเร็วแฟ้มอุปกรณ์: ในลินุกซ์, โปรแกรมสื่อสาร RAD และเขียนการดำเนินงานเพื่อเคอร์เนลผ่านอธิบายไฟล์ ใช้งานได้ดีกับไฟล์และปรากฎว่าสามารถใช้ API เดียวกันสำหรับอุปกรณ์อักขระที่สร้างและใช้งานสตรีมของตัวละครและอุปกรณ์บล็อกที่อ่านและเขียนบล็อกที่มีขนาดคงที่ที่ที่อยู่การเข้าถึงแบบสุ่มเพียงทำท่าว่า ยังเป็นไฟล์

แต่จำเป็นต้องมีวิธีในการกำหนดค่าอุปกรณ์เหล่านั้น (ตั้งค่าอัตรารับส่งข้อมูล ฯลฯ ) และสำหรับสิ่งนั้นการเรียกใช้ioctlถูกประดิษฐ์ขึ้น มันเพิ่งผ่านโครงสร้างข้อมูลที่เฉพาะเจาะจงกับอุปกรณ์และชนิดของการควบคุม I / O ที่ใช้กับเคอร์เนลและได้รับผลลัพธ์กลับมาในโครงสร้างข้อมูลเดียวกันดังนั้นจึงเป็น API ที่สามารถขยายได้ทั่วไปและสามารถใช้กับสิ่งต่างๆมากมาย .

ตอนนี้การดำเนินงานเครือข่ายเหมาะสมอย่างไร แอปพลิเคชันเซิร์ฟเวอร์เครือข่ายทั่วไปต้องการผูกกับที่อยู่เครือข่ายบางฟังพอร์ตที่แน่นอน (เช่น 80 สำหรับ HTTP หรือ 22 สำหรับ ssh) และหากลูกค้าเชื่อมต่อมันต้องการส่งข้อมูลไปและรับข้อมูลจากลูกค้านี้ และการดำเนินงานคู่สำหรับลูกค้า

มันไม่ได้เป็นที่เห็นได้ชัดว่าเพื่อให้พอดีกับในการดำเนินงานไฟล์ (แม้ว่ามันจะสามารถทำได้ดูแผน 9 ) นั่นเป็นเหตุผลที่นักออกแบบที่ใช้ระบบปฏิบัติการยูนิกซ์คิดค้นใหม่ API: ซ็อกเก็ต คุณสามารถหารายละเอียดในส่วนที่ 2 หน้าคนสำหรับsocket, bind, listen, connect, และsend recvโปรดทราบว่าในขณะที่มันแตกต่างจากไฟล์ I / O API การsocketโทรจะส่งคืนไฟล์ descriptor มีบทเรียนมากมายเกี่ยวกับวิธีการใช้ซ็อกเก็ตบนเว็บ google เล็กน้อย

จนถึงตอนนี้ทั้งหมดเป็น UNIX ที่บริสุทธิ์ไม่มีใครพูดถึงส่วนต่อประสานเครือข่าย ณ เวลาที่มีการคิดค้นซ็อกเก็ต และเนื่องจาก API นี้เก่าจริง ๆ มันถูกกำหนดไว้สำหรับโปรโตคอลเครือข่ายที่หลากหลายนอกเหนือจากอินเทอร์เน็ตโปรโตคอล (ดูAF_*ค่าคงที่) แม้ว่าจะมีเพียงไม่กี่แห่งเท่านั้นที่ได้รับการสนับสนุนใน Linux

แต่เมื่อคอมพิวเตอร์เริ่มได้รับการ์ดเครือข่ายหลายใบสิ่งที่เป็นนามธรรมนี้ก็จำเป็น ใน Linux นั่นคืออินเตอร์เฟสเครือข่าย (NI) มันไม่ได้ใช้สำหรับฮาร์ดแวร์เพียงอย่างเดียว แต่ยังใช้สำหรับช่องสัญญาณต่าง ๆ จุดสิ้นสุดแอปพลิเคชันผู้ใช้ที่เซิร์ฟเวอร์เป็นช่องทางเช่น OpenVPN เป็นต้นตามที่อธิบายไว้ซ็อกเก็ต API ไม่ได้ขึ้นอยู่กับไฟล์ (พิเศษ) และเป็นอิสระจากระบบไฟล์ ในทำนองเดียวกันอินเตอร์เฟสเครือข่ายจะไม่ปรากฏในระบบไฟล์เช่นกัน อย่างไรก็ตาม NIs นั้นพร้อมใช้งานใน/procและ/sysระบบไฟล์ (รวมถึง tunables เครือข่ายอื่น ๆ )

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

แต่จะต้องมีวิธีการตั้งค่า NIs เช่นเดียวกับที่คุณต้องการวิธีการกำหนดค่าอุปกรณ์บล็อกและอักขระ และเนื่องจากซ็อกเก็ตส่งคืนไฟล์ descriptor แล้วจึงค่อนข้างมีเหตุผลที่จะยอมให้ioctlfile descriptor นั้น นั่นคืออินเทอร์เฟซnetdevice ที่คุณเชื่อมโยง

มีการละเมิดสิทธิอื่น ๆ ของการเรียกใช้ระบบในลักษณะเดียวกันเช่นการกรองแพ็คเก็ตการดักจับแพ็คเก็ตเป็นต้น

ทั้งหมดนี้ได้เติบโตขึ้นหลังจากนั้นเป็นชิ้น ๆ และไม่ได้มีเหตุผลโดยเฉพาะในหลาย ๆ ที่ ถ้ามันได้รับการออกแบบทั้งหมดในครั้งเดียวอาจจะทำให้ orthogonal API มากขึ้น


Sockets as the network communications API were already not represented in the filesystem, so the NI didn't get one, either.นี่คือการพิมพ์ผิดหรือไม่?
TheMeaningfulEngineer

ส่วนไหนที่คุณคิดว่าเป็นตัวพิมพ์ผิด? ซ็อกเก็ตธรรมดาไม่มีชื่อไฟล์หรือ inode ที่เกี่ยวข้อง (ซ็อกเก็ตของโดเมน Unix มี)
dirkt

ฉันแค่ไม่เข้าใจความหมายประโยคขออภัยจึงต้องการตรวจสอบอีกครั้ง
TheMeaningfulEngineer

ขออภัยฉันไม่ใช่เจ้าของภาษาอังกฤษ ฉันพยายามที่จะใช้ถ้อยคำใหม่ตอนนี้มันง่ายกว่าที่จะเข้าใจหรือไม่?
dirkt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.