65536 +1 การเชื่อมต่อบนระบบ


35

มี65536 พอร์ตสำหรับทุกระบบในเครือข่ายและทุกการเชื่อมต่อหรือส่ง / รับจะใช้หนึ่งในนั้น

คำถามของฉันคือ: จะเกิดอะไรขึ้นถ้าเรามีคนรู้จัก 65536 คน + 1 คน !

ฉันรู้ว่ามันไม่ได้เกิดขึ้นตามปกติ แต่ฉันอยากรู้ว่าระบบปฏิบัติการจัดการกับมันอย่างไร


12
การเชื่อมต่อจะถูกปฏิเสธ แต่คุณจะมีปัญหาจริงนานก่อนที่จะเปิดการเชื่อมต่อ 65535
ChrisInEdmonton

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

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

คำตอบ:


61

โปรดทราบว่าระบบสามารถรองรับการเชื่อมต่อพร้อมกันมากกว่า 65536 รายการเนื่องจากไม่จำเป็นต้องใช้แต่ละพอร์ตแยกต่างหาก

การเชื่อมต่อ TCP หรือ UDP flow ถูกกำหนดโดย 4-tuple:

(source IP address, source port, destination IP address, destination port)

ดังนั้นแม้ว่าคุณจะมีเครื่องเว็บเซิร์ฟเวอร์ที่มีเพียงที่อยู่ IP เดียวและแพคเกจซอฟต์แวร์เซิร์ฟเวอร์ HTTP เดียวฟังเฉพาะในพอร์ต 80 ก็ในทางทฤษฎีสามารถจัดการการเชื่อมต่อ 65536 ต่อลูกค้าที่อยู่ IP การเชื่อมต่อ ดังนั้นการเชื่อมต่อ 64Ki จากที่อยู่ IP ของลูกค้า 1 รวมถึงการเชื่อมต่อ 64Ki จากที่อยู่ IP ของลูกค้า 2 เป็นต้น

ดังนั้นโปรโตคอลจึงสนับสนุนการประมาณแรกคือ 2 48การเชื่อมต่อ / การไหลไปยังพอร์ต TCP หรือ UDP เดียวบนที่อยู่ IPv4 เดียว พิจารณาทั้ง TCP และ UDP ด้วยกันและทั้งพื้นที่ที่อยู่ของ IPv4 และพื้นที่แอดเดรสขนาดใหญ่ของ com / comically และ IPv6 ของ IPv6 และคุณสามารถเห็นว่าโปรโตคอลเองนั้นไม่น่าจะเป็นแหล่งที่มาของจำนวน จำกัด ของจำนวนการเชื่อมต่อพร้อมกันที่โฮสต์ สามารถจัดการ

ในทำนองเดียวกันไม่มีอะไรในโปรโตคอล TCP หรือ UDP ที่ป้องกันไม่ให้เครื่องไคลเอนต์ใช้พอร์ตแหล่งเดียวบนที่อยู่ IP เดียวเพื่อทำการเชื่อมต่อขาออกหลายครั้งไปยังที่อยู่เซิร์ฟเวอร์และพอร์ตต่างๆ บางครั้ง API เครือข่ายของระบบปฏิบัติการที่ระบุอาจไม่ง่าย แต่สิ่งสำคัญคือต้องจำไว้ว่า API "[BSD] Sockets" ที่เก่าแก่ที่น่านับถือคือ API เพียงหนึ่งเดียวกับ TCP และ UDP TCP และ UDP อาจมีความสามารถที่ไม่ได้เปิดเผยโดย Sockets API แบบดั้งเดิม

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


2
อาจคุ้มค่าที่จะลิงก์ไปยังen.wikipedia.org/wiki/C10k_problemในคำตอบที่ยอดเยี่ยมนี้
ChrisInEdmonton

1
ฉันใช้เซิร์ฟเวอร์ TCP ซึ่งสามารถรองรับการเชื่อมต่อ 65,534 จากทุกที่อยู่ IP ที่เป็นไปได้พร้อมกัน มันไม่ได้ทำอะไรมาก - มันแค่สะท้อนข้อความที่เข้ามาด้วยการแทนที่ตัวละครสองสามตัว - แต่มันทำงานบนแพลตฟอร์มฮาร์ดแวร์ขนาดเล็กมาก ฉันไม่คิดว่ามันเป็นไปตาม RFC แต่ดูเหมือนว่าจะทำงานได้ดีแม้ว่าจะไม่รู้หรือไม่สนใจว่ามีการเชื่อมต่อ TCP จำนวนเท่าใดที่เปิดอยู่ในพอร์ตส่วนใหญ่
supercat

2
หากคุณจริงๆต้องเชื่อมต่อมากกว่า 65536 การเชื่อมต่อระหว่างสองเครื่องแล้วคุณสามารถตั้งค่าเครื่องใช้ที่อยู่ IP หลาย ที่อยู่ IP แต่ละรายการที่คุณเพิ่มลงในเครื่องสองเครื่องจะเพิ่มจำนวนการเชื่อมต่อสูงสุดเป็นสองเท่า (อย่างน้อยในทางทฤษฎีคุณจะพบกับปัญหาอื่น ๆ ก่อน)
โกหกไรอัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.