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


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.