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


928

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


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

คำตอบ:


976

สรุป

ซ็อกเก็ต TCP เป็นอินสแตนซ์ปลายทางที่กำหนดโดยที่อยู่ IP และพอร์ตในบริบทของการเชื่อมต่อ TCP โดยเฉพาะหรือสถานะการฟัง

พอร์ตคือตัวบ่งชี้ virtualisation ที่กำหนดจุดสิ้นสุดของบริการ (แตกต่างจากจุดสิ้นสุดของอินสแตนซ์ของบริการเช่น aka ตัวระบุเซสชัน)

ซ็อกเก็ต TCP ไม่ใช่การเชื่อมต่อแต่เป็นจุดสิ้นสุดของการเชื่อมต่อที่ระบุ

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

สามารถมีซ็อกเก็ตรับฟังได้เพียงซ็อกเก็ตเดียวสำหรับที่อยู่ / พอร์ตที่ระบุ

นิทรรศการ

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

ในแง่ที่กว้างที่สุดที่เป็นไปได้พอร์ตคือจุดเข้าหรือออก แม้ว่าจะไม่ได้ใช้ในบริบทของเครือข่าย แต่คำว่าporteภาษาฝรั่งเศสหมายถึงประตูหรือเกตเวย์อย่างแท้จริงเน้นความจริงที่ว่าพอร์ตนั้นเป็นปลายทางของการขนส่งไม่ว่าคุณจะส่งข้อมูลหรือบรรจุเหล็กขนาดใหญ่

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

การรวมกันของที่อยู่ IP และพอร์ตเป็นที่รู้จักกันอย่างเคร่งครัดว่าเป็นปลายทางและบางครั้งเรียกว่าซ็อกเก็ต การใช้งานนี้มาพร้อมกับ RFC793 ข้อมูลจำเพาะ TCP ดั้งเดิม

เครือข่าย TCP การเชื่อมต่อจะถูกกำหนดโดยสองจุดสิ้นสุด aka ซ็อกเก็ต

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

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

เป็นคู่ซ็อกเก็ต (4-tuple ที่ประกอบด้วยที่อยู่ IP ของลูกค้าหมายเลขพอร์ตไคลเอนต์ที่อยู่ IP ของเซิร์ฟเวอร์และหมายเลขพอร์ตของเซิร์ฟเวอร์) ที่ระบุจุดสิ้นสุดสองจุดที่ระบุการเชื่อมต่อ TCP แต่ละตัวในอินเทอร์เน็ตโดยเฉพาะ ( TCP-IP Illustrated Volume 1 , W. Richard Stevens)

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

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

ทั้งหมดนี้ค่อนข้างสับสนและทำให้คุณเชื่อว่าซ็อกเก็ตคือการเชื่อมต่อซึ่งเป็นสิ่งที่ล็อค ฉันทำงานหนักภายใต้การเข้าใจผิดนี้จนกระทั่ง Richard Dorman ถามคำถาม

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

ความชัดเจนจะได้รับการปรับปรุงในด้านอื่น ๆ เช่นกัน ซ็อกเก็ตไม่ได้ระบุโดยการรวมกันของที่อยู่ IP และพอร์ต:

[... ] TCP แยกส่วนเซกเมนต์ที่เข้ามาโดยใช้ค่าทั้งสี่ที่ประกอบด้วยที่อยู่ภายในและภายนอก: ที่อยู่ IP ปลายทางหมายเลขพอร์ตปลายทางที่อยู่ IP ต้นทางและหมายเลขพอร์ตต้นทาง TCP ไม่สามารถระบุได้ว่ากระบวนการใดได้รับเซ็กเมนต์ขาเข้าโดยดูที่พอร์ตปลายทางเท่านั้น นอกจากนี้หนึ่งในปลายทาง [ต่าง ๆ ] ที่ [หมายเลขพอร์ตที่กำหนด] ที่จะได้รับการร้องขอการเชื่อมต่อที่เข้ามาคือสิ่งที่อยู่ในสถานะ Listen (p255, TCP-IP Illustrated Volume 1 , W. Richard Stevens)

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

Hagrawal ไม่เชื่อฉัน (ดูความคิดเห็น) ดังนั้นนี่คือตัวอย่างจริง ฉันจะเชื่อมต่อเว็บเบราเซอร์เพื่อhttp://dilbert.comnetstat -an -p tcpแล้ววิ่ง หกบรรทัดสุดท้ายของเอาต์พุตมีสองตัวอย่างของข้อเท็จจริงที่ว่าที่อยู่และพอร์ตไม่เพียงพอที่จะระบุซ็อกเก็ตโดยเฉพาะ มีการเชื่อมต่อที่แตกต่างกันสองแบบระหว่าง 192.168.1.3 (เวิร์กสเตชันของฉัน) และ 54.252.94.236:80 (เซิร์ฟเวอร์ HTTP ระยะไกล)

  TCP    192.168.1.3:63240      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63241      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63242      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:63243      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:64161      65.54.225.168:443      ESTABLISHED

ตั้งแต่ซ็อกเก็ตเป็นปลายทางของการเชื่อมต่อที่มีสองซ็อกเก็ตด้วยการรวมกันอยู่ / พอร์ตและอีกสองด้วยการรวมกันอยู่207.38.110.62:80 / พอร์ต54.252.94.236:80

ฉันคิดว่าความเข้าใจผิดของ Hagrawal เกิดขึ้นจากการใช้คำว่า "ระบุ" อย่างระมัดระวัง ฉันหมายถึง "สมบูรณ์ระบุได้อย่างชัดเจนและไม่ซ้ำกัน" 54.252.94.236:80ในตัวอย่างข้างต้นมีสองจุดสิ้นสุดด้วยการรวมกันอยู่ / พอร์ต หากทั้งหมดที่คุณมีคือที่อยู่และพอร์ตคุณไม่มีข้อมูลเพียงพอที่จะบอกซ็อกเก็ตเหล่านี้ได้ ข้อมูลไม่เพียงพอที่จะระบุซ็อกเก็ต

ภาคผนวก

วรรคสองของส่วน 2.7 ของ RFC793 กล่าว

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

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

อ้างอิง

  1. TCP-IP Illustrated Volume 1 โปรโตคอล , W. Richard Stevens, 1994 Addison Wesley

  2. RFC793สถาบันวิทยาการสารสนเทศมหาวิทยาลัยเซาเทิร์นแคลิฟอร์เนียสำหรับ DARPA

  3. RFC147 , นิยามของซ็อกเก็ต, โจเอลเอ็ม. วินเน็ท, ห้องปฏิบัติการลินคอล์น


6
บางทีโลกแห่งความเป็นจริงคล้ายคลึงกับซ็อกเก็ตคำหลักและพอร์ตจะช่วยให้ผู้ที่โหวตคำถามขึ้นมา ยังเป็นคำอธิบายที่ดีมาก!
rohitverma

5
@rationalcoder - อ่านคำตอบทั้งหมด มีความแตกต่างระหว่างการถูกกำหนดโดยบางสิ่งและการถูกระบุโดยมัน ตัวอย่างเช่นอินสแตนซ์ของคลาสที่ถูกกำหนดโดยคลาส ส่วนหนึ่งเป็น แต่ไม่ได้ระบุอย่างสมบูรณ์
Peter Wone

