การทำความเข้าใจพอร์ต: แท็บเบราว์เซอร์หลายแท็บสื่อสารในเวลาเดียวกันได้อย่างไร [ปิด]


18

ฉันรู้วันนี้ว่าฉันไม่เข้าใจว่าการสื่อสารพอร์ตทำงานอย่างไร

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

อย่างไรก็ตามฉันไม่สามารถเริ่มต้นอินสแตนซ์ของเซิร์ฟเวอร์ได้สองอินสแตนซ์ทั้งฟังพอร์ต 80 เนื่องจากทำให้พอร์ตขัดแย้งกัน

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

คำตอบ:


24

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

รายละเอียดเพิ่มเติมที่นี่


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

5
@ viraptor: จริง แต่เนื่องจาก UDP ไม่มีการเชื่อมต่อจึงไม่มีความแตกต่างระหว่าง "ฟัง" และ "รับ"
อดัมโรบินสัน

แนวคิดเดียวกันทำงานร่วมกับ TCP กระบวนการฟอร์กด้วยซ็อกเก็ตการฟังและการยอมรับ () ทั้งคู่
viraptor

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

14

เบราว์เซอร์เชื่อมต่อจากพอร์ตสุ่มสูง (เช่น> 1024) บนคอมพิวเตอร์ของคุณไปยังพอร์ตของเซิร์ฟเวอร์ระยะไกล 80 ดังนั้นจึงไม่มีข้อขัดแย้งของพอร์ตในเครื่องของคุณ

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


2
นี่คือคำตอบที่ถูกต้อง การเชื่อมต่อ TCP มีหมายเลขพอร์ตที่ปลายทั้งสอง คอมพิวเตอร์ทั้งสองเครื่องที่เกี่ยวข้องสามารถแยกแยะความแตกต่างระหว่างเว็บไซต์เชื่อมต่อ: 80 <-> เบราว์เซอร์: 12397 และเว็บไซต์เชื่อมต่ออื่น: 80 <-> เบราว์เซอร์: 22958
pjc50

7

เซิร์ฟเวอร์ที่รับฟังพอร์ต 80 ไม่จำเป็นต้องจัดการกับกระบวนการหลายอย่าง Simple TCP daemons ของ elder years สามารถจัดการได้ครั้งละหนึ่งการเชื่อมต่อเท่านั้น คุณสามารถเลียนแบบพฤติกรรมนี้ได้โดยมีโปรแกรมเช่นnetcatฟังพอร์ตที่เฉพาะเจาะจงและลองเชื่อมต่อสองเครื่อง หนึ่งจะได้รับในอื่น ๆ จะกระเด็นโดยไม่ต้องเชื่อมต่อ daemons เหล่านี้ส่วนใหญ่ไร้ประโยชน์ดังนั้นคุณจะไม่เห็นพวกเขาอีกต่อไป

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

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

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

วิธีใดในแนวทางเหล่านี้มีประสิทธิภาพมากขึ้นขึ้นอยู่กับระบบปฏิบัติการ IIRC, Apache สามารถทำงานในโหมดใดโหมดหนึ่ง

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

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


+1 สำหรับการที่เหมาะสมในหลาย ๆ :)
ไมเคิลโลว์

2

ซ็อกเก็ตสตรีม "ประเภท" สองช่องทางมีประสิทธิภาพ หนึ่งมี wild-card "ปลายอื่น ๆ " หนึ่งมีโฮสต์เฉพาะ: พอร์ตสำหรับปลายอื่น ๆ

ไม่มีซ็อกเก็ตสองตัวที่สามารถ (หรือควรจะเท่ากัน) มีตัวระบุ "ปลายนี้" และ "ปลายอื่น" ที่เหมือนกัน ซ็อกเก็ตที่ "รับฟัง" (ยอมรับการเชื่อมต่อขาเข้า) เป็นซ็อกเก็ตที่มี wild-card "ปลายอีกด้าน" ดังนั้นจึงสามารถมีได้ครั้งละหนึ่งรายการเท่านั้น เมื่อการเชื่อมต่อมาถึงacceptจะมีการส่งคืนซ็อกเก็ตพร้อมโฮสต์: พอร์ต tuple สำหรับปลายอีกด้าน


1

คำถามของคุณทำให้ฉันนึกถึงตัวเองไม่กี่ปีก่อนที่ Cisco CCNA - มีข้อสงสัยเดียวกัน :)

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

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

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

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