ซ็อกเก็ตคืออะไร?


49

ใครช่วยอธิบายให้ฉันรู้ว่าซ็อกเก็ตคืออะไร? ฉันเห็นมันในหลาย ๆ คำย่อในบริบทของ SSL เป็นต้น

ทำไมมันถึงเรียกว่าซ็อกเก็ต? มันล้วนๆเพราะเป็นชื่อที่พวกเขาคิดค้น? หรือเป็นชื่อแรกที่พวกเขาสร้างขึ้นมาด้วย?


9
ในแง่ของคนธรรมดา: ซ็อกเก็ตเป็นโทรศัพท์ เป็นสิ่งที่คุณถือไว้ในมือซึ่งทำให้คุณสามารถสนทนากับโทรศัพท์เครื่องอื่นได้ การเปรียบเทียบแตกย่อยเพียงเล็กน้อย: การสนทนาทางโทรศัพท์ส่วนใหญ่เป็นแบบเพื่อนต่อเพื่อน การเชื่อมต่อซ็อกเก็ตเป็นไคลเอนต์ไปยังเซิร์ฟเวอร์ ไคลเอ็นต์ (เช่น แต่ไม่ จำกัด เฉพาะซอฟต์แวร์เวิร์กสเตชันเช่นเบราว์เซอร์) เชื่อมต่อกับเซิร์ฟเวอร์ (เช่นเว็บเซิร์ฟเวอร์ไฟล์เซิร์ฟเวอร์เซิร์ฟเวอร์การตรวจสอบความถูกต้องหรืออื่น ๆ ) ข้อบกพร่องอื่นในการเปรียบเทียบ: เมื่อคุณปิดการเชื่อมต่อซ็อกเก็ตซ็อกเก็ตจะถูกทำลายและคุณต้องสร้างซ็อกเก็ตใหม่ก่อนที่คุณจะสามารถสร้างการเชื่อมต่อใหม่
G-Man

มันไม่เลวสำหรับการเปรียบเทียบ เซิร์ฟเวอร์เป็นเพียงศูนย์บริการและสามารถมีการโทรหลายร้อยครั้งในคราวเดียว
MSalters

คำตอบ:


42

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

คู่มือ Beej ในการเขียนโปรแกรมเครือข่ายและการสื่อสารระหว่างกระบวนการทั้งสองมีข้อมูลที่ดีเกี่ยวกับวิธีการใช้ซ็อกเก็ตและแม้กระทั่งการตอบคำถามนี้แน่นอน


64

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

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

ในที่สุดมันเป็นเรื่องปกติสำหรับโปรแกรมบนเครื่องเดียวที่จะสื่อสารโดยใช้โปรโตคอลเครือข่ายมาตรฐานเช่น TCP; มันจะเป็นการสิ้นเปลืองที่จะไปถึงฮาร์ดแวร์เครือข่าย (ถ้ามี!), การตรวจสอบการคำนวณ ฯลฯ เพื่อกลับไปยังโฮสต์เดียวกัน: นั่นคือที่ซ็อกเก็ตโดเมนของ Unix เข้ามาพวกมันเหมือนกับซ็อกเก็ตทั่วไปยกเว้น พวกเขาเชื่อมต่อกระบวนการในโฮสต์เดียวกันมากกว่ากระบวนการระยะไกลและอย่าพยายามใช้ทรัพยากรเครือข่ายใด ๆ เลย ด้วยวิธีนี้พวกเขาเป็นสื่อกลางของการสื่อสารระหว่างกระบวนการ

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


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

@tripleee: นั่นเป็นจุดประวัติศาสตร์ที่ยอดเยี่ยม สนใจที่จะให้การอ้างอิง?
dhag

googling อย่างรวดเร็วเปลี่ยนหน้า 40 ในการออกแบบและการใช้งานระบบปฏิบัติการ FreeBSD ; ข้อความกล่าวถึงการเปลี่ยนแปลงนี้ใน 4.2BSD แต่ยังชี้แจงว่านี่ไม่ใช่วิธีที่ทำไปแล้วอีกต่อไปด้วยเหตุผลด้านประสิทธิภาพ
tripleee

ยอดเยี่ยมฉันจะเพิ่มคำตอบของฉัน
dhag

คำตอบเทคโนที่ดีที่สุดในทั้งหมด
chaosguru

7

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

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

สำหรับเหตุผลที่พวกเขาถูกเรียกว่า 'ซ็อกเก็ต' เป็นอย่างดีความคิดที่ว่านักประดิษฐ์จะเรียกมันว่าอะไรก็ตามที่พวกเขาต้องการอาจมีบทบาทใหญ่ในนั้น แม้ว่ามันไม่ใช่ชื่อที่ไม่ดีในความคิดของฉัน :)


