TCP สามารถให้มากกว่า 65535 พอร์ตได้หรือไม่


50

เป็นไปได้ไหมที่จะติดตั้งระบบ Linux เพื่อให้มีพอร์ตมากกว่า 65,535 พอร์ต? เจตนาจะให้ daemons มากกว่า 65k ฟังในระบบที่กำหนด

เห็นได้ชัดว่ามีการใช้พอร์ตดังนั้นจึงเป็นไปไม่ได้ด้วยเหตุผลเหล่านี้ดังนั้นให้คิดว่านี่เป็นแบบฝึกหัดเชิงทฤษฎีในการพยายามทำความเข้าใจว่า TCP จะมีข้อ จำกัด ในการทำสิ่งนี้อย่างไร


11
แรงจูงใจสำหรับคำถามนี้คืออะไร? ทำไมคุณถึงอยากฟัง daemons มากมาย
Warren Young

1
นอกจากนี้คุณจะมีช่วงเวลาที่ยากลำบากในการเริ่มกระบวนการมากมาย (ฉันถือว่าคุณหมายถึงหนึ่งกระบวนการต่อ daemon)
Warren Young

13
ในขณะที่ไม่มีสิ่งใดที่ จำกัด คุณอย่างเป็นทางการจากการสวมกางเกง 65 คู่ในครั้งเดียวมันจะเป็นความงี่เง่าที่เป็นประโยชน์ในการลอง หากคุณสามารถแสดงให้ฉันเห็นเครื่องจักรที่สามารถประมวลผลพอร์ต 10'000 TCP พร้อมกันได้อย่างมีประสิทธิภาพนี่อาจเป็นคำถามนามธรรมที่น่าสนใจ
msw

13
ธรรมชาติของ Q นี้เป็นทฤษฎีอย่างสมบูรณ์ไม่มีวัตถุประสงค์อื่นนอกเหนือจากการทำความเข้าใจข้อ จำกัด ของ TCP & # ของพอร์ต
slm

1
อย่างไรก็ตามสิ่งนี้คือคุณได้ใช้ถ้อยคำในลักษณะที่เชื่อมโยงกับเรื่องการปฏิบัติต่างๆ ที่เกี่ยวข้องกับพื้นที่ RAM ที่กระบวนการ 64k + daemon ต้องการ เครื่องใด ๆ ที่คุณน่าจะมีตอนนี้หรือในทศวรรษหน้าหรือมากกว่านั้นจะหมด RAM ก่อนที่คุณจะถึงขีด จำกัด ของผู้ฟัง หากคุณใช้คำถามใหม่เพื่อพูดคุยเกี่ยวกับ TCP listenersเพียงอย่างเดียวปล่อยให้การพูดคุยเกี่ยวกับ daemons หมดไปปัญหานี้จะหายไป คุณสามารถชดเชยพื้นที่สแต็กได้ด้วยการกำหนดซ็อกเก็ตหนึ่งพันซ็อกเก็ตให้กับ daemon ที่ขับเคลื่อนด้วยเหตุการณ์เดี่ยวเธรดแต่ละตัว
Warren Young

คำตอบ:


84

เมื่อดูที่ RFC สำหรับ TCP: RFC 793 - โปรโตคอลควบคุมการส่งคำตอบดูเหมือนจะไม่ใช่เพราะข้อเท็จจริงที่ว่าส่วนหัวของ TCP ถูก จำกัด ไว้ที่ 16 บิตสำหรับเขตข้อมูลพอร์ตต้นทาง / ปลายทาง

    เอสเอส # 1

IPv6 ปรับปรุงสิ่งต่างๆหรือไม่?

ไม่แม้ว่า IPv6 จะให้พื้นที่ที่อยู่ IP ที่ใหญ่กว่ามากถึง 32 บิตกับ 128 บิต แต่ก็ไม่ได้พยายามปรับปรุงขีด จำกัด ของแพ็กเก็ต TCP ที่ 16 บิตสำหรับหมายเลขพอร์ต น่าสนใจ RFC สำหรับ IPv6: Internet Protocol, ข้อมูลจำเพาะรุ่น 6 (IPv6) , ฟิลด์ IP จำเป็นต้องมีการขยาย

เมื่อ TCP ทำงานผ่าน IPv6 วิธีการที่ใช้ในการคำนวณ checksum จะเปลี่ยนไปตามRFC 2460 :

การขนส่งหรือโปรโตคอลชั้นบนอื่น ๆ ที่มีที่อยู่จากส่วนหัว IP ในการคำนวณการตรวจสอบจะต้องแก้ไขเพื่อใช้งานผ่าน IPv6 เพื่อรวมที่อยู่ 128- บิต IPv6 แทนที่อยู่ IPv4 32 บิต

                 เอสเอส # 2

ดังนั้นคุณจะได้รับพอร์ตเพิ่มเติมได้อย่างไร

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

หมายเหตุ:การใช้นามแฝงได้รับการแทนที่โดยiproute2ที่คุณสามารถใช้เพื่อสแต็คที่อยู่ IP ในอินเตอร์เฟซเดียว (เช่นeth0) แทน

