ความแตกต่างระหว่างซ็อกเก็ตและพอร์ต


121

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


9
พอร์ตเป็นที่อยู่จริงในขณะที่ซ็อกเก็ตเป็นวัตถุ
superM

14
ถ้าแพ็คเก็ตกระทบกระเป๋าในซ็อกเก็ตบนพอร์ต ...
user16764

คำตอบ:


116

Sเป็นโปรแกรมเซิร์ฟเวอร์: สมมติว่าเป็นเซิร์ฟเวอร์ HTTP ดังนั้นจะใช้หมายเลขพอร์ตที่รู้จักกันดีสำหรับHTTPซึ่งก็คือ 80 ฉันใช้งานบนโฮสต์ที่มีที่อยู่ IP 10.0.0.4ดังนั้นมันจะฟังการเชื่อมต่อ10.0.0.4:80(เพราะ นั่นคือสิ่งที่ทุกคนคาดหวังว่าจะพบมัน)

ภายในSฉันจะสร้างซ็อกเก็ตและผูกไว้กับที่อยู่นั้น: ตอนนี้ระบบปฏิบัติการรู้ว่าการเชื่อมต่อที่เข้ามา10.0.0.4:80ควรจะถูกส่งไปยังกระบวนการSของฉันผ่านซ็อกเก็ตนั้น

  • netstat output เมื่อซ็อกเก็ตถูกผูกไว้:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    

    NB ที่อยู่ในพื้นที่เป็นศูนย์ทั้งหมดเนื่องจากSไม่สนใจว่าลูกค้าจะเข้าถึงได้อย่างไร

เมื่อSมีซ็อกเก็ตนี้ถูกผูกไว้มันจะยอมรับการเชื่อมต่อ - ในแต่ละครั้งที่ไคลเอนต์ใหม่เชื่อมต่อacceptส่งคืนซ็อกเก็ตใหม่ซึ่งเฉพาะกับไคลเอ็นต์นั้น

  • netstat เอาต์พุตเมื่อยอมรับการเชื่อมต่อ:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    tcp        0      0 10.0.0.4:80                 10.0.0.5:55715             ESTABLISHED
    
    • 10.0.0.4:80แสดงให้เห็นถึงSสิ้น 's ของการเชื่อมต่อและมีความเกี่ยวข้องกับซ็อกเก็ตที่ส่งกลับโดยaccept
    • 10.0.0.5:55715เป็นจุดสิ้นสุดของลูกค้าของการเชื่อมต่อและมีความเกี่ยวข้องกับซ็อกเก็ตลูกค้าที่ส่งผ่านไปเชื่อมต่อ พอร์ตของไคลเอ็นต์ไม่ได้ใช้สำหรับสิ่งใดนอกจากการกำหนดเส้นทางแพ็คเก็ตในการเชื่อมต่อ TCP นี้ไปยังกระบวนการที่ถูกต้อง: จะถูกกำหนดแบบสุ่มโดยเคอร์เนลของลูกค้าจากช่วงพอร์ตชั่วคราว

ตอนนี้Sสามารถรับการเชื่อมต่อไคลเอนต์เพิ่มเติมได้อย่างมีความสุข ... แต่ละคนจะได้รับซ็อกเก็ตของตนเองแต่ละซ็อกเก็ตจะเชื่อมโยงกับการเชื่อมต่อ TCP ที่ไม่ซ้ำกันและการเชื่อมต่อแต่ละรายการจะมีที่อยู่ระยะไกลที่ไม่ซ้ำกัน Sจะติดตามสถานะลูกค้า (หากมี) โดยเชื่อมโยงกับซ็อกเก็ต

ดังนั้นประมาณ:

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

1
@ ไม่มีประโยชน์มันเป็นมูลค่าการกล่าวขวัญซ็อกเก็ตไม่จำเป็นต้องเป็น IP ตามคำตอบที่ระบุ มันไม่ได้เกี่ยวข้องกับ OP อย่างแน่นอน แต่คำอธิบายของตระกูลซ็อคเก็ตจะช่วยตอบคำถามนี้ได้
hafichuk

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

11
สิ่งนี้ไม่ไร้ประโยชน์เลย
l

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

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

