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
การเป็นลูกของกระบวนการนั้นและรับช่วงหนึ่งหรือถูกผ่านอย่างชัดเจนหนึ่งซ็อกเก็ตจากกระบวนการนั้น