7

ตอนนี้มันคืออะไร

ซ็อกเก็ตหรือ "ซ็อกเก็ต" อาจมีหลายสิ่ง:

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

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

คุณไม่จำเป็นต้องรู้ (และคุณไม่ต้องการที่จะรู้ด้วย!) ไม่ว่าคุณจะพูดคุยกับโปรแกรมอื่นบนคอมพิวเตอร์เครื่องเดียวกันหรือบนคอมพิวเตอร์เครื่องอื่นหรือว่ามีเครือข่าย IPv4 หรือ IPv6 อยู่ระหว่างคอมพิวเตอร์เหล่านั้น โปรโตคอลที่คุณไม่เคยได้ยิน

socketเป็นชื่อของฟังก์ชันไลบรารี (หรือ syscall) ซึ่งสร้าง"ซ็อกเก็ต " ซึ่งเป็นไฟล์ชนิดพิเศษ (ทุกอย่างใน Unix เป็นไฟล์)

มันเปรียบเทียบกับ ...

ซ็อกเก็ตจัดอยู่ในประเภทเดียวกันกับไพพ์และไพพ์เนม

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

ชื่อท่อคือดีเพียงท่อซึ่งเป็นเจ้าของชื่อในระบบแฟ้มที่ นั่นคือมันเป็นสิ่งที่มีลักษณะและมีลักษณะเหมือนกับไฟล์มันปรากฏในรายชื่อไดเรกทอรีและคุณสามารถเปิดเขียนมัน ฯลฯ ฯลฯ โปรดทราบว่าคุณยังสามารถสร้างไฟล์พิเศษของซ็อกเก็ต (ซึ่งจะเป็นซ็อกเก็ตที่มีชื่อ) .

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

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

บางครั้งการสื่อสารระหว่างกระบวนการที่กล่าวถึงเกี่ยวกับเครือข่าย

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


1

สำหรับ udp หรือ tcp over IP

ที่อยู่ซ็อกเก็ตคือการรวมกันของที่อยู่ IP และหมายเลขพอร์ต

ที่อยู่ IP คือที่อยู่ของเครื่องบนอินเทอร์เน็ตเช่น unix.stackexchange.com has address 198.252.206.140

อย่างไรก็ตามเครื่องแต่ละเครื่องจะต้องสามารถให้บริการได้มากกว่าหนึ่งบริการดังนั้นเครื่องส่วนใหญ่จะให้ http (หน้าเว็บ) บนพอร์ต 80 และ ssh บนพอร์ต 22 และอื่น ๆ

ดังนั้นunix.stackexchange.com:80พอร์ต80ของunix.stackexchange.com(ซ็อกเก็ต) จึงเป็นจุดเข้าใช้งานของเว็บไซต์นี้

อย่างไรก็ตามมีซ็อกเก็ตประเภทอื่น ๆ ดูความคิดเห็นด้านล่าง


5
tcp / ip เป็นซ็อกเก็ตชนิดเดียวเท่านั้น มีคนอื่นที่ไม่มีส่วนเกี่ยวข้องกับ tcp / ip
psusi

มีซ็อกเก็ตประเภทต่าง ๆ กี่อัน
Abdul Al Hazred

1
@AbdulAlHredred ฉันรู้ว่ามีสี่ประเภททั่วไปที่ใช้กับเครือข่าย ip เหมือนกันกับ ip6 สองกับ unix และสองกับ IPX ฉันไม่ได้ดู ax25, atm หรือ appletalk มีโปรโตคอลอื่นที่รองรับบน linux และมีโปรโตคอลที่ไม่รองรับ linux ในกรณีส่วนใหญ่แต่ละโปรโตคอลจะมีซ็อกเก็ตสตรีม (tcp) และดาตาแกรม (udp) ซ็อกเก็ตแบบ Raw ก็เป็นเรื่องธรรมดาและ imcp ก็อาจมีส่วนต่อประสานกับซ็อกเก็ต
hildred

ประเด็นคือคำตอบนี้ไม่สมบูรณ์ซึ่งครอบคลุมเฉพาะซ็อกเก็ตประเภทหนึ่งเท่านั้นและทำให้เข้าใจผิดว่าซ็อกเก็ตทั่วไปเหมือนกับซ็อกเก็ตเครือข่ายเสมอและซ็อกเก็ต IP ( AF_INET) โดยเฉพาะ
tripleee

0

ฉันเชื่อว่าคุณถามเรื่องระบบเครือข่าย ดังนั้นบริการ TCP จึงใช้ซ็อกเก็ตเป็นจุดสำหรับการสื่อสารและประกอบด้วย IP address, โปรโตคอลและหมายเลขพอร์ต

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