นี่เป็นคำถามที่เกิดจากวิศวกรซอฟต์แวร์คนหนึ่งในองค์กรของฉัน ฉันสนใจคำจำกัดความที่กว้างที่สุด
นี่เป็นคำถามที่เกิดจากวิศวกรซอฟต์แวร์คนหนึ่งในองค์กรของฉัน ฉันสนใจคำจำกัดความที่กว้างที่สุด
คำตอบ:
ซ็อกเก็ต 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 ถึง 65535 ที่ครอบคลุมซึ่งหมายถึงเกตแบบลอจิคัลในอุปกรณ์ ทุกการเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์ต้องการซ็อกเก็ตที่ไม่ซ้ำกัน
ตัวอย่างเช่น:
ซ็อกเก็ตหมายถึงการเชื่อมต่อเดียวระหว่างแอปพลิเคชั่นเครือข่ายทั้งสอง สองแอปพลิเคชันเหล่านี้ทำงานในคอมพิวเตอร์เครื่องอื่น แต่สามารถใช้ซ็อกเก็ตสำหรับการสื่อสารระหว่างกระบวนการในคอมพิวเตอร์เครื่องเดียว แอปพลิเคชั่นสามารถสร้างซ็อกเก็ตได้หลายช่องสำหรับการสื่อสารระหว่างกัน ซ็อกเก็ตเป็นแบบสองทิศทางซึ่งหมายความว่าทั้งสองด้านของการเชื่อมต่อมีความสามารถในการส่งและรับข้อมูล ดังนั้นซ็อกเก็ตสามารถสร้างขึ้นในทางทฤษฎีในทุกระดับของโมเดล 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
ด้วยการเปรียบเทียบบ้าง
แม้ว่าจะมีสิ่งทางเทคนิคมากมายที่ให้ไว้ข้างต้นสำหรับซ็อกเก็ต ... ฉันต้องการเพิ่มคำตอบของฉันในกรณีที่ถ้าใครบางคนยังไม่สามารถรู้สึกถึงความแตกต่างระหว่าง 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
ฉันหวังว่ามันจะช่วยให้คนที่ยังสับสนอยู่ :)
Firsty ฉันคิดว่าเราควรเริ่มด้วยความเข้าใจเพียงเล็กน้อยว่าการรับแพ็คเก็ตจาก A ถึง B เป็นอย่างไร
คำจำกัดความทั่วไปสำหรับเครือข่ายคือการใช้แบบจำลอง OSIซึ่งแยกเครือข่ายออกเป็นจำนวนเลเยอร์ตามวัตถุประสงค์ มีบางอย่างที่สำคัญซึ่งเราจะกล่าวถึงที่นี่:
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);
เป็นไปได้ เอ่อนั่นเป็นกุญแจไขให้กับงาน!
ตกลงจริง ๆ แล้วมันไม่ได้ สิ่งที่เราต้องทำคือหาคำจำกัดความที่เหมาะสม:
/var/run/database.sock
เป็นตัวแทนในระบบแฟ้มเช่นVoila! สิ่งนั้นเกิดขึ้น ดังนั้นในแผนของเรา
ดังนั้นจริงๆแล้วพอร์ตเป็นส่วนย่อยของข้อกำหนดสำหรับการสร้างซ็อกเก็ตอินเทอร์เน็ต น่าเสียดายที่มันเกิดขึ้นที่ความหมายของซ็อกเก็ตคำถูกนำไปใช้กับแนวคิดที่แตกต่างกันหลายประการ ดังนั้นฉันจึงแนะนำให้คุณตั้งชื่อซ็อกเก็ตโครงการต่อไปของคุณอย่างเต็มที่เพื่อเพิ่มความสับสน;)
ซ็อกเก็ต = ที่อยู่ IP + พอร์ต (ที่อยู่ตัวเลข)
พวกเขาช่วยระบุจุดสิ้นสุดสำหรับการเชื่อมต่อเครือข่ายบนเครื่อง (ฉันเพิ่งใช้เครือข่าย flunk 101 หรือไม่)
โดยทั่วไปแล้วคุณจะได้รับทฤษฎีมากมาย แต่วิธีที่ง่ายที่สุดวิธีหนึ่งในการแยกความแตกต่างของแนวคิดทั้งสองนี้มีดังนี้:
ในการรับบริการคุณต้องมีหมายเลขบริการ หมายเลขบริการนี้เรียกว่าพอร์ต เรียบง่ายเหมือนที่
ตัวอย่างเช่น HTTP เป็นบริการกำลังทำงานบนพอร์ต 80
ตอนนี้หลายคนสามารถร้องขอบริการและการเชื่อมต่อจากไคลเอนต์ - เซิร์ฟเวอร์ได้จัดตั้งขึ้น จะมีการเชื่อมต่อจำนวนมาก การเชื่อมต่อแต่ละรายการเป็นตัวแทนของลูกค้า เพื่อรักษาการเชื่อมต่อแต่ละเซิร์ฟเวอร์สร้างซ็อกเก็ตต่อการเชื่อมต่อเพื่อรักษาลูกค้า
ดูเหมือนว่าจะมีคำตอบมากมายเทียบกับซ็อกเก็ตกับการเชื่อมต่อระหว่างพีซี 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)
คำตอบสั้น ๆ
พอร์ตสามารถอธิบายเป็นที่อยู่ภายในที่อยู่ในพื้นที่ที่ระบุโปรแกรมหรือกระบวนการ
ซ็อกเก็ตสามารถอธิบายเป็นการเขียนโปรแกรมอินเตอร์เฟซที่ช่วยให้โปรแกรมสื่อสารกับโปรแกรมอื่น ๆ หรือกระบวนการในอินเทอร์เน็ตหรือท้องถิ่น
คำเหล่านี้มาจากสองโดเมนที่แตกต่างกัน: 'พอร์ต' เป็นแนวคิดจากเครือข่าย TCP / IP 'ซ็อกเก็ต' เป็นสิ่งที่ API (การเขียนโปรแกรม) 'ซ็อกเก็ต' ถูกสร้างขึ้น (ในรหัส) โดยการใช้พอร์ตและชื่อโฮสต์หรืออะแดปเตอร์เครือข่ายและรวมเข้าไปในโครงสร้างข้อมูลที่คุณสามารถใช้เพื่อส่งหรือรับข้อมูล
นี่เป็นแนวคิดเครือข่ายพื้นฐานดังนั้นฉันจะอธิบายให้เข้าใจง่ายในรายละเอียด
ดังนั้นซ็อกเก็ตในระบบเครือข่ายเป็นอุปกรณ์สื่อสารเสมือนที่ถูกผูกไว้กับคู่ (ip, พอร์ต) = (ที่อยู่, บริการ)
บันทึก:
หวังว่ามันจะเคลียร์คุณสงสัย
หลังจากอ่านคำตอบที่ได้รับการโหวตอย่างยอดเยี่ยมแล้วฉันพบว่าประเด็นต่อไปนี้ต้องการการเน้นย้ำสำหรับฉันซึ่งเป็นผู้ใช้ใหม่ในการเขียนโปรแกรมเครือข่าย:
การเชื่อมต่อ 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
...
123.132.213.231 # IP address
:1234 # port number
123.132.213.231:1234 # socket address
การเชื่อมต่อเกิดขึ้นเมื่อ 2 ซ็อกเก็ตถูกผูกเข้าด้วยกัน
ซ็อกเก็ตเป็นตัวจัดการไฟล์ชนิดพิเศษที่กระบวนการใช้เพื่อร้องขอบริการเครือข่ายจากระบบปฏิบัติการ ที่อยู่ซ็อกเก็ตเป็นสาม: {โปรโตคอล, ที่อยู่ในท้องถิ่น, กระบวนการในท้องถิ่น} ที่กระบวนการในท้องถิ่นจะถูกระบุด้วยหมายเลขพอร์ต
ในชุด 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 แม้ว่ามันจะไม่ได้มาตรฐาน แต่มันก็กลายเป็นมาตรฐานอุตสาหกรรมโดยพฤตินัย
ซ็อกเก็ตเป็นจุดสิ้นสุดการสื่อสาร ซ็อกเก็ตไม่เกี่ยวข้องโดยตรงกับตระกูลโปรโตคอล 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 ต้นทางเดียวกันทั้งหมดมาจาก ไคลเอ็นต์เดียวกัน แต่เนื่องจากมีพอร์ตต้นทางแตกต่างกันเซิร์ฟเวอร์จึงสามารถแยกความแตกต่างระหว่างกันได้ และเมื่อเซิร์ฟเวอร์ส่งการตอบกลับไปก็จะทำเช่นนั้นไปยังพอร์ตที่ร้องขอมาทางลูกค้าสามารถแยกความแตกต่างการตอบกลับที่ได้รับจากเซิร์ฟเวอร์เดียวกัน
พอร์ตเป็นส่วนที่ง่ายที่สุดมันเป็นเพียงตัวระบุเฉพาะสำหรับซ็อกเก็ต ซ็อกเก็ตเป็นกระบวนการที่สามารถใช้เพื่อสร้างการเชื่อมต่อและการสื่อสารซึ่งกันและกัน Tall Jeff มีการเปรียบเทียบโทรศัพท์ที่ยอดเยี่ยมซึ่งไม่สมบูรณ์ดังนั้นฉันจึงตัดสินใจแก้ไข:
netstat
แสดงผลบางครั้ง ซ็อกเก็ตทั้งหมดที่ยอมรับจากซ็อกเก็ตการฟังใช้พอร์ตเดียวกัน Ergoพอร์ตไม่ใช่ตัวระบุเฉพาะสำหรับซ็อกเก็ต
แอปพลิเคชันประกอบด้วยกระบวนการที่คู่สื่อสารผ่านเครือข่าย (คู่ไคลเอ็นต์ - เซิร์ฟเวอร์) กระบวนการเหล่านี้ส่งและรับข้อความเข้าและจากเครือข่ายผ่านอินเตอร์เฟซซอฟต์แวร์ที่เรียกว่าซ็อกเก็ต พิจารณาเปรียบเทียบที่นำเสนอในหนังสือ "ระบบเครือข่ายคอมพิวเตอร์: วิธีการจากบนลงล่าง" มีบ้านที่ต้องการสื่อสารกับบ้านอื่น ที่นี่บ้านคล้ายกับกระบวนการและประตูกับซ็อกเก็ต กระบวนการส่งถือว่าสันนิษฐานว่ามีโครงสร้างพื้นฐานอยู่อีกด้านหนึ่งของประตูที่จะขนส่งข้อมูลไปยังปลายทาง เมื่อข้อความมาถึงในอีกด้านหนึ่งมันจะผ่านประตูของผู้รับ (ซ็อกเก็ต) เข้าไปในบ้าน (กระบวนการ) ภาพประกอบจากหนังสือเล่มเดียวกันนี้สามารถช่วยคุณ:
Sockets เป็นส่วนหนึ่งของ transport layer ซึ่งให้การสื่อสารแบบลอจิคัลกับแอ็พพลิเคชัน ซึ่งหมายความว่าจากมุมมองของแอปพลิเคชันโฮสต์ทั้งสองเชื่อมต่อกันโดยตรงแม้ว่าจะมีเราเตอร์และ / หรือสวิตช์จำนวนมากระหว่างกัน ดังนั้นซ็อกเก็ตไม่ได้เชื่อมต่อตัวเองมันเป็นจุดสิ้นสุดของการเชื่อมต่อ โปรโตคอลเลเยอร์การขนส่งมีการใช้งานบนโฮสต์เท่านั้นและไม่ได้อยู่ในเราเตอร์ระดับกลาง
พอร์ตให้วิธีการที่อยู่ภายในไปยังเครื่อง วัตถุประสงค์หลักคืออนุญาตให้หลายกระบวนการส่งและรับข้อมูลผ่านเครือข่ายโดยไม่รบกวนกระบวนการอื่น ๆ (ข้อมูลของพวกเขา) ซ็อกเก็ตทั้งหมดมาพร้อมกับหมายเลขพอร์ต เมื่อเซกเมนต์มาถึงโฮสต์เลเยอร์การขนส่งจะตรวจสอบหมายเลขพอร์ตปลายทางของเซกเมนต์ จากนั้นส่งต่อเซ็กเมนต์ไปยังซ็อกเก็ตที่เกี่ยวข้อง งานในการส่งข้อมูลในเซสชั่นเลเยอร์การขนส่งไปยังซ็อกเก็ตที่ถูกต้องนี้เรียกว่าการทำมัลติเพล็ก ข้อมูลของกลุ่มนั้นจะถูกส่งต่อไปยังกระบวนการที่แนบกับซ็อกเก็ต
ซ็อกเก็ตเป็นโครงสร้างในซอฟต์แวร์ของคุณ มันเป็นไฟล์มากหรือน้อย มันมีการดำเนินงานเช่นอ่านและเขียน มันไม่ใช่เรื่องทางกายภาพ เป็นวิธีสำหรับซอฟต์แวร์ของคุณในการอ้างถึงสิ่งที่มีอยู่จริง
พอร์ตเป็นอุปกรณ์ที่เหมือนอุปกรณ์ แต่ละโฮสต์มีเครือข่ายหนึ่งเครือข่ายหรือมากกว่านั้น โฮสต์มีที่อยู่ในแต่ละเครือข่าย ที่อยู่แต่ละแห่งสามารถมีพอร์ตได้หลายพันพอร์ต
ซ็อกเก็ตเดียวเท่านั้นอาจใช้พอร์ตตามที่อยู่ ซ็อกเก็ตจัดสรรพอร์ตโดยประมาณเช่นการจัดสรรอุปกรณ์สำหรับระบบไฟล์ I / O เมื่อจัดสรรพอร์ตแล้วจะไม่มีซ็อกเก็ตอื่นที่สามารถเชื่อมต่อกับพอร์ตนั้นได้ พอร์ตจะถูกปลดปล่อยเมื่อซ็อกเก็ตถูกปิด
ลองดูที่TCP / IP คำศัพท์
จากOracle Java Tutorial :
ซ็อกเก็ตเป็นจุดปลายหนึ่งของลิงก์สื่อสารสองทางระหว่างสองโปรแกรมที่ทำงานบนเครือข่าย ซ็อกเก็ตถูกผูกไว้กับหมายเลขพอร์ตเพื่อให้เลเยอร์ TCP สามารถระบุแอปพลิเคชันที่ข้อมูลถูกกำหนดให้ส่ง
พอร์ตและซ็อกเก็ตสามารถเปรียบเทียบได้กับสาขาของธนาคาร
หมายเลขอาคารของ "ธนาคาร" นั้นคล้ายคลึงกับที่อยู่ IP ธนาคารมีหัวข้อต่าง ๆ เช่น:
ดังนั้น 1 (แผนกบัญชีออมทรัพย์), 2 (แผนกสินเชื่อส่วนบุคคล), 3 (แผนกสินเชื่อบ้าน) และ 4 (แผนกรับเรื่องร้องเรียน) เป็นพอร์ต
ตอนนี้ให้เราบอกว่าคุณไปเปิดบัญชีออมทรัพย์คุณไปที่ธนาคาร (ที่อยู่ IP) จากนั้นคุณไปที่ "แผนกบัญชีออมทรัพย์" (หมายเลขพอร์ต 1) จากนั้นคุณพบพนักงานคนหนึ่งที่ทำงานภายใต้ "แผนกบัญชีออมทรัพย์ " ให้เราเรียกเขาว่า SAVINGACCOUNT_EMPLOYEE1 เพื่อเปิดบัญชี
SAVINGACCOUNT_EMPLOYEE1 เป็นตัวบ่งชี้ซ็อกเก็ตของคุณดังนั้นอาจมี SAVINGACCOUNT_EMPLOYEE1 ถึง SAVINGACCOUNT_EMPLOYEEN นี่คือซ็อกเก็ตบ่งชี้ทั้งหมด
ในทำนองเดียวกันแผนกอื่น ๆ จะมีการจ้างงานที่ทำงานอยู่ภายใต้พวกเขาและพวกเขาจะคล้ายกับซ็อกเก็ต
ซ็อกเก็ตเป็นกลไก I / O ข้อมูล พอร์ตเป็นสัญญาแนวคิดของโปรโตคอลการสื่อสาร ซ็อกเก็ตสามารถมีอยู่ได้โดยไม่มีพอร์ต พอร์ตสามารถมีอยู่โดยไม่ใช้ซ็อกเก็ตเฉพาะ (เช่นถ้ามีหลายซ็อกเก็ตทำงานอยู่บนพอร์ตเดียวกันซึ่งอาจได้รับอนุญาตสำหรับโปรโตคอลบางตัว)
พอร์ตถูกใช้เพื่อกำหนดว่าซ็อกเก็ตที่ผู้รับควรกำหนดเส้นทางแพ็กเก็ตนั้นมีโปรโตคอลจำนวนมาก แต่ไม่จำเป็นเสมอไปและการเลือกซ็อกเก็ตที่รับสามารถทำได้ด้วยวิธีอื่น - พอร์ตนั้นเป็นเครื่องมือที่ใช้โดยตัวจัดการโปรโตคอลทั้งหมด ระบบย่อยเครือข่าย เช่นถ้าโปรโตคอลไม่ได้ใช้พอร์ตแพ็คเก็ตสามารถไปยังซ็อกเก็ตฟังทั้งหมดหรือซ็อกเก็ตใด ๆ
คำศัพท์สัมพัทธ์ TCP / IP ซึ่งเป็นสิ่งที่ฉันถือว่ามีนัยโดยคำถาม ในแง่ของคนธรรมดา:
พอร์ตเป็นเหมือนหมายเลขโทรศัพท์ของบ้านหลังหนึ่งในรหัสไปรษณีย์เฉพาะ รหัสไปรษณีย์ของเมืองอาจถือได้ว่าเป็นที่อยู่ IP ของเมืองและบ้านทั้งหมดในเมืองนั้น
ในทางกลับกัน SOCKET เป็นเหมือนการโทรศัพท์ระหว่างโทรศัพท์ของบ้านคู่หนึ่งที่คุยกัน การเรียกเหล่านั้นสามารถสร้างระหว่างบ้านในเมืองเดียวกันหรือบ้านสองหลังในเมืองต่าง ๆ มันเป็นเส้นทางที่สร้างขึ้นชั่วคราวระหว่างคู่โทรศัพท์ที่คุยกันนั่นคือซ็อกเก็ต
ซ็อกเก็ต - คือซ็อกเก็ตเหมือนกับปลั๊กไฟเคเบิลหรือโทรศัพท์ของคุณ จุดที่ "สิ่งจำเป็น" (พลังสัญญาณข้อมูล) สามารถออกไปข้างนอกและเข้ามาได้ มันซ่อนรายละเอียดจำนวนมากซึ่งไม่จำเป็นสำหรับการใช้ "สิ่งจำเป็น" ในสำนวนซอฟต์แวร์จะให้วิธีการทั่วไปในการกำหนดกลไกการสื่อสารระหว่างสองเอนทิตี (เอนทิตีเหล่านั้นอาจเป็นอะไรก็ได้ - สองแอปพลิเคชัน, อุปกรณ์สองตัวที่แยกจากกัน, พื้นที่ผู้ใช้ & เคอร์เนลภายในระบบปฏิบัติการ ฯลฯ )
พอร์ตคือเครื่องมือจำแนกปลายทาง มันแตกต่างหนึ่งปลายทางจากที่อื่น ที่ระดับเครือข่ายจะแยกแอปพลิเคชั่นหนึ่งออกจากอีกแอปหนึ่งเพื่อให้สแต็กเครือข่ายสามารถส่งผ่านข้อมูลไปยังแอปพลิเคชันที่เหมาะสม
มีคำตอบเชิงทฤษฎีสำหรับคำถามนี้แล้ว ฉันต้องการยกตัวอย่างการปฏิบัติสำหรับคำถามนี้ซึ่งจะช่วยให้คุณเข้าใจเกี่ยวกับซ็อกเก็ตและพอร์ตได้อย่างชัดเจน
ฉันพบมันที่นี่
ตัวอย่างนี้จะนำคุณสู่กระบวนการเชื่อมต่อกับเว็บไซต์เช่น 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
ซ็อกเก็ตเป็นนามธรรมที่จัดทำโดยเคอร์เนลเพื่อการใช้งานของผู้ใช้สำหรับข้อมูล I / O ประเภทซ็อกเก็ตถูกกำหนดโดยโปรโตคอลการจัดการของมันการสื่อสาร IPC เป็นต้นดังนั้นหากใครบางคนสร้างซ็อกเก็ต TCP เขาสามารถทำกิจวัตรเช่นการอ่านข้อมูลไปยังซ็อกเก็ตและการเขียนข้อมูลไปยังมันด้วยวิธีการง่าย ๆ การส่งต่อแพ็คเก็ตไปยังโปรโตคอลเครือข่ายระดับที่ต่ำกว่าจะทำโดยการใช้ซ็อกเก็ตโดยเฉพาะในเคอร์เนล ข้อดีคือผู้ใช้ไม่จำเป็นต้องกังวลเกี่ยวกับการจัดการ nitigrities เฉพาะโปรโตคอลและควรอ่านและเขียนข้อมูลไปยังซ็อกเก็ตเหมือนบัฟเฟอร์ปกติ เช่นเดียวกันในกรณีของ IPC ผู้ใช้เพียงแค่อ่านและเขียนข้อมูลไปยังซ็อกเก็ตและเคอร์เนลจัดการรายละเอียดในระดับที่ต่ำกว่าทั้งหมดตามประเภทของซ็อกเก็ตที่สร้างขึ้น
พอร์ตพร้อมกับ IP ก็เหมือนกับการให้ที่อยู่กับซ็อกเก็ตแม้ว่าจะไม่จำเป็น แต่ก็ช่วยในการสื่อสารเครือข่าย
พอร์ตเดียวสามารถมีซ็อกเก็ตอย่างน้อยหนึ่งซ็อกเก็ตเชื่อมต่อกับ 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
ซ็อกเก็ตเป็นนามธรรมของจุดสิ้นสุดเครือข่ายที่ใช้เป็นส่วนต่อประสานกับแอปพลิเคชัน ใน Java, C # มันถูกแทนด้วยวัตถุใน Linux, Unix มันเป็นไฟล์
พอร์ตเป็นเพียงคุณสมบัติของซ็อกเก็ตที่คุณระบุหากคุณต้องการสร้างการสื่อสาร ในการรับแพ็คเก็ตจากซ็อกเก็ตคุณต้องผูกเข้ากับพอร์ตในเครื่องและ NIC (พร้อมด้วยที่อยู่ IP ในพื้นที่) หรือ NIC ทั้งหมด (INADDR_ANY ถูกระบุในการเรียก bind) ในการส่งแพ็คเก็ตคุณต้องระบุพอร์ตและ IP ของซ็อกเก็ตระยะไกล
ซ็อกเก็ตนั้นเป็นปลายทางสำหรับการสื่อสารเครือข่ายซึ่งประกอบด้วยที่อยู่ IP และพอร์ตอย่างน้อยที่สุด ใน Java / C # ซ็อกเก็ตเป็นการใช้งานในระดับที่สูงขึ้นของด้านหนึ่งของการเชื่อมต่อแบบสองทาง
นอกจากนี้ยังมีความหมายในเอกสาร Java
ท่าเรือ:
พอร์ตสามารถอ้างถึงจุดเชื่อมต่อแบบฟิสิคัลสำหรับอุปกรณ์ต่อพ่วงเช่นพอร์ตอนุกรมพอร์ตขนานและพอร์ต USB คำว่าพอร์ตยังหมายถึงจุดเชื่อมต่ออีเธอร์เน็ตบางจุดเช่นเดียวกับที่อยู่บนฮับสวิตช์หรือเราเตอร์
เบ้า:
ซ็อกเก็ตหมายถึงการเชื่อมต่อเดียวระหว่างแอปพลิเคชั่นเครือข่ายทั้งสอง สองแอปพลิเคชั่นเหล่านี้ทำงานบนคอมพิวเตอร์ที่แตกต่างกัน แต่ซ็อกเก็ตยังสามารถใช้สำหรับการสื่อสารระหว่างกระบวนการในคอมพิวเตอร์เครื่องเดียว แอปพลิเคชั่นสามารถสร้างซ็อกเก็ตได้หลายซ็อกเก็ตสำหรับการสื่อสารระหว่างกัน ซ็อกเก็ตเป็นแบบสองทิศทางซึ่งหมายความว่าทั้งสองด้านของการเชื่อมต่อมีความสามารถในการส่งและรับข้อมูล
พอร์ตหมายถึงปลายทางการสื่อสารในการขนส่ง 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