6
ฉันไม่ได้ลงคะแนนเพราะฉันไม่เห็นด้วยกับข้อความนี้ - " ซ็อกเก็ตไม่ได้ระบุโดยการรวมกันของที่อยู่ IP และพอร์ต: " .. อ่าน TCP RFC - tools.ietf.org/html/rfc793 .. มันชัดเจนมากว่า ซ็อกเก็ตคือการรวมกันของ IP และพอร์ตถ้าคุณรู้ว่า IP และพอร์ตแล้วคุณได้ระบุซ็อกเก็ตหรือจุดสิ้นสุดถ้าคุณรู้ว่าคู่ของซ็อกเก็ตเช่นลูกค้า IP + พอร์ตและเซิร์ฟเวอร์ IP + พอร์ตแล้วคุณได้ระบุการเชื่อมต่อที่ไม่ซ้ำกัน ..
hagrawal

6
"ในตัวอย่างข้างต้นมีจุดสิ้นสุดสองจุดที่มีที่อยู่ / พอร์ตรวมกัน 54.252.94.236:80 ถ้าคุณมีที่อยู่และพอร์ตคุณไม่มีข้อมูลเพียงพอที่จะบอกซ็อกเก็ตเหล่านี้แยกกัน เบ้า." ไม่ใช่ซ็อกเก็ตเดียวกัน แต่เป็นการเชื่อมต่อที่แตกต่างกันระหว่างการเชื่อมต่อสองรายการที่คุณมี 3 ซ็อกเก็ต 2 โลคัลและ 2 ซ็อกเก็ตเซิร์ฟเวอร์เดียวกันที่เชื่อมต่ออยู่ หรืออันที่จริงแล้วมีซ็อกเก็ตสองตัวที่แตกต่างกันหรือไม่ จะไม่มีการบอกพวกเขาแยกเพราะพวกเขาเหมือนกัน แต่เพื่อบอกความเชื่อมโยงกันคุณจะต้องใช้ซ็อกเก็ตในท้องถิ่นที่แตกต่างกัน
Andrew Clavin

6
-1 คำตอบของคุณผิด คุณ: "ซ็อกเก็ต TCP คือ ... ปลายทางของการเชื่อมต่อที่ระบุ" RFC 793 : "ซ็อกเก็ตอาจถูกใช้พร้อมกันในหลายการเชื่อมต่อ " ฉันไม่แน่ใจว่าไลบรารีที่คุณใช้อยู่ แต่ในห้องสมุดที่ฉันใช้แล้ววัตถุซ็อกเก็ตได้รับการกำหนดโดย IP และพอร์ตที่ไม่ซ้ำกันและสร้างวัตถุการเชื่อมต่อสำหรับแต่ละซ็อกเก็ตระยะไกล
Zaz

187

ซ็อกเก็ตประกอบด้วยสามสิ่ง:

  1. ที่อยู่ IP
  2. โปรโตคอลการขนส่ง
  3. หมายเลขพอร์ต

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

ตัวอย่างเช่น:

  • 1,030 เป็นพอร์ต
  • (10.1.1.2, TCP, พอร์ต 1030) เป็นซ็อกเก็ต

80
ไม่ซ็อกเก็ตประกอบด้วยห้าสิ่ง: {โปรโตคอล, ที่อยู่ภายใน, พอร์ตในพื้นที่, ที่อยู่ระยะไกล, พอร์ตระยะไกล}
user207421

19
@EJP ไม่อีกครั้ง ดูคำตอบที่เลือกสำหรับข้อมูลเพิ่มเติม
Kehlan Krumme

2
@KorayTugay มันอยู่ในส่วนหัวของ IP อะไรทำให้คุณคิดว่าเลเยอร์ TCP ไม่สามารถมองเห็นสิ่งนั้นได้
user207421

1
@EJP อย่างที่ฉันเห็นในคำตอบที่โหวตแล้วข้างต้นว่าซ็อกเก็ตไม่ใช่การเชื่อมต่อ แต่เป็นจุดสิ้นสุดของการเชื่อมต่อดังนั้นทำไมมันจึงสามารถรวมทั้งพอร์ตท้องถิ่นและระยะไกลและที่อยู่ IP ซ็อกเก็ตจะแสดงเพียงด้านเดียวของการเชื่อมต่อเช่นพอร์ตท้องถิ่นและที่อยู่ IP ท้องถิ่นหรือพอร์ตระยะไกลและระยะไกล ip accress กรุณาแก้ไขให้ฉันถ้าฉันผิด
RBT

7
@EJP ยังคง RFC 793: "ซ็อกเก็ตคู่หนึ่งระบุการเชื่อมต่อแต่ละอันโดยไม่ซ้ำกันนั่นคือซ็อกเก็ตอาจถูกใช้พร้อมกันในการเชื่อมต่อหลายจุด" หากซ็อกเก็ตประกอบด้วยห้าสิ่งอยู่แล้วการมี "ซ็อกเก็ตคู่" ในการอ้างอิงของฉันได้อย่างไร
Gab 是好人

100

ซ็อกเก็ตหมายถึงการเชื่อมต่อเดียวระหว่างแอปพลิเคชั่นเครือข่ายทั้งสอง สองแอปพลิเคชันเหล่านี้ทำงานในคอมพิวเตอร์เครื่องอื่น แต่สามารถใช้ซ็อกเก็ตสำหรับการสื่อสารระหว่างกระบวนการในคอมพิวเตอร์เครื่องเดียว แอปพลิเคชั่นสามารถสร้างซ็อกเก็ตได้หลายช่องสำหรับการสื่อสารระหว่างกัน ซ็อกเก็ตเป็นแบบสองทิศทางซึ่งหมายความว่าทั้งสองด้านของการเชื่อมต่อมีความสามารถในการส่งและรับข้อมูล ดังนั้นซ็อกเก็ตสามารถสร้างขึ้นในทางทฤษฎีในทุกระดับของโมเดล OSI ตั้งแต่ 2 ขึ้นไป โปรแกรมเมอร์มักจะใช้ซ็อกเก็ตในการเขียนโปรแกรมเครือข่ายแม้ว่าจะเป็นทางอ้อม ไลบรารีการเขียนโปรแกรมเช่น Winsock จะซ่อนรายละเอียดระดับต่ำของซ็อกเก็ตโปรแกรมมิง ซ็อกเก็ตมีการใช้กันอย่างแพร่หลายมาตั้งแต่ต้นทศวรรษ 1980

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

http://www.mairie-metz.fr:8080/ในตัวอย่างนี้หมายเลข 8080 หมายถึงหมายเลขพอร์ตที่ใช้โดยเว็บเบราว์เซอร์เพื่อเชื่อมต่อกับเว็บเซิร์ฟเวอร์ โดยปกติเว็บไซต์ใช้หมายเลขพอร์ต 80 และหมายเลขนี้ไม่จำเป็นต้องรวมอยู่ใน URL (แม้ว่าจะเป็นได้)

ในเครือข่าย IP หมายเลขพอร์ตสามารถอยู่ในช่วงทางทฤษฎีตั้งแต่ 0 ถึง 65535 แอปพลิเคชันเครือข่ายที่ได้รับความนิยมส่วนใหญ่ใช้หมายเลขพอร์ตที่ต่ำสุดของช่วง (เช่น 80 สำหรับ HTTP)

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

ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm


2
เลเยอร์ 2 บนโมเดล OSI เป็นการเชื่อมต่อระหว่างโหนดมันไม่มีกลไกของการเชื่อมต่อกระบวนการ ฉันไม่เชื่อว่าคุณสามารถพิจารณาซ็อกเก็ตที่มีอยู่ใน OSI l2
Antonio Haley

18
วงจรคือการเชื่อมต่อ - ซ็อกเก็ตเป็นจุดสิ้นสุด การเชื่อมต่อประกอบด้วย 2 ซ็อกเก็ต
Mark Brackett

