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


236

สมมติว่าไม่มีที่สิ้นสุดประสิทธิภาพจากฮาร์ดแวร์กล่อง Linux สามารถรองรับ> 65536 เปิดการเชื่อมต่อ TCP?

ฉันเข้าใจว่าจำนวนพอร์ตชั่วคราว (<65536) จำกัด จำนวนการเชื่อมต่อจาก IP ท้องถิ่นหนึ่งไปยังหนึ่งพอร์ตบน IP ระยะไกลเดียว

tuple (โลคัล ip, โลคัลพอร์ต, รีโมตไอพี, รีโมตพอร์ต) คือสิ่งที่นิยามการเชื่อมต่อ TCP โดยเฉพาะ สิ่งนี้หมายความว่าการเชื่อมต่อมากกว่า 65K สามารถรองรับหากมีมากกว่าหนึ่งพารามิเตอร์เหล่านี้ฟรี เช่นการเชื่อมต่อไปยังหมายเลขพอร์ตเดียวบนโฮสต์ระยะไกลหลายแห่งจากหลาย IP ท้องถิ่น

มีข้อ จำกัด อีก 16 บิตในระบบหรือไม่ จำนวนไฟล์อธิบายอาจ?

คำตอบ:


350

พอร์ตฟังเดียวสามารถยอมรับการเชื่อมต่อมากกว่าหนึ่งพร้อมกัน

มีการ จำกัด '64K' ที่มักถูกอ้างถึง แต่นั่นเป็นต่อไคลเอนต์ต่อเซิร์ฟเวอร์พอร์ตและต้องการชี้แจง

แต่ละแพ็คเก็ต TCP / IP นั้นโดยทั่วไปมีสี่ฟิลด์สำหรับการกำหนดแอดเดรส เหล่านี้คือ:

source_ip source_port destination_ip destination_port
< client            > < server                      >

ภายในสแต็ก TCP ฟิลด์ทั้งสี่นี้จะใช้เป็นคีย์ผสมเพื่อจับคู่แพ็คเก็ตกับการเชื่อมต่อ (เช่นตัวอธิบายไฟล์)

หากไคลเอนต์มีการเชื่อมต่อจำนวนมากไปยังพอร์ตเดียวกันบนปลายทางเดียวกันดังนั้นฟิลด์สามฟิลด์นั้นจะเหมือนกัน - จะsource_portแตกต่างกันไปตามการเชื่อมต่อที่แตกต่าง พอร์ตคือหมายเลข 16 บิตดังนั้นจำนวนการเชื่อมต่อสูงสุดที่ไคลเอ็นต์ที่กำหนดสามารถมีพอร์ตโฮสต์ที่กำหนดคือ 64K

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

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

ขีด จำกัด ที่สมจริงที่เกิดขึ้นสำหรับกล่องปกติอยู่ที่ประมาณ 80K ตัวอย่างเช่นเซิร์ฟเวอร์ส่งข้อความ Jabber แบบเธรดเดี่ยว


3
ในทางทฤษฎีคุณสามารถมีการเชื่อมต่อขาออกได้มากกว่า 64K หากคุณ (ก) ใช้ SO_REUSEADDR และ (b) กำหนดเป้าหมายที่อยู่ IP ปลายทางอื่น แต่ขีด จำกัด หน่วยความจำเคอร์เนลอาจหยุดคุณก่อน
Darron

4
ขีด จำกัด sysctl สำหรับทั้งระบบใช่ไหม นอกจากนี้ยังมีขีด จำกัด ที่สามารถกำหนดค่าได้ด้วย ulimit ซึ่ง จำกัด จำนวนตัวอธิบายไฟล์สูงสุดสำหรับกระบวนการ นั่นคือโดยค่าเริ่มต้นน้อยกว่า 300K โดยทั่วไปคือ 1024
pacoverflow

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

2
@ จะอธิบายได้อย่างสวยงาม !! มีประโยชน์มาก ... ต้องการให้ผู้โหวต +100 ขึ้นไป ... ขอบคุณ :-)
Tom Taylor

1
โปรดทราบว่า tcp_fin_timeout บล็อกซ็อกเก็ตเดียวกัน (แหล่งที่มาเป้าหมายการรวมกันของพอร์ต) เป็นเวลา 60 วินาทีโดยค่าเริ่มต้นซึ่งจะลดจำนวนการเชื่อมต่อ tcp ที่ใช้งานได้จริงอย่างมากระหว่างสองระบบหากการเชื่อมต่อถูกตัดการเชื่อมต่อ ปัญหานี้สามารถลดลงได้ด้วยการอนุญาตให้ใช้ซ็อกเก็ตใหม่ (tcp_tw_reuse = 1) ในสถานะ TIME_WAIT (ไม่ได้รับการสนับสนุนเสมอ) หรือแบ่งเป็นมาตรฐาน TCP / IP ในการลดการหมดเวลานี้เป็นค่าที่ต่ำกว่า
fgwaller

17

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


14
C10k มีอายุ 10 ปีและไม่สนุกอีกต่อไป [อ่านสิ่งนี้] เพื่อดูว่า C1024K สามารถจัดการได้อย่างไร
Chandranshu

@Chandranshu - คุณหมายถึงmetabrew.com/article/…หรือเปล่า
Mikko Rantalainen

1
@MikkoRantalainen - ใช่ ฉันคิดว่าตอนนี้มีมาตรฐานที่ดีกว่าแล้ว คนฟีนิกซ์ได้ผลักดันมันให้เชื่อมต่อพร้อมกัน 2 ล้าน
Chandranshu

3
@Chandranshu - มีการสาธิตของ Dell พร้อมการเชื่อมต่อ 12M: mrotaru.wordpress.com/2013/06/20/…
Mikko Rantalainen

1
ไม่กี่ปีที่ผ่านมา: Intel Atom D2700, 2GB RAM, 1.2M การเชื่อมต่อพร้อมกัน ปัญหาเดียวที่ฉันมีคือกล่อง Windows ในการทดสอบ; เหล่านี้เป็นประจำไปท้องขึ้นขณะที่พยายามจะ DoS ของ Intel Atom กล่อง ...
Klaws

12

หากคุณใช้ซ็อกเก็ต raw ( SOCK_RAW) และใช้ TCP อีกครั้งใน userland ฉันคิดว่าคำตอบจะถูก จำกัด ในกรณีนี้เฉพาะกับจำนวนของ(local address, source port, destination address, destination port)tuples (~ 2 ^ 64 ต่อที่อยู่ในพื้นที่เท่านั้น)

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

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