เว็บไซต์ที่มีปริมาณการใช้งานสูงมีการเชื่อมต่อ TCP มากกว่า 65535 อย่างไร


29

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

คำตอบ:


55

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

ในระดับ TCP นั้น tuple (IP ต้นทาง, พอร์ตต้นทาง, ปลายทาง IP, พอร์ตปลายทาง) จะต้องไม่ซ้ำกันสำหรับการเชื่อมต่อพร้อมกันแต่ละครั้ง นั่นหมายความว่าไคลเอนต์เดียวไม่สามารถเปิดมากกว่า 65535 การเชื่อมต่อไปยังเซิร์ฟเวอร์พร้อมกัน แต่เซิร์ฟเวอร์สามารถ (ทฤษฎี) เซิร์ฟเวอร์ 65535 เชื่อมต่อพร้อมกันต่อลูกค้า

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


ฉันสงสัยว่า NAT ระดับผู้ให้บริการจะมีผลกับสิ่งนี้อย่างไร
TheLQ

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

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

14

คุณเข้าใจผิด - เอกลักษณ์ของซ็อกเก็ตนั้นพิจารณาจากปัจจัยสี่ประการ:

  1. ที่อยู่ IP ท้องถิ่น
  2. หมายเลขพอร์ตท้องถิ่น
  3. ที่อยู่ IP ระยะไกล
  4. หมายเลขพอร์ตระยะไกล

เมื่อเสนอบริการเครือข่าย 1 และ 2 โดยทั่วไปจะเป็นแบบคงที่ (เช่น IP 10.0.0.1, พอร์ต 80) แต่หากคุณคาดหวังว่าจะมีการเชื่อมต่อหลายพันรายการจากไคลเอนต์เดียว (หรือเกตเวย์ NAT เดียว) คุณจะไม่ผลักดัน ขอบเขตสำหรับการรวมกันที่เป็นไปได้ของ 3 และ 4 ก่อนที่คุณจะหมดทรัพยากรในท้องถิ่น

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

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


2

คำถามคือวิธีจัดการกับการเชื่อมต่อขนาดใหญ่ (> 64k) สองวิธีที่พบบ่อยที่สุดคือ:

  • เพิ่มเซิร์ฟเวอร์มากขึ้นซึ่งจะเพิ่มจำนวนที่อยู่ src / dst และหมายเลขพอร์ต tuples มีหลายวิธีในการแชร์โหลดข้ามเซิร์ฟเวอร์หลายเครื่อง DNS round robin เป็นหนึ่งเดียว มีคนอื่น ๆ

  • ปรับใช้ "NAT ระดับผู้ให้บริการ" (ซึ่งเพื่อนดูถูกและถูกต้องในมุมมองของฉันหมายถึง "NAT ระดับ crummier") นี่คือ NAT ของ NAT สิ่งนี้มีผลกระทบที่เลวร้ายมากสำหรับแอปพลิเคชัน แต่เป็นสิ่งที่ผู้ให้บริการรายใหญ่ทำเมื่อพื้นที่ IPv4 และ / หรือหมายเลขพอร์ตไม่เพียงพอและ / หรือพวกเขาไม่ต้องการย้ายไปใช้ IPv6


2
หากคุณอ่านมากกว่าชื่อคุณจะเห็นว่าคำถามนี้เกี่ยวกับการอ่อนเพลียของพอร์ตและ OP ผิดพลาดเกี่ยวกับวิธีการทำงาน คำตอบนี้เพิ่มมูลค่าใหม่ให้กับสิ่งนั้นอย่างไร?
MDMarra

2
OP ถามอย่างชัดเจน (และไม่ใช่แค่พาดหัว) "เซิร์ฟเวอร์ทำอย่างไรจึงมีจำนวนสูงมาก ... คำขอ" ทิ้งความสับสนไว้ในการทำงานของซ็อกเก็ตนั่นเป็นคำถามที่ถูกต้อง
user8162

1
งานที่ยอดเยี่ยมของการตัดคำถามกลางประโยค ประโยคที่เหลือพูดว่า: (more than the max port number).
MDMarra

2
บางทีคุณพลาดส่วนที่ฉันระบุ OP ไม่เข้าใจกลไกซ็อกเก็ต ฉันคิดว่าวิธีที่เกิน 64k พอร์ตเป็นหัวข้อที่ถูกต้องสำหรับการอภิปราย ฉันขอโทษถ้าคุณไม่เห็นด้วย แต่นั่นเป็นคำถามและนั่นคือสิ่งที่ฉันให้คำตอบสองสามข้อ คุณถามว่าสิ่งนี้ตอบสนองอย่างไร; นั่นเป็นวิธี
user8162

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