" ซ็อกเก็ตแสดงถึงการเชื่อมต่อเดียวระหว่างแอปพลิเคชันเครือข่ายสองตัว " ซึ่งไม่ตรงกับRFC 793, Transmission Control Protocolที่อธิบาย: " เพื่อให้กระบวนการจำนวนมากภายในโฮสต์เดียวใช้สิ่งอำนวยความสะดวกการสื่อสาร TCP พร้อมกัน TCP ให้ชุดของที่อยู่ หรือพอร์ตภายในแต่ละโฮสต์เชื่อมต่อกับที่อยู่เครือข่ายและโฮสต์จากเลเยอร์การสื่อสารทางอินเทอร์เน็ตทำให้เกิดซ็อกเก็ตซ็อกเก็ตหนึ่งคู่จะระบุการเชื่อมต่อแต่ละอันโดยไม่ซ้ำกัน "
Ron Maupin

84

ด้วยการเปรียบเทียบบ้าง

แม้ว่าจะมีสิ่งทางเทคนิคมากมายที่ให้ไว้ข้างต้นสำหรับซ็อกเก็ต ... ฉันต้องการเพิ่มคำตอบของฉันในกรณีที่ถ้าใครบางคนยังไม่สามารถรู้สึกถึงความแตกต่างระหว่าง ip, พอร์ตและซ็อกเก็ต

พิจารณาเซิร์ฟเวอร์ S ,

และพูดคน X, Y, Zต้องการบริการ (พูดบริการแชท) จากเซิร์ฟเวอร์นั้นS

แล้วก็

ที่อยู่ IP บอก -> ใคร นั่นคือเซิร์ฟเวอร์แชท 'S' ที่ X, Y, Z ต้องการติดต่อ

โอเคคุณได้รับ "ใครเป็นเซิร์ฟเวอร์"

แต่สมมติว่าเซิร์ฟเวอร์ 'S' กำลังให้บริการอื่น ๆ แก่บุคคลอื่นเช่นกัน'S' ให้บริการจัดเก็บข้อมูลแก่บุคคล A, B, C

แล้วก็

พอร์ตบอก ---> อันไหน? บริการคุณ(X, Y, Z)ต้องการบริการแชทไม่ใช่บริการจัดเก็บข้อมูล

โอเค .. คุณทำให้เซิร์ฟเวอร์รู้ว่า 'บริการแชท' เป็นสิ่งที่คุณต้องการไม่ใช่ที่เก็บข้อมูล

แต่

คุณเป็นสามคนและเซิร์ฟเวอร์อาจต้องการระบุทั้งสามอย่างต่างกัน

มีซ็อกเก็ตมา

ตอนนี้ซ็อกเก็ตบอก -> อันไหน? การเชื่อมต่อโดยเฉพาะ

นั่นคือพูด

ซ็อกเก็ต 1 สำหรับคน X

ซ็อกเก็ต 2 สำหรับคน Y

และซ็อกเก็ต 3 สำหรับคน Z

ฉันหวังว่ามันจะช่วยให้คนที่ยังสับสนอยู่ :)


ดังนั้น X, Y, Z จะเชื่อมต่อกับพอร์ตเดียวกันนั่นคือบริการเดียวกัน แต่มีซ็อกเก็ตที่แตกต่างกันในฝั่งเซิร์ฟเวอร์หรือไม่ ดังนั้นเมื่อพูดว่า X ส่งแพ็คเก็ตไปยังเซิร์ฟเวอร์มันจะพูดว่า: 'หาฉัน (โปรโตคอล, IP ของ X, พอร์ต X, IP ของ S, พอร์ตของ S) และส่งไปยังแอปแชท ฉันคิดว่าต้องมีการเชื่อมโยงระหว่างบางแอปพลิเคชัน - วัตถุเฉพาะและวัตถุซ็อกเก็ต? ตัวอย่างเช่นเมื่อฉันได้รับข้อมูลบางอย่างจาก socket-1 ฉันต้องการแสดงว่าเป็นข้อความผู้ใช้ แต่แอปจำเป็นต้องรู้ข้อความจากซ็อกเก็ต A มาจาก User-X
หินใหญ่ก้อนเดียว

44

Firsty ฉันคิดว่าเราควรเริ่มด้วยความเข้าใจเพียงเล็กน้อยว่าการรับแพ็คเก็ตจาก A ถึง B เป็นอย่างไร

คำจำกัดความทั่วไปสำหรับเครือข่ายคือการใช้แบบจำลอง OSIซึ่งแยกเครือข่ายออกเป็นจำนวนเลเยอร์ตามวัตถุประสงค์ มีบางอย่างที่สำคัญซึ่งเราจะกล่าวถึงที่นี่:

  • ชั้นเชื่อมโยงข้อมูล เลเยอร์นี้มีหน้าที่รับแพ็กเก็ตข้อมูลจากอุปกรณ์เครือข่ายหนึ่งไปยังอีกอุปกรณ์หนึ่งและอยู่เหนือเลเยอร์ที่ทำการส่งสัญญาณจริง มันพูดถึงที่อยู่ MAC และรู้วิธีหาโฮสต์โดยใช้ที่อยู่ MAC (ฮาร์ดแวร์) ของพวกเขา แต่ไม่มีอะไรเพิ่มเติม
  • เลเยอร์เครือข่ายเป็นชั้นที่ช่วยให้คุณสามารถส่งข้อมูลในเครื่องและขอบเขตทางกายภาพมากกว่าเช่นอุปกรณ์ทางกายภาพ เลเยอร์เครือข่ายจะต้องสนับสนุนกลไกที่ใช้ที่อยู่เพิ่มเติมซึ่งสัมพันธ์กับที่อยู่ทางกายภาพเป็นหลัก ป้อน Internet Protocol (IPv4) ที่อยู่ IP สามารถรับแพ็คเก็ตของคุณจาก A ถึง B ผ่านอินเทอร์เน็ตได้ แต่ไม่รู้อะไรเลยเกี่ยวกับวิธีการข้ามฮ็อพแต่ละรายการ สิ่งนี้ถูกจัดการโดยเลเยอร์ด้านบนตามข้อมูลการเราต์
  • ชั้นการขนส่ง เลเยอร์นี้มีหน้าที่กำหนดวิธีการรับข้อมูลจาก A ถึง B และข้อ จำกัด การตรวจสอบหรือข้อผิดพลาดใด ๆ ตัวอย่างเช่น TCP เพิ่มข้อมูลเพิ่มเติมลงในแพ็คเก็ตซึ่งเป็นไปได้ที่จะอนุมานได้หากแพ็กเก็ตสูญหาย

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

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

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

ดังนั้นพอร์ตจึงเป็นวิธีที่ได้รับมอบอำนาจตามข้อกำหนดของการอนุญาตให้มีการเชื่อมต่อพร้อมกันหลายรายการที่ใช้ที่อยู่เดียวกัน

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

int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...

ที่ดี! ดังนั้นในsockaddrโครงสร้างเราจะระบุพอร์ตและแบมของเรา! งานเสร็จแล้ว! ก็เกือบจะยกเว้น:

int fd = socket(AF_UNIX, SOCK_STREAM, 0);

เป็นไปได้ เอ่อนั่นเป็นกุญแจไขให้กับงาน!

ตกลงจริง ๆ แล้วมันไม่ได้ สิ่งที่เราต้องทำคือหาคำจำกัดความที่เหมาะสม:

  • ซ็อกเก็ตอินเทอร์เน็ตคือการรวมกันของที่อยู่ IP โปรโตคอลและหมายเลขพอร์ตที่เกี่ยวข้องซึ่งบริการอาจให้ข้อมูล tcp พอร์ต 80, stackoverflow.com เป็นซ็อกเก็ตอินเทอร์เน็ต
  • ซ็อกเก็ตยูนิกซ์เป็นปลายทาง IPC /var/run/database.sockเป็นตัวแทนในระบบแฟ้มเช่น
  • Socket API เป็นวิธีการขอให้แอปพลิเคชันสามารถอ่านและเขียนข้อมูลไปยังซ็อกเก็ตได้

