เกมออนไลน์จะดำเนินต่อไปหลังจากที่เจ้าบ้านออก?


12

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

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

พิจารณาสถานการณ์สมมติต่อไปนี้:

  • ฉันโฮสต์ 3 ต่อ 3 โปรดทราบว่าสำหรับคนที่จะเข้าร่วมได้เราเตอร์ของฉันจะต้องได้รับการกำหนดค่าให้พอร์ตไปข้างหน้า 6112, TCP และ UDP (ดูBlizzard Support )
  • ห้าคนเข้าร่วม ทุกคน (รวมตัวเอง) อยู่หลังเราเตอร์ ฉันเริ่มเกม
  • สามนาทีในเกมประมาณยี่สิบ zealots เทลงในฐานของฉัน ไม่มีใครช่วยฉัน
  • ฐานของฉันถูกกำจัดดังนั้นฉันจึงไป (เกมไม่ได้ให้คุณเลือก)
  • เกมดำเนินต่อไปโดยไม่มีโฮสต์ (ทีมเหย้าเหลือผู้เล่นสองคน)

ลูกค้าที่เหลือห้าราย (ที่ไม่ต้องการการส่งต่อ 6112) ยังคงเชื่อมต่อได้อย่างไร

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

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

เป็นไปได้อย่างสิ้นเชิงว่าในกรณีของสตาร์คราฟต์ปริมาณการใช้เกมจะต้องผ่านเซิร์ฟเวอร์ Battle.net StarCraft ทำการเชื่อมต่อกับ Battle.net ระหว่างเกม (สำหรับข้อความจากเพื่อน ฯลฯ ) อย่างไรก็ตามฉันสงสัยว่าการรับส่งข้อมูลของเกมจะผ่านไปเพราะถ้าเป็นเช่นนั้นเหตุใดโฮสต์จึงต้องส่งต่อ 6112

คำถามของฉันคือเซิร์ฟเวอร์สามารถเชื่อมต่อกับไคลเอนต์หลายคนเพื่อเริ่มต้นการเชื่อมต่อระหว่างพวกเขา?


2
ฉันชอบอ้างอิง Starcraft ที่นี่ ...
Jon

I host a 3 versus 3. Note that, for people to be able to join, my router has to be configured to port forward 6112, TCP and UDP (see Blizzard Support).เห็นได้ชัดว่าสิ่งนี้จำเป็นสำหรับการเริ่มเกมเพื่อให้ผู้ใช้สามารถค้นหาคุณ แต่ไม่จำเป็นต้องเชื่อมต่อ
JeffO

@Jeff O: เซิร์ฟเวอร์ Battle.net ดูแลรายการของเกมที่มีอยู่ อย่างไรก็ตามหากโฮสต์ไม่ได้ส่งต่อพอร์ตมันจะหยุดเมื่อผู้อื่นพยายามเข้าร่วม (ฉันคิดว่า)
Joey Adams

คำตอบ:


20

ดูเหมือนจะเป็นการเจาะรู UDP

ให้ A และ B เป็นโฮสต์ทั้งสองโดยแต่ละเครือข่ายส่วนตัวของตนเอง N1 และ N2 เป็นอุปกรณ์ NAT สองตัว S เป็นเซิร์ฟเวอร์สาธารณะที่มีที่อยู่ IP ที่สามารถเข้าถึงได้ทั่วโลกที่รู้จักกันดี

  1. A และ B แต่ละคนเริ่มต้นการสนทนา UDP กับ S; อุปกรณ์ NAT N1 และ N2 สร้างสถานะการแปล UDP และกำหนดหมายเลขพอร์ตภายนอกชั่วคราว
  2. S ถ่ายทอดหมายเลขพอร์ตเหล่านี้กลับไปที่ A และ B
  3. A และ B ติดต่ออุปกรณ์ NAT ของกันและกันโดยตรงบนพอร์ตที่แปล อุปกรณ์ NAT ใช้สถานะการแปลที่สร้างไว้ก่อนหน้านี้และส่งแพ็กเก็ตไปที่ A และ B

ในตัวอย่างนี้คุณคือ S ฝ่ายตรงข้ามของคุณคือ A และ B เมื่อคุณถูกเตะออกจากเกมฝ่ายตรงข้ามของคุณสามารถเล่นต่อได้เพราะพวกเขาได้เจรจาการเชื่อมต่อซึ่งกันและกันเมื่อพวกเขาเชื่อมต่อกับคุณเป็นครั้งแรก


ว้าว +1 ฉันไม่รู้ว่าจะใช้ NAT แบบนั้นได้
ไหม

ปัญหาของ NAT คือคุณต้องเริ่มจากด้านหลังไฟร์วอลล์ ดังนั้นอย่างน้อยคุณต้องมีคอมพิวเตอร์เริ่มต้นให้เป็นแบบสาธารณะหรือไม่มีอะไรให้เชื่อมต่อ

2

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


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