ลองทบทวนอย่างรวดเร็วแฟ้มอุปกรณ์: ในลินุกซ์, โปรแกรมสื่อสาร 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 แล้วจึงค่อนข้างมีเหตุผลที่จะยอมให้ioctl
file descriptor นั้น นั่นคืออินเทอร์เฟซnetdevice ที่คุณเชื่อมโยง
มีการละเมิดสิทธิอื่น ๆ ของการเรียกใช้ระบบในลักษณะเดียวกันเช่นการกรองแพ็คเก็ตการดักจับแพ็คเก็ตเป็นต้น
ทั้งหมดนี้ได้เติบโตขึ้นหลังจากนั้นเป็นชิ้น ๆ และไม่ได้มีเหตุผลโดยเฉพาะในหลาย ๆ ที่ ถ้ามันได้รับการออกแบบทั้งหมดในครั้งเดียวอาจจะทำให้ orthogonal API มากขึ้น