Voila! สิ่งนั้นเกิดขึ้น ดังนั้นในแผนของเรา

  • พอร์ตเป็นตัวระบุตัวเลขซึ่งเป็นส่วนหนึ่งของโปรโตคอลเลเยอร์การขนส่งระบุหมายเลขบริการที่ควรตอบสนองต่อคำขอที่ได้รับ

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


นี่คือเหตุผลที่กระสุนไม่ออกและไม่ออกจาก Powerpoint งานของเขา!
Anurag Kalia

การแนะนำที่ดีมากสำหรับการสื่อสาร TCP และ IP ผู้เริ่มต้นอ่านสิ่งนี้ก่อน
โคลิน

32

ซ็อกเก็ต = ที่อยู่ IP + พอร์ต (ที่อยู่ตัวเลข)
พวกเขาช่วยระบุจุดสิ้นสุดสำหรับการเชื่อมต่อเครือข่ายบนเครื่อง (ฉันเพิ่งใช้เครือข่าย flunk 101 หรือไม่)


7
ฉันเชื่อว่าพอร์ตมีความหมายที่กว้างกว่าคำจำกัดความของคุณ
Richard Dorman

2
และซ็อกเก็ตไม่เพียง แต่ขึ้นอยู่กับสแต็ก TCP / IP ดูซ็อกเก็ตโดเมน UNIX หรือซ็อกเก็ตการสื่อสารระหว่างกระบวนการโดยทั่วไป
matthias krull

ไม่แน่ใจเกี่ยวกับคำตอบนี้ คุณสามารถใช้ HTTP เพื่อสื่อสารกับกระบวนการอื่นผ่านซ็อกเก็ตโดยไม่ต้องกำหนดพอร์ต
SeF

31

โดยทั่วไปแล้วคุณจะได้รับทฤษฎีมากมาย แต่วิธีที่ง่ายที่สุดวิธีหนึ่งในการแยกความแตกต่างของแนวคิดทั้งสองนี้มีดังนี้:

ในการรับบริการคุณต้องมีหมายเลขบริการ หมายเลขบริการนี้เรียกว่าพอร์ต เรียบง่ายเหมือนที่

ตัวอย่างเช่น HTTP เป็นบริการกำลังทำงานบนพอร์ต 80

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


แต่ละซ็อกเก็ตต้องการพอร์ตของตัวเองหรือไม่?
MondayPaper

น่ากลัว วิธีที่ง่ายที่สุดในการนำเสนอความรู้บนภูเขา
Asif Mehmood

5
ฉันไม่แน่ใจว่าคำสั่งของคุณ: "เซิร์ฟเวอร์สร้างซ็อกเก็ตต่อการเชื่อมต่อเพื่อรักษาลูกค้า" ถูกต้อง
Rushi Agrawal

1
@RushiAgrawal ถ้าอย่างนั้นฉันขอแนะนำให้คุณดู โดยเฉพาะเห็นคนยอมรับ
user207421

1
นี่หมายความว่าสำหรับแต่ละซ็อกเก็ตที่เซิร์ฟเวอร์สร้างต่อการเชื่อมต่อเพื่อรักษาไคลเอนต์สามารถมีหมายเลขพอร์ตเดียวกัน (เช่นพอร์ต 80 สำหรับการเชื่อมต่อ HTTP การเชื่อมต่อ) แต่มีที่อยู่ IP ที่แตกต่างกันของไคลเอนต์ที่ร้องขอสำหรับการเชื่อมต่อ ขวา?
Randika Vishman

25

ดูเหมือนว่าจะมีคำตอบมากมายเทียบกับซ็อกเก็ตกับการเชื่อมต่อระหว่างพีซี 2 เครื่อง .. ซึ่งฉันคิดว่ามันไม่ถูกต้องอย่างแน่นอน ซ็อกเก็ตเป็นจุดสิ้นสุดบนพีซี 1 เครื่องซึ่งอาจเชื่อมต่อหรือไม่เชื่อมต่อ - แน่นอนว่าเราเคยใช้ฟังหรือซ็อกเก็ต UDP ทุกครั้ง ส่วนที่สำคัญคือสามารถระบุตำแหน่งได้และแอคทีฟ การส่งข้อความถึง 1.1.1.1:1234 นั้นไม่น่าจะเป็นไปได้เนื่องจากไม่มีการกำหนดซ็อกเก็ตสำหรับอุปกรณ์ปลายทางนั้น

ซ็อกเก็ตเป็นโปรโตคอลที่เฉพาะเจาะจงดังนั้นการนำไปปฏิบัติของความเป็นเอกลักษณ์ที่ทั้งTCP / IPและUDP / IPใช้ * (ipaddress: พอร์ต) แตกต่างจากเช่น. IPX (เครือข่ายโหนดและ ... อะแฮ่มซ็อกเก็ต - แต่แตกต่างกัน ซ็อกเก็ตที่เกินความหมายโดยคำว่า "ซ็อกเก็ต" ทั่วไปหมายเลขซ็อกเก็ต IPX เทียบเท่ากับพอร์ต IP) แต่พวกเขาทั้งหมดมีจุดปลายแอดเดรสที่ไม่ซ้ำกัน

เนื่องจาก IP ได้กลายเป็นโพรโทคอลที่โดดเด่นพอร์ต (ในแง่เครือข่าย) กลายเป็นซิงโครนัสที่มีหมายเลขพอร์ต UDP หรือ TCP ซึ่งเป็นส่วนหนึ่งของซ็อกเก็ตแอดเดรส

  • UDP เป็นการเชื่อมต่อที่น้อยกว่า - หมายถึงไม่มีวงจรเสมือนจริงระหว่างจุดปลาย 2 จุดที่ถูกสร้างขึ้น อย่างไรก็ตามเรายังอ้างถึงซ็อกเก็ต UDPเป็นจุดสิ้นสุด ฟังก์ชั่น API ทำให้ชัดเจนว่าทั้งสองเป็นเพียงซ็อกเก็ตประเภทอื่น - SOCK_DGRAMคือ UDP (เพียงแค่ส่งข้อความ) และSOCK_STREAMเป็น TCP (สร้างวงจรเสมือน)

  • ในทางเทคนิคส่วนหัว IP จะเก็บที่อยู่ IP และโปรโตคอลที่อยู่ด้านบนของ IP (UDP หรือ TCP) จะเก็บหมายเลขพอร์ตไว้ สิ่งนี้ทำให้เป็นไปได้ที่จะมีโปรโตคอลอื่น ๆ (เช่นICMPที่ไม่มีหมายเลขพอร์ต แต่มีข้อมูลที่อยู่ IP)


25

คำตอบสั้น ๆ

พอร์ตสามารถอธิบายเป็นที่อยู่ภายในที่อยู่ในพื้นที่ที่ระบุโปรแกรมหรือกระบวนการ

ซ็อกเก็ตสามารถอธิบายเป็นการเขียนโปรแกรมอินเตอร์เฟซที่ช่วยให้โปรแกรมสื่อสารกับโปรแกรมอื่น ๆ หรือกระบวนการในอินเทอร์เน็ตหรือท้องถิ่น


3
คำว่า 'ภายใน' ในคำอธิบายพอร์ตดูเหมือนจะเป็น 'ไม่เป็นสาธารณะ' สำหรับฉัน
Jonas N

ดังนั้นเราสามารถพูดได้: ซ็อกเก็ตทำงานในพอร์ตหรือไม่ หรือพอร์ตทำงานภายในซ็อกเก็ต?
Gucho Ca

