TCP หรือ UDP สำหรับเกมแบบผู้เล่นหลายคน?


18

นี่เป็นคำถามที่ฉันเห็นมาก คนส่วนใหญ่กล่าวว่า UDP นั้นดีกว่าสำหรับเกมแบบเรียลไทม์มากกว่า TCP ความเข้าใจของฉันคือ TCP พยายามส่งแพ็กเก็ตซ้ำแล้วซ้ำอีกจนกว่าอีกฝ่ายจะรับมันในขณะที่ UDP ไม่สนใจ

สิ่งที่ฉันได้อ่านส่วนใหญ่คือ UDP เป็นสิ่งจำเป็นสำหรับเกมเรียลไทม์และ TCP นั้นแย่มาก แต่สิ่งนี้คือคนส่วนใหญ่ดูเหมือนจะใช้รูปแบบของ TCP บน UDP อย่างไรก็ตาม และฉันก็ได้ยินด้วยว่าความแตกต่างระหว่างสองอย่างนั้นเล็กน้อยมากเพราะเราไม่ได้อยู่ในยุค 80 อีกต่อไปแล้วอินเทอร์เน็ตก็ค่อนข้างเร็วและน่าเชื่อถือ

ความเข้าใจทั่วไปของฉันที่นี่ผิดหรือเปล่า? มีคนช่วยเคลียร์สิ่งนี้ให้ฉันได้ไหม


7
internet is now pretty fast and reliableไม่มันไม่ใช่. แบนด์วิดธ์ได้เพิ่มขึ้นอย่างรวดเร็วใช่ แต่แฝงยังค่อนข้างสูง ด้วย pure TCP คุณต้องใช้เวลาติ๊กของเซิร์ฟเวอร์มากกว่าเวลาแฝงสูงสุดที่เหมาะสมยกเว้นว่าคุณทำแพ็กเก็ต squishing ซึ่งทำได้ดีที่สุดที่ไคลเอ็นต์ผ่าน UDP ปัญหาคือข้อมูลบางอย่างในเกมจะต้องมีความน่าเชื่อถือในขณะที่บางอย่างต้องรวดเร็ว โปรโตคอลที่กำหนดเองที่ด้านบนของ UDP อนุญาตให้ทำเช่นนั้นรวมถึงกลุ่มของกรรมสิทธิ์ที่ให้ทุกสิ่งที่คุณต้องการในแพ็คเกจที่ดี
2560

4
พวกเขาไม่ได้ใช้ TCP ผ่าน UDP อย่างแน่นอน มีคุณสมบัติบางอย่างที่ข้อเสนอ TCP ที่เป็นที่ต้องการและมีการใช้งานด้านบนของ UDP จุดสำคัญของการใช้ UDP คือถ้าคุณส่งแพ็คเก็ตที่มีสถานะโลกในเวลาt0ที่ไม่เคยได้รับจากนั้นคุณส่งสถานะโลกใหม่ในเวลาที่t1คุณไม่ต้องรอจนกว่าลูกค้าจะได้รับแพคเกจแรกจริง ซึ่งล้าสมัยไปแล้ว
Vincent Savard

@ เออร์ดิอุสฉันคิดว่านี่ตอบคำถามของฉัน :) ขอบคุณ
flooblebit

4
นอกจากนี้โปรดทราบว่า UDP มีแนวโน้มที่จะปลอมแปลง IP ซึ่งอาจทำให้เซิร์ฟเวอร์ของคุณเปิดการโจมตี DDoS หากเป็นเรื่องที่น่ากังวล คุณสามารถหลีกเลี่ยงได้โดยมีการเชื่อมต่อ TCP "ควบคุม" ที่ส่งที่อยู่ IP ของลูกค้าและรายละเอียดอื่น ๆ ไปยังเซิร์ฟเวอร์ซึ่งรับแพ็กเก็ต UDP จากที่อยู่ "รับรองความถูกต้อง" นอกจากนี้คุณอาจต้องใช้การเข้ารหัสเลเยอร์ของคุณเองเนื่องจากไม่มีมาตรฐานเปิดสำหรับ UDP
ARau

@ blownie55 มีคะแนนที่ดี
Naresh Kumar

คำตอบ:


12

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

UDP ช่วยให้คุณสามารถควบคุมการใช้งาน TCP แบบที่คุณทำ มันช่วยให้คุณมีความยืดหยุ่นมากขึ้นในการดำเนินการแพ็คเก็ตที่ไม่เป็นระเบียบทิ้งแพ็คเก็ตที่คุณพิจารณาว่าไม่จำเป็นในขณะที่ลองแพ็กเก็ตที่คุณพิจารณาว่าสำคัญสิ่งนั้น แต่สิ่งนี้ควรทำถ้าจำเป็นและถ้าคุณมีความเชี่ยวชาญที่จำเป็น

