วิธีที่จะทำให้การทำงานหลายเกมได้อย่างน่าเชื่อถือหลัง NAT?


20

แม้กระทั่งเกมที่เป็นไคลเอนต์ / เซิร์ฟเวอร์ 100% บางครั้งก็มีปัญหาเมื่อไคลเอนต์อยู่หลัง NAT เกม Peee-peer เป็นปัญหาที่ใหญ่กว่า เกมบางเกมจำเป็นต้องใช้การส่งสัญญาณหลายครั้ง (เช่น UDP และ TCP) หรือการเชื่อมต่อที่หลากหลาย (เช่นพอร์ต UDP ที่แตกต่างกันสำหรับเสียง)

มีวิธีใดบ้างที่จะทำให้แน่ใจว่าเกมทำงานได้อย่างน่าเชื่อถือเมื่อใช้งานเราเตอร์ NAT?

  • เพียร์ - เพียร์: ไม่มีเซิร์ฟเวอร์ส่วนกลางอยู่ ผู้เล่น A เริ่มเกมและผู้เล่น B ต้องการเข้าร่วม
  • ไคลเอนต์ - เซิร์ฟเวอร์: เซิร์ฟเวอร์ส่วนกลางที่อยู่ที่รู้จักกันดี (ชื่อโฮสต์) ยอมรับการเชื่อมต่อที่เข้ามาทั้งหมด ลูกค้าแต่ละรายสื่อสารกับเซิร์ฟเวอร์นั้นเท่านั้น
  • คำสั่งผสม: ตำแหน่งที่เซิร์ฟเวอร์กำลังทำการจับคู่ แต่การอัปเดตเกมเป็นแบบ peer-peer คนรอบข้างที่แตกต่างกันอาจเห็นผู้เล่นแต่ละคนที่มี IP / พอร์ตต่างกันที่อาจเกิดขึ้น (เช่นลูกค้าบางรายอยู่หลัง NAT เดียวกันและบางคนอยู่ในเราเตอร์ที่แตกต่างกัน)

คำตอบ:


9

เทคนิคที่ใช้กันมากที่สุดจะเรียกว่า NAT หมัดผ่าน นี่คือบทนำดี: http://www.mindcontrol.org/~hplus/nat-punch.html

มีโครงการ OSS เป็นอย่างน้อยสำหรับ UDP: http://udt.sourceforge.net/index.html

RakNet สนับสนุนหมัดผ่านเกินไปผมเชื่อว่า มันเป็นเชิงพาณิชย์ แต่มีฟรี "อินดี้" ใบอนุญาต ดูที่นี่: http://www.jenkinssoftware.com/

Googling สำหรับ "NAT หมัด" คุณจะได้รับอีกมากมายอ่านเนื้อหา


1
ฉันรู้ว่านี่เป็นคำถามและคำตอบที่เก่ามาก แต่ถ้าใครอ่านนี่ RakNet ได้มาจาก OculusVR และตอนนี้โอเพ่นซอร์สพร้อมใบอนุญาต BSD 2 ข้อ github.com/OculusVR/RakNet
Quad

9
  • ไม่มีลูกค้าแจ้งเซิร์ฟเวอร์หรือเพื่อนของที่อยู่ของตัวเอง กล่าวอีกนัยหนึ่งไม่ได้ฝัง IP ของลูกค้า A ในแพ็คเก็ตเกมและให้ไคลเอนต์ B หรือเซิร์ฟเวอร์ตอบกลับไปยังที่อยู่นั้น ตอบกลับไปยังที่อยู่ / พอร์ตที่ข้อความมาจากเสมอ

  • ย่อเล็กสุดพอร์ต UDP หรือ TCP ต่าง ๆ ที่ใช้สำหรับเกม การตั้งค่ากฎ NAT ง่ายขึ้นนี้จะทำให้

  • อนุญาตให้ผู้ใช้แทนที่พอร์ตเริ่มต้นที่ใช้ในเกม วิธีนี้เซิร์ฟเวอร์หลายเครื่องสามารถโฮสต์หลัง NAT เดียวกัน

  • จัดทำเอกสารพอร์ตและกฎใด ๆ ที่ปฏิบัติตามในเอกสารประกอบเกมของคุณ (ขอบคุณสำหรับ Zorba อันนั้น) ใน Descent 3 ฉันไปไกลถึงการสร้างแอปพลิเคชันทดสอบแบบสแตนด์อโลนที่จะช่วยคุณแก้ไขปัญหาเราเตอร์หรือการกำหนดค่า NAT ของคุณโดยการส่งแพ็กเก็ตไปยังเซิร์ฟเวอร์ทดสอบ

7
นอกจากนี้ในการตอบกลับอย่างอื่นดีนี้รวมถึงบันทึกของพอร์ตเกมในเอกสารเกม เป็นที่น่าอัศจรรย์ว่ามีกี่เกมที่ไม่ทำเช่นนี้ - ผู้คนต่าง ๆ ต่างออกพอร์ตด้วยตนเองด้วย "netstat" และทำให้พวกเขาผิดครึ่งหนึ่ง
ZorbaTHut

ด้วย UDP คุณไม่รู้จริงๆว่าข้อความมาจากที่ใด สามารถเขียนอะไรก็ได้ในที่อยู่ผู้ส่ง
MickLH

0

เช่นเดียวกับคำตอบอื่น ๆ ให้ใช้วงล้อที่มีอยู่แล้ว: http://miniupnp.free.fr/ ห้องสมุดนี้ต่อสู้กับเสียงรบกวนเกือบทั้งหมดในรูปแบบฟังก์ชั่นทำให้คุณสามารถควบคุมเวลาและวิธีการเจาะและดึง :)

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