@GuchoCa เราไม่สามารถพูดได้ว่าซ็อกเก็ตหรือพอร์ตทำงานเลย ไม่ชัดเจนสิ่งที่คุณถาม
user207421

16

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


สำหรับคำตอบที่พบบ่อยที่สุดให้หยุดงาน "ทำโดยนำพอร์ตและชื่อโฮสต์หรืออะแดปเตอร์เครือข่ายมารวมกันเป็น" ตัวอย่างเช่นซ็อกเก็ต UNIX คือ (ในรหัส) โครงสร้างข้อมูล (หรือวัตถุ) ที่คุณสามารถใช้เพื่อส่งหรือรับข้อมูล
Josiah Yoder

14

นี่เป็นแนวคิดเครือข่ายพื้นฐานดังนั้นฉันจะอธิบายให้เข้าใจง่ายในรายละเอียด

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

ดังนั้นซ็อกเก็ตในระบบเครือข่ายเป็นอุปกรณ์สื่อสารเสมือนที่ถูกผูกไว้กับคู่ (ip, พอร์ต) = (ที่อยู่, บริการ)

บันทึก:

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

หวังว่ามันจะเคลียร์คุณสงสัย


เป็นที่น่าสนใจที่จะเห็นความเข้าใจและการเปรียบเทียบทั้งหมดของซ็อกเก็ต / พอร์ต / ที่อยู่ IP ภายใต้คำถามนี้ และฉันชอบคำตอบนี้
Bloodmoon

12

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

การเชื่อมต่อ TCP-IP เป็นเส้นทางสู่สองทางที่เชื่อมต่อหนึ่งที่อยู่: การรวมกันของพอร์ตกับที่อยู่อื่น: การรวมกันของพอร์ต ดังนั้นเมื่อใดก็ตามที่คุณเปิดการเชื่อมต่อจากเครื่องท้องถิ่นของคุณไปยังพอร์ตบนเซิร์ฟเวอร์ระยะไกล (พูด www.google.com:80) คุณจะเชื่อมโยงหมายเลขพอร์ตใหม่บนเครื่องของคุณด้วยการเชื่อมต่อเพื่ออนุญาตให้เซิร์ฟเวอร์ส่ง สิ่งต่าง ๆ กลับมาให้คุณ (เช่น 127.0.0.1:65234) การใช้ netstat เพื่อดูการเชื่อมต่อเครื่องของคุณมีประโยชน์:

> netstat -nWp tcp (on OS X)
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  192.168.0.6.49871      17.172.232.57.5223     ESTABLISHED
...

12

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

123.132.213.231         # IP address
               :1234    # port number
123.132.213.231:1234    # socket address

การเชื่อมต่อเกิดขึ้นเมื่อ 2 ซ็อกเก็ตถูกผูกเข้าด้วยกัน


ไม่มีสิ่งเช่นผูกสองซ็อกเก็ตเข้าด้วยกัน คำว่า 'bound' หมายถึงอย่างอื่นที่มีพอร์ต
user207421

10

ซ็อกเก็ตเป็นตัวจัดการไฟล์ชนิดพิเศษที่กระบวนการใช้เพื่อร้องขอบริการเครือข่ายจากระบบปฏิบัติการ ที่อยู่ซ็อกเก็ตเป็นสาม: {โปรโตคอล, ที่อยู่ในท้องถิ่น, กระบวนการในท้องถิ่น} ที่กระบวนการในท้องถิ่นจะถูกระบุด้วยหมายเลขพอร์ต

ในชุด TCP / IP ตัวอย่างเช่น:

{tcp, 193.44.234.3, 12345}

การสนทนาคือการเชื่อมโยงการสื่อสารระหว่างสองกระบวนการซึ่งแสดงให้เห็นถึงการเชื่อมโยงระหว่างสองกระบวนการ การเชื่อมโยงคือ 5-tuple ที่ระบุกระบวนการทั้งสองที่ประกอบด้วยการเชื่อมต่ออย่างสมบูรณ์: {โปรโตคอล, ที่อยู่ในพื้นที่, กระบวนการภายใน, ที่อยู่ต่างประเทศ, กระบวนการต่างประเทศ}

ในชุด TCP / IP ตัวอย่างเช่น:

{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}

อาจเป็นสมาคมที่ถูกต้อง

การเชื่อมโยงครึ่งหนึ่งอาจเป็น: {protocol, local-address, local-process}

หรือ

{โปรโตคอล, ที่อยู่ต่างประเทศ, กระบวนการต่างประเทศ}

ซึ่งระบุการเชื่อมต่อแต่ละครึ่ง

การเชื่อมโยงครึ่งหนึ่งนั้นเรียกว่าซ็อกเก็ตหรือที่อยู่การขนส่ง นั่นคือซ็อกเก็ตเป็นจุดสิ้นสุดสำหรับการสื่อสารที่สามารถตั้งชื่อและแก้ไขในเครือข่าย ซ็อกเก็ตอินเทอร์เฟซเป็นหนึ่งในหลาย ๆ แอปพลิเคชันการเขียนโปรแกรม (APIs) กับโปรโตคอลการสื่อสาร ได้รับการออกแบบให้เป็นอินเตอร์เฟสการเขียนโปรแกรมการสื่อสารทั่วไปมันถูกเปิดใช้ครั้งแรกโดยระบบ 4.2BSD UNIX แม้ว่ามันจะไม่ได้มาตรฐาน แต่มันก็กลายเป็นมาตรฐานอุตสาหกรรมโดยพฤตินัย


คำตอบนี้เป็นคำตอบสำหรับฉัน ฉันเดาว่าเป็นเพราะไม่มีใครพูดถึงการเชื่อมโยงคำว่า คำอธิบายที่ดี
rationalcoder

ไม่มีหมายเลขกระบวนการในตัวอย่างใด ๆ ของคุณ คำที่คุณต้องการคือ 'พอร์ต'
user207421

อ่านย่อหน้าแรก .. มันถูกกล่าวถึงอย่างชัดเจน แจ้งให้เราทราบถึงความกำกวมใด ๆ โดยการอ้างอิงวลีที่แน่นอน .. จะเป็นประโยชน์สำหรับฉันที่จะพูดโพล่งออกมา
กฤษณะ

7