ตัวอย่าง

$ sudo ip link set eth0 up
$ sudo ip addr add 192.0.2.1/24 dev eth0
$ sudo ip addr add 192.0.2.2/24 dev eth0
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
      pfifo_fast state DOWN qlen 1000
    link/ether 00:d0:b7:2d:ce:cf brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.1/24 brd 192.0.2.255 scope global eth1
    inet 192.0.2.2/24 scope global secondary eth1

แหล่งที่มา: iproute2: ชีวิตหลังจาก ifconfig

อ้างอิง


3
จะไม่สามารถเลือกระหว่าง 65,536+ daemons โดยใช้พอร์ตปลายทางเพียงอย่างเดียว แต่หากมีหน่วยความจำและแบนด์วิดท์ไม่ จำกัด สามารถมีการเชื่อมต่อมากกว่า 32,000 กับทุกที่อยู่ TCP ที่แตกต่างกันในทุกพอร์ตที่เข้ามา
supercat

7

เป็นไปได้ไหมที่จะติดตั้งระบบ Linux เพื่อให้มีพอร์ตมากกว่า 65,535 พอร์ต?

Nope

เจตนาจะให้ daemons มากกว่า 65k ฟังในระบบที่กำหนด

จากนั้นคุณต้อง:

  • การiptablesกำหนดค่าที่เปลี่ยนเส้นทางเนื้อหาการจราจรหรือ

  • "บริการนายหน้าบริการ" หรือ "บริการมัลติเพล็กเซอร์" ที่จะยอมรับการเชื่อมต่อขาเข้าบนพอร์ตเดียวและกำหนดเส้นทางไปยังดีมอนที่เหมาะสม "ด้านหลัง" หากคุณต้องการให้โปรโตคอลมาตรฐานผ่านการไม่แก้ไขคุณอาจต้องใช้การดมกลิ่น / การรับรู้โปรโตคอลในบริการมัลติเพล็กเซอร์นี้ในลักษณะที่ไฟร์วอลล์ IDS หรือเลเยอร์ -7 จะเปิดใช้งาน เป็นไปได้อย่างสมบูรณ์กับโปรโตคอลส่วนใหญ่

ในรายการที่สองคุณสามารถออกแบบบริการนี้เพื่อจัดการพอร์ตมากกว่า 2 ^ 16 "พอร์ต" หากคุณต้องการ ฉันแน่ใจว่าผลกระทบของประสิทธิภาพจะน้อยที่สุดเมื่อเทียบกับโหลดของ 2 ^ 16 + ผู้ฟังที่ทำงานอยู่

Daemons ใน Linux สามารถฟังบนซ็อกเก็ตยูนิกซ์ที่มีอยู่ในระบบไฟล์ดังนั้น "บริการมัลติเพล็กเซอร์" ของคุณสามารถรักษาการแมปภายในพอร์ตภายนอก <-> ซ็อกเก็ตยูนิกซ์ภายในได้ คุณอาจจะพบกับข้อ จำกัด กระบวนการเคอร์เนล (กระบวนการ 32Kbyte?) ก่อนที่จะหมด inodes ในระบบไฟล์ที่ทันสมัย


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

2
มากกว่า 64K พอร์ตในระบบเดียวเป็นไปไม่ได้ มีผู้ฟังมากกว่า 64K ที่เป็นไปได้ แต่คุณต้องมีพร็อกซีหรือผู้ฟังส่วนหน้าที่จะ "แยก" การเชื่อมต่อขาเข้ากับผู้ฟัง "แบ็กเอนด์" ที่แท้จริง คุณสามารถทำสิ่งที่บ้าเช่น NAT ภายในเป็นหลายที่อยู่ IP ภายในตัวอย่างเช่น
LawrenceC

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

2

เพียงเพราะไม่มีคำตอบที่ดีฉันต้องการที่จะพูดสอด

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

คุณจะใช้ตัวเลือกนี้และเป็นข้อมูลเพื่อขยายแหล่งปลายทางหรือหมายเลขพอร์ตทั้งสอง

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

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

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

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

เซิร์ฟเวอร์ Http สามารถทำเช่นนี้หรือเซิร์ฟเวอร์ประเภทอื่น

สิ่งสำคัญที่ควรจำเมื่ออนุญาตให้ใช้พอร์ตซ้ำคือคุณต้องคำนึงถึงที่อยู่ IP ต้นทางด้วย


-2

ใช่คุณสามารถ !

มันเคยทำมาแล้วตัวอย่างเช่นเซิร์ฟเวอร์การเข้ารหัส Edgehill ซึ่งมี deamons มากกว่า 500,000 อันทำงานออนไลน์


9
พิจารณาการขยายคำตอบของคุณเพื่อให้มีคำแนะนำบางอย่างเกี่ยวกับวิธีที่ OP อาจทำสิ่งนี้ได้สำเร็จเอกสารที่สนับสนุนคำตอบของคุณหรือคำอธิบายที่เกี่ยวข้อง
HalosGhost

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