49

คิดว่าเครื่องจักรของคุณเป็นอาคารอพาร์ตเมนต์:

  • พอร์ตคือหมายเลขอพาร์ตเมนต์

  • ซ็อกเก็ตเป็นประตูของอพาร์ตเมนต์

  • ที่อยู่ IP คือที่อยู่ถนนของอาคาร


3
ฉันชอบความคล้ายคลึงนี้แม้ว่าตอนนี้ฉันกำลังคิดที่จะอยู่ในอพาร์ทเมนต์นั้นดูทางเดินที่ไม่มีที่สิ้นสุดพร้อมประตูมากมาย ฉันออกไปไม่ได้ ฉันออกไปไม่ได้! :)
Daniel Hollinrake

1
@Caleb A socket is the door of an apartment.แต่ไม่มีซ็อกเก็ตจำนวนมากที่เปิดที่พอร์ตเดียวใช่ไหม
Suhail Gupta

3
@suhail บางครั้งอพาร์ทเมนท์มีมากกว่าหนึ่งประตู พวกเขาทั้งหมดมีหมายเลขอพาร์ตเมนต์เหมือนกัน แต่พวกเขาต่างกัน
Caleb

45

พอร์ตเป็นส่วนหนึ่งของที่อยู่ในโปรโตคอล TCP และ UDP มันถูกใช้เพื่อช่วยให้ OS ระบุว่าแอปพลิเคชันใดควรได้รับข้อมูลที่ได้รับ ระบบปฏิบัติการจะต้องรองรับพอร์ตต่าง ๆ เพื่อรองรับ TCP และ UDP เนื่องจากพอร์ตนั้นเป็นส่วนที่อยู่ภายในของ TCP และ UDP

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


ซ็อกเก็ตนั้นเป็น tuple 4 ตัวซึ่งประกอบด้วย: Source IP: Port-Dest IP: Port
Tony The Lion

คุณหมายถึงว่าพอร์ตนั้นมีอยู่ในโปรโตคอล TCP และ UDP เท่านั้น ??? แล้ว http และโปรโตคอลอื่นล่ะ?
H. Aqjn

HTTP เป็นโปรโตคอลชั้นแอปพลิเคชันที่ทำงานด้านบนของโปรโตคอลเลเยอร์การขนส่งเช่น TCP หรือ UDP มันไม่มีแนวคิดของพอร์ตของตัวเองมันสืบทอดมาจากโปรโตคอลเลเยอร์การส่งข้อมูลพื้นฐาน
Dirk Holsopple

8

คอมพิวเตอร์มีที่อยู่ IP ที่ระบุว่าเป็นนิติบุคคลแยกต่างหากในเครือข่าย เราเพิ่มหมายเลขเพิ่มเติมเพื่อให้เราสามารถแยกความแตกต่างระหว่างการเชื่อมต่อกับคอมพิวเตอร์เครื่องนั้น นี่คือหมายเลขพอร์ต ที่ด้าน OS ของการเชื่อมต่อที่คุณต้องการบัฟเฟอร์สถานะการเชื่อมต่อ ฯลฯ วัตถุตรรกะนี้เป็นซ็อกเก็ต


0

ซ็อกเก็ตเป็นเส้นทางการสื่อสารไปยังพอร์ต เมื่อคุณต้องการให้โปรแกรมสื่อสารผ่านเครือข่ายคุณได้กำหนดวิธีการจัดการกับพอร์ตและทำได้โดยการสร้างซ็อกเก็ตและเชื่อมต่อกับพอร์ต โดยทั่วไป socket = IP + ports Sockets ให้การเข้าถึงพอร์ต + ip


-1

ที่อยู่ IP จะระบุอุปกรณ์เช่นที่อยู่ไปยังอุปกรณ์นั้น ๆ เมื่อคุณมาถึงเครื่องโดยใช้ IP ตอนนี้พอร์ตจะกำหนดกระบวนการที่เครื่องสื่อสารสื่อสาร

ดังนั้นสำหรับการสื่อสารที่เกิดขึ้นจริงคุณต้องมีทั้งพอร์ต + IP ซึ่งเรียกว่าซ็อกเก็ต

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