ซ็อกเก็ตเป็นจุดสิ้นสุดการสื่อสาร ซ็อกเก็ตไม่เกี่ยวข้องโดยตรงกับตระกูลโปรโตคอล TCP / IP สามารถใช้กับโปรโตคอลใดก็ได้ที่ระบบของคุณรองรับ C socket API คาดว่าคุณจะได้รับวัตถุซ็อกเก็ตว่างจากระบบก่อนจากนั้นคุณสามารถผูกกับที่อยู่ซ็อกเก็ตท้องถิ่น (เพื่อดึงข้อมูลทราฟฟิกขาเข้าโดยตรงสำหรับโปรโตคอลการเชื่อมต่อน้อยกว่าหรือรับคำขอการเชื่อมต่อขาเข้าสำหรับโปรโตคอลที่มุ่งเน้นการเชื่อมต่อ) หรือว่าคุณสามารถเชื่อมต่อกับที่อยู่ซ็อกเก็ตระยะไกล (สำหรับโปรโตคอลชนิดใดชนิดหนึ่ง) คุณสามารถทำได้ทั้งสองอย่างหากคุณต้องการควบคุมทั้งสองซ็อกเก็ตโลคอลแอดเดรสที่ซ็อกเก็ตเชื่อมต่ออยู่และรีโมตซ็อกเก็ตแอดเดรสที่ซ็อกเก็ตเชื่อมต่ออยู่ สำหรับโปรโตคอลการเชื่อมต่อน้อยกว่าการเชื่อมต่อซ็อกเก็ตเป็นตัวเลือก แต่ถ้าคุณไม่ทำเช่นนั้นคุณ ' จะต้องผ่านที่อยู่ปลายทางด้วยทุกแพ็คเก็ตที่คุณต้องการส่งผ่านซ็อกเก็ตเช่นเดียวกับที่ซ็อกเก็ตจะรู้ว่าจะส่งข้อมูลนี้ไปที่ไหน ข้อดีคือคุณสามารถใช้ซ็อกเก็ตเดียวเพื่อส่งแพ็คเก็ตไปยังที่อยู่ซ็อกเก็ตที่แตกต่างกัน เมื่อคุณตั้งค่าซ็อกเก็ตของคุณและอาจเชื่อมต่อได้ให้ลองใช้เป็นท่อสื่อสารสองทิศทาง คุณสามารถใช้มันเพื่อส่งผ่านข้อมูลไปยังปลายทางและบางปลายทางสามารถใช้เพื่อส่งข้อมูลกลับไปยังคุณ สิ่งที่คุณเขียนไปยังซ็อกเก็ตคือการส่งออกและสิ่งที่ได้รับพร้อมสำหรับการอ่าน คุณสามารถใช้มันเพื่อส่งผ่านข้อมูลไปยังปลายทางและบางปลายทางสามารถใช้เพื่อส่งข้อมูลกลับไปยังคุณ สิ่งที่คุณเขียนไปยังซ็อกเก็ตคือการส่งออกและสิ่งที่ได้รับพร้อมสำหรับการอ่าน คุณสามารถใช้มันเพื่อส่งผ่านข้อมูลไปยังปลายทางและบางปลายทางสามารถใช้เพื่อส่งข้อมูลกลับไปยังคุณ สิ่งที่คุณเขียนไปยังซ็อกเก็ตคือการส่งออกและสิ่งที่ได้รับพร้อมสำหรับการอ่าน

พอร์ตในทางกลับกันเป็นสิ่งที่มีเพียงบางโปรโตคอลของสแต็กโปรโตคอล TCP / IP เท่านั้นที่มี แพ็คเก็ต TCP และ UDP มีพอร์ต พอร์ตเป็นเพียงตัวเลขธรรมดา การรวมกันของพอร์ตต้นทางและพอร์ตปลายทางระบุช่องทางการสื่อสารระหว่างสองโฮสต์ เช่นคุณอาจมีเซิร์ฟเวอร์ที่ต้องเป็นทั้งเซิร์ฟเวอร์ HTTP แบบง่ายและเซิร์ฟเวอร์ FTP แบบง่าย ถ้าตอนนี้แพ็กเก็ตมาถึงที่อยู่ของเซิร์ฟเวอร์นั้นจะรู้ได้อย่างไรว่าเป็นแพ็กเก็ตสำหรับ HTTP หรือเซิร์ฟเวอร์ FTP มันจะรู้เช่นกันเนื่องจากเซิร์ฟเวอร์ HTTP จะทำงานบนพอร์ต 80 และเซิร์ฟเวอร์ FTP ที่พอร์ต 21 ดังนั้นหากแพ็กเก็ตมาถึงด้วยพอร์ตปลายทาง 80 นั่นจะเป็นสำหรับเซิร์ฟเวอร์ HTTP ไม่ใช่สำหรับเซิร์ฟเวอร์ FTP แพ็คเก็ตยังมีพอร์ตต้นทางตั้งแต่ไม่มีพอร์ตต้นทางเซิร์ฟเวอร์สามารถมีการเชื่อมต่อหนึ่งครั้งไปยังที่อยู่ IP หนึ่งครั้ง พอร์ตต้นทางทำให้เซิร์ฟเวอร์แยกแยะการเชื่อมต่อที่เหมือนกันได้: พวกเขาทั้งหมดมีพอร์ตปลายทางเดียวกันเช่นพอร์ต 80, IP ปลายทางเดียวกัน (IP ของเซิร์ฟเวอร์) และ IP ต้นทางเดียวกันทั้งหมดมาจาก ไคลเอ็นต์เดียวกัน แต่เนื่องจากมีพอร์ตต้นทางแตกต่างกันเซิร์ฟเวอร์จึงสามารถแยกความแตกต่างระหว่างกันได้ และเมื่อเซิร์ฟเวอร์ส่งการตอบกลับไปก็จะทำเช่นนั้นไปยังพอร์ตที่ร้องขอมาทางลูกค้าสามารถแยกความแตกต่างการตอบกลับที่ได้รับจากเซิร์ฟเวอร์เดียวกัน


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

1
ฉันสังเกตว่า RFC793 (ข้อมูลจำเพาะ TCP ดั้งเดิม) อ้างถึงการรวมกันของที่อยู่เครือข่ายและพอร์ตเป็นซ็อกเก็ตดังนั้นฉันสามารถดูว่าคุณได้รับที่นี่ แต่ก็ยังไม่ถูกต้อง
Peter Wone

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

6

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

  • IP และพอร์ต ~ หมายเลขโทรศัพท์
  • ซ็อกเก็ต ~ อุปกรณ์โทรศัพท์
  • การเชื่อมต่อ ~ โทร
  • กำลังสร้างการเชื่อมต่อ ~ โทรไปยังหมายเลข
  • กระบวนการแอปพลิเคชันระยะไกล ~ คน
  • ข้อความ ~ คำพูด

การชี้แจงที่ดี (โดยเฉพาะอย่างยิ่งเมื่อคุณพิจารณาประวัติการเปลี่ยนโทรศัพท์ซึ่งเป็นส่วนหนึ่งของรากฐานของคำศัพท์ด้านเครือข่าย .. )
oɔɯǝɹ

ดูที่การnetstatแสดงผลบางครั้ง ซ็อกเก็ตทั้งหมดที่ยอมรับจากซ็อกเก็ตการฟังใช้พอร์ตเดียวกัน Ergoพอร์ตไม่ใช่ตัวระบุเฉพาะสำหรับซ็อกเก็ต
user207421

6

แอปพลิเคชันประกอบด้วยกระบวนการที่คู่สื่อสารผ่านเครือข่าย (คู่ไคลเอ็นต์ - เซิร์ฟเวอร์) กระบวนการเหล่านี้ส่งและรับข้อความเข้าและจากเครือข่ายผ่านอินเตอร์เฟซซอฟต์แวร์ที่เรียกว่าซ็อกเก็ต พิจารณาเปรียบเทียบที่นำเสนอในหนังสือ "ระบบเครือข่ายคอมพิวเตอร์: วิธีการจากบนลงล่าง" มีบ้านที่ต้องการสื่อสารกับบ้านอื่น ที่นี่บ้านคล้ายกับกระบวนการและประตูกับซ็อกเก็ต กระบวนการส่งถือว่าสันนิษฐานว่ามีโครงสร้างพื้นฐานอยู่อีกด้านหนึ่งของประตูที่จะขนส่งข้อมูลไปยังปลายทาง เมื่อข้อความมาถึงในอีกด้านหนึ่งมันจะผ่านประตูของผู้รับ (ซ็อกเก็ต) เข้าไปในบ้าน (กระบวนการ) ภาพประกอบจากหนังสือเล่มเดียวกันนี้สามารถช่วยคุณ:
ป้อนคำอธิบายรูปภาพที่นี่
Sockets เป็นส่วนหนึ่งของ transport layer ซึ่งให้การสื่อสารแบบลอจิคัลกับแอ็พพลิเคชัน ซึ่งหมายความว่าจากมุมมองของแอปพลิเคชันโฮสต์ทั้งสองเชื่อมต่อกันโดยตรงแม้ว่าจะมีเราเตอร์และ / หรือสวิตช์จำนวนมากระหว่างกัน ดังนั้นซ็อกเก็ตไม่ได้เชื่อมต่อตัวเองมันเป็นจุดสิ้นสุดของการเชื่อมต่อ โปรโตคอลเลเยอร์การขนส่งมีการใช้งานบนโฮสต์เท่านั้นและไม่ได้อยู่ในเราเตอร์ระดับกลาง
พอร์ตให้วิธีการที่อยู่ภายในไปยังเครื่อง วัตถุประสงค์หลักคืออนุญาตให้หลายกระบวนการส่งและรับข้อมูลผ่านเครือข่ายโดยไม่รบกวนกระบวนการอื่น ๆ (ข้อมูลของพวกเขา) ซ็อกเก็ตทั้งหมดมาพร้อมกับหมายเลขพอร์ต เมื่อเซกเมนต์มาถึงโฮสต์เลเยอร์การขนส่งจะตรวจสอบหมายเลขพอร์ตปลายทางของเซกเมนต์ จากนั้นส่งต่อเซ็กเมนต์ไปยังซ็อกเก็ตที่เกี่ยวข้อง งานในการส่งข้อมูลในเซสชั่นเลเยอร์การขนส่งไปยังซ็อกเก็ตที่ถูกต้องนี้เรียกว่าการทำมัลติเพล็ก ข้อมูลของกลุ่มนั้นจะถูกส่งต่อไปยังกระบวนการที่แนบกับซ็อกเก็ต