หากคุณสามารถทำได้โดยไม่มีความยืดหยุ่น TCP จะทำงานได้ดีและช่วยให้คุณประหยัดเวลาได้มาก แม้แต่สตูดิโอมืออาชีพ (เช่นเดียวกับที่ฉันทำงาน) ใช้ TCP หากพวกเขาไม่ต้องการ UDP จริงๆและพวกเขามีคนที่ทุ่มเทให้กับการเขียนโปรแกรมเครือข่าย


ฉันขอแนะนำว่า "สำหรับสิ่งที่" สำคัญ - เช่นระบบแชทในเกมฉันจะไม่พิจารณา UDP ด้วยซ้ำ สิ่งอื่น ๆ ที่ฉันควรพิจารณา (อย่างน้อยก็สำหรับ "ไคลเอนต์เซิร์ฟเวอร์") คือประสิทธิภาพของเซิร์ฟเวอร์ที่สามารถจัดการปริมาณการใช้งานได้ - นิคส์สมัยใหม่มีสิ่งที่ "การลดภาระ" ในตัวจำนวนมากสำหรับ TCP (แยกและรวมแพ็คเก็ต ฯลฯ ) ที่ออกแบบมาเพื่อลดค่าใช้จ่ายของ CPU และส่วนใหญ่ไม่สามารถใช้กับ UDP ได้
เบรนแดน

1
สิ่งต่าง ๆ อาจเปลี่ยนแปลงในขณะนี้ว่า QUIC ( en.wikipedia.org/wiki/QUIC ) ซึ่งจะเป็นส่วนหนึ่งของ HTTP / 3 ซึ่งใช้ UDP และเข้ารหัสโดยใช้ TLS เป็นค่าเริ่มต้น จะใช้เวลาสักครู่ก่อนที่สิ่งนี้จะสามารถใช้งานได้อย่างกว้างขวางและเป็นสิ่งที่คาดหวัง รายละเอียดเพิ่มเติมเกี่ยวกับปัญหาที่ต้องจัดการที่นี่ blog.cloudflare.com/the-road-to-quic
ARau

3

มันน่าจะเป็นสมมติฐานที่จะพูดว่า "อินเทอร์เน็ตตอนนี้ค่อนข้างเร็วและน่าเชื่อถือ" ตามที่ @Ordous ชี้ให้เห็นและเป็นอันตรายเช่นกัน

เหตุผลที่โพรโทคอลกำหนดเอง UDP + สำหรับแพ็กเก็ตที่สำคัญต่อการส่งมอบนั้นมีความมหัศจรรย์ในเกมส่วนใหญ่นั่นคือมีบางครั้งที่มันอาจ "ตกลง" ถ้าคุณทำแพ็กเก็ตหาย (เช่น มีบางครั้งที่มัน "ไม่เป็นไรเลย" ที่จะสูญเสียข้อมูลบางอย่างเช่นการเคลื่อนไหวของเคอร์เซอร์ ฯลฯ (ฉันไม่ได้พัฒนาเกมเพื่อการใช้ชีวิตเพื่อยกโทษตัวอย่างที่คลุมเครือของฉัน)

UDP ไม่ต้องเสียเวลาในการผลักดันมันซ้ำแล้วซ้ำอีกตามค่าเริ่มต้น

และหลาย ๆ เกมดูเหมือนจะมีแพ็คเก็ต "โอเคที่จะแพ้บางครั้ง" มากกว่า "ต้องส่งโดยไม่ล้มเหลว" ดังนั้นจึงเหมาะสำหรับงานนี้

สิ่งที่ต้องการใน UDP คือการใช้โปรโตคอลที่กำหนดเองซึ่งช่วยเพียงส่งแพ็คเก็ต "ต้องส่งโดยไม่ล้มเหลว" อย่างถูกต้องทำให้ข้อมูลเกมที่เหลืออยู่ในความเมตตาของการเชื่อมต่อเครือข่าย

ตอนนี้การตัดสินใจว่าทราฟฟิกแบบไหนที่ทำให้ข้อมูลส่วนใหญ่ของคุณถูกส่งผ่านจะช่วยให้คุณตัดสินใจได้ดีขึ้น

จุดต่อ TCP จะเป็นเวลาที่ใช้ในการลองใหม่อาจจะใช้ในการส่งแพ็กเก็ตที่สำคัญตอนนี้

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

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