5

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

พอร์ตเป็นอุปกรณ์ที่เหมือนอุปกรณ์ แต่ละโฮสต์มีเครือข่ายหนึ่งเครือข่ายหรือมากกว่านั้น โฮสต์มีที่อยู่ในแต่ละเครือข่าย ที่อยู่แต่ละแห่งสามารถมีพอร์ตได้หลายพันพอร์ต

ซ็อกเก็ตเดียวเท่านั้นอาจใช้พอร์ตตามที่อยู่ ซ็อกเก็ตจัดสรรพอร์ตโดยประมาณเช่นการจัดสรรอุปกรณ์สำหรับระบบไฟล์ I / O เมื่อจัดสรรพอร์ตแล้วจะไม่มีซ็อกเก็ตอื่นที่สามารถเชื่อมต่อกับพอร์ตนั้นได้ พอร์ตจะถูกปลดปล่อยเมื่อซ็อกเก็ตถูกปิด

ลองดูที่TCP / IP คำศัพท์


3
รายละเอียดของซ็อกเก็ตนี้ค่อนข้างปิดฐาน ซ็อกเก็ตเป็นเรื่องเกี่ยวกับการเชื่อมต่อระหว่างคู่ของสิ่งอันดับที่ tuple อ้างถึงคู่ IP ADDR และพอร์ต นอกจากนี้ซ็อกเก็ตจำนวนมากสามารถเชื่อมต่อกับพอร์ตเดียวกัน คุณคิดว่าเว็บเซิร์ฟเวอร์ใช้การเชื่อมต่อหลาย ๆ พอร์ตที่ 80 ได้อย่างไร นี่เป็นคำตอบที่ไม่ดี
Tall Jeff

1
ขอโทษ ซ็อกเก็ตหลายตัวไม่ได้เชื่อมต่อกับพอร์ต 80 ซ็อกเก็ตหนึ่งตัวถูกเชื่อมต่อและวางซ็อกเก็ตเพิ่มเติมที่เกิดการถ่ายโอนจริง ดูopengroup.org/onlinepubs/009695399/functions/listen.html
S.Lott

1
ที่จริงแล้วคำอธิบายที่opengroup.org/onlinepubs/009695399/functions/connect.htmlดีกว่า เพียร์ซ็อกเก็ตที่ส่งคืนโดยการเชื่อมต่อไม่ได้อยู่ที่พอร์ต 80
S.Lott

1
โพสต์นี้ไม่ถูกต้องในหลายรายการและทำให้เข้าใจผิดในหลายประการ
Peter Wone

@ Peter Wone: รายการไหน? ด้านไหน? หวังว่าจะเรียนรู้จากความผิดพลาดของฉัน
S.Lott

5

จากOracle Java Tutorial :

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


นั่นเป็นเพียงการสอนและไม่ใช่การอ้างอิงเชิงบรรทัดฐานแน่นอน
user207421

"ซ็อกเก็ตเป็นจุดปลายหนึ่งของลิงก์การสื่อสารสองทาง" นั่นไม่ใช่คำจำกัดความของซ็อกเก็ตไม่ใช่การสอนด้วยจาวาใช่ไหม
prayagupd

@prayagupd แน่นอนมันเป็นคำจำกัดความ แต่มาจากการสอนไม่ใช่สเปค
user207421

4

พอร์ตและซ็อกเก็ตสามารถเปรียบเทียบได้กับสาขาของธนาคาร

หมายเลขอาคารของ "ธนาคาร" นั้นคล้ายคลึงกับที่อยู่ IP ธนาคารมีหัวข้อต่าง ๆ เช่น:

  1. ฝ่ายบัญชีออมทรัพย์
  2. แผนกสินเชื่อส่วนบุคคล
  3. แผนกสินเชื่อบ้าน
  4. แผนกรับเรื่องร้องเรียน

ดังนั้น 1 (แผนกบัญชีออมทรัพย์), 2 (แผนกสินเชื่อส่วนบุคคล), 3 (แผนกสินเชื่อบ้าน) และ 4 (แผนกรับเรื่องร้องเรียน) เป็นพอร์ต

ตอนนี้ให้เราบอกว่าคุณไปเปิดบัญชีออมทรัพย์คุณไปที่ธนาคาร (ที่อยู่ IP) จากนั้นคุณไปที่ "แผนกบัญชีออมทรัพย์" (หมายเลขพอร์ต 1) จากนั้นคุณพบพนักงานคนหนึ่งที่ทำงานภายใต้ "แผนกบัญชีออมทรัพย์ " ให้เราเรียกเขาว่า SAVINGACCOUNT_EMPLOYEE1 เพื่อเปิดบัญชี

SAVINGACCOUNT_EMPLOYEE1 เป็นตัวบ่งชี้ซ็อกเก็ตของคุณดังนั้นอาจมี SAVINGACCOUNT_EMPLOYEE1 ถึง SAVINGACCOUNT_EMPLOYEEN นี่คือซ็อกเก็ตบ่งชี้ทั้งหมด

ในทำนองเดียวกันแผนกอื่น ๆ จะมีการจ้างงานที่ทำงานอยู่ภายใต้พวกเขาและพวกเขาจะคล้ายกับซ็อกเก็ต


3

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

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


3

คำศัพท์สัมพัทธ์ TCP / IP ซึ่งเป็นสิ่งที่ฉันถือว่ามีนัยโดยคำถาม ในแง่ของคนธรรมดา:

พอร์ตเป็นเหมือนหมายเลขโทรศัพท์ของบ้านหลังหนึ่งในรหัสไปรษณีย์เฉพาะ รหัสไปรษณีย์ของเมืองอาจถือได้ว่าเป็นที่อยู่ IP ของเมืองและบ้านทั้งหมดในเมืองนั้น

ในทางกลับกัน SOCKET เป็นเหมือนการโทรศัพท์ระหว่างโทรศัพท์ของบ้านคู่หนึ่งที่คุยกัน การเรียกเหล่านั้นสามารถสร้างระหว่างบ้านในเมืองเดียวกันหรือบ้านสองหลังในเมืองต่าง ๆ มันเป็นเส้นทางที่สร้างขึ้นชั่วคราวระหว่างคู่โทรศัพท์ที่คุยกันนั่นคือซ็อกเก็ต


2
ซ็อกเก็ตเป็นจุดสิ้นสุด มันมีอยู่ก่อนที่จะสร้างการเชื่อมต่อ (TCP) หรือในกรณีที่ไม่มีการเชื่อมต่อ (UDP) Ergo มันไม่ได้เป็นตัวเชื่อมต่อ
user207421

2

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

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


2

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

ฉันพบมันที่นี่

ตัวอย่างนี้จะนำคุณสู่กระบวนการเชื่อมต่อกับเว็บไซต์เช่น Wiley คุณจะเปิดเว็บเบราว์เซอร์ของคุณ (เช่น Mozilla Firefox) แล้วพิมพ์ www.wiley.com ลงในแถบที่อยู่ เว็บเบราว์เซอร์ของคุณใช้เซิร์ฟเวอร์ระบบชื่อโดเมน (DNS) เพื่อค้นหาชื่อ www.wiley.com เพื่อระบุที่อยู่ IP ของมัน สำหรับตัวอย่างนี้ที่อยู่คือ 192.0.2.100

Firefox ทำการเชื่อมต่อกับที่อยู่ 192.0.2.100 และพอร์ตที่เว็บเซิร์ฟเวอร์ของชั้นแอพพลิเคชันทำงานอยู่ Firefox รู้พอร์ตที่จะคาดหวังเพราะเป็นพอร์ตที่รู้จักกันดี พอร์ตที่รู้จักกันดีสำหรับเว็บเซิร์ฟเวอร์คือ TCP พอร์ต 80

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

การเชื่อมต่อฝั่งไคลเอ็นต์ประกอบด้วยที่อยู่ IP ของคุณเช่น 192.168.1.25 และหมายเลขพอร์ตไดนามิกที่สุ่มเลือก ซ็อกเก็ตที่เกี่ยวข้องกับ Firefox ดูเหมือน 192.168.1.25:49175 เนื่องจากเว็บเซิร์ฟเวอร์ทำงานบนพอร์ต TCP 80 ซ็อกเก็ตทั้งสองนี้เป็นซ็อกเก็ต TCP ในขณะที่ถ้าคุณเชื่อมต่อกับเซิร์ฟเวอร์ที่ทำงานบนพอร์ต UDP ทั้งเซิร์ฟเวอร์และซ็อกเก็ตไคลเอ็นต์จะเป็นซ็อกเก็ต UDP


การอ้างอิงคุณภาพต่ำมาก ย่อหน้าที่สามใช้คำว่าซ็อกเก็ตในทางที่ผิดราวกับว่ามันหมายถึง 'ที่อยู่ IP' มันไม่ได้
user207421

2

ซ็อกเก็ตเป็นนามธรรมที่จัดทำโดยเคอร์เนลเพื่อการใช้งานของผู้ใช้สำหรับข้อมูล I / O ประเภทซ็อกเก็ตถูกกำหนดโดยโปรโตคอลการจัดการของมันการสื่อสาร IPC เป็นต้นดังนั้นหากใครบางคนสร้างซ็อกเก็ต TCP เขาสามารถทำกิจวัตรเช่นการอ่านข้อมูลไปยังซ็อกเก็ตและการเขียนข้อมูลไปยังมันด้วยวิธีการง่าย ๆ การส่งต่อแพ็คเก็ตไปยังโปรโตคอลเครือข่ายระดับที่ต่ำกว่าจะทำโดยการใช้ซ็อกเก็ตโดยเฉพาะในเคอร์เนล ข้อดีคือผู้ใช้ไม่จำเป็นต้องกังวลเกี่ยวกับการจัดการ nitigrities เฉพาะโปรโตคอลและควรอ่านและเขียนข้อมูลไปยังซ็อกเก็ตเหมือนบัฟเฟอร์ปกติ เช่นเดียวกันในกรณีของ IPC ผู้ใช้เพียงแค่อ่านและเขียนข้อมูลไปยังซ็อกเก็ตและเคอร์เนลจัดการรายละเอียดในระดับที่ต่ำกว่าทั้งหมดตามประเภทของซ็อกเก็ตที่สร้างขึ้น

พอร์ตพร้อมกับ IP ก็เหมือนกับการให้ที่อยู่กับซ็อกเก็ตแม้ว่าจะไม่จำเป็น แต่ก็ช่วยในการสื่อสารเครือข่าย


2

พอร์ตเดียวสามารถมีซ็อกเก็ตอย่างน้อยหนึ่งซ็อกเก็ตเชื่อมต่อกับ IP ภายนอกที่แตกต่างกันเช่นเต้าเสียบไฟฟ้าหลาย ๆ ตัว

  TCP    192.168.100.2:9001     155.94.246.179:39255   ESTABLISHED     1312
  TCP    192.168.100.2:9001     171.25.193.9:61832     ESTABLISHED     1312
  TCP    192.168.100.2:9001     178.62.199.226:37912   ESTABLISHED     1312
  TCP    192.168.100.2:9001     188.193.64.150:40900   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.23.194.149:43970   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.49.73.11:38842     ESTABLISHED     1312

2

ซ็อกเก็ตเป็นนามธรรมของจุดสิ้นสุดเครือข่ายที่ใช้เป็นส่วนต่อประสานกับแอปพลิเคชัน ใน Java, C # มันถูกแทนด้วยวัตถุใน Linux, Unix มันเป็นไฟล์

พอร์ตเป็นเพียงคุณสมบัติของซ็อกเก็ตที่คุณระบุหากคุณต้องการสร้างการสื่อสาร ในการรับแพ็คเก็ตจากซ็อกเก็ตคุณต้องผูกเข้ากับพอร์ตในเครื่องและ NIC (พร้อมด้วยที่อยู่ IP ในพื้นที่) หรือ NIC ทั้งหมด (INADDR_ANY ถูกระบุในการเรียก bind) ในการส่งแพ็คเก็ตคุณต้องระบุพอร์ตและ IP ของซ็อกเก็ตระยะไกล


1

ซ็อกเก็ตนั้นเป็นปลายทางสำหรับการสื่อสารเครือข่ายซึ่งประกอบด้วยที่อยู่ IP และพอร์ตอย่างน้อยที่สุด ใน Java / C # ซ็อกเก็ตเป็นการใช้งานในระดับที่สูงขึ้นของด้านหนึ่งของการเชื่อมต่อแบบสองทาง

นอกจากนี้ยังมีความหมายในเอกสาร Java


ใน Java Turorial คุณหมายถึง
user207421

1

ท่าเรือ:

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

เบ้า:

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


พอร์ต TCP หรือ UDP ไม่ได้อ้างอิงถึงสิ่งที่มีอยู่จริงหรือจุดเชื่อมต่ออีเธอร์เน็ต คุณยังไม่ได้ตอบคำถาม
user207421

1

พอร์ตหมายถึงปลายทางการสื่อสารในการขนส่ง TCP และ UDP สำหรับโปรโตคอลเครือข่าย IP ซ็อกเก็ตเป็นซอฟต์แวร์ที่เป็นนามธรรมสำหรับจุดปลายการสื่อสารที่ใช้กันทั่วไปในการใช้งานของโปรโตคอลเหล่านี้ (ซ็อกเก็ต API) อีกทางเลือกหนึ่งคือ XTI / TLI API

ดูสิ่งนี้ด้วย:

Stevens, WR 1998, การเขียนโปรแกรมเครือข่าย UNIX: API เครือข่าย: Sockets และ XTI; เล่มที่ 1, Prentice Hall
Stevens, WR, 1994, TCP / IP Illustrated, เล่มที่ 1: โปรโตคอล, Addison-Wesley

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