TCP hoặc UDP cho một trò chơi nhiều người chơi?


17

Đây là một câu hỏi tôi thấy rất nhiều. Hầu hết mọi người nói rằng UDP luôn tốt hơn cho các trò chơi thời gian thực so với TCP. Tôi hiểu rằng TCP cố gắng gửi lại các gói nhiều lần cho đến khi phía bên kia nhận được chúng trong khi UDP không quan tâm.

Hầu hết những điều tôi đã đọc là UDP là điều bắt buộc đối với bất kỳ trò chơi thời gian thực nào và TCP rất tệ. Nhưng vấn đề là, hầu hết mọi người dường như thực hiện một số hình thức TCP trên đầu trang của UDP. Và tôi cũng đã nghe nói rằng sự khác biệt giữa hai loại này là không đáng kể do chúng ta không còn ở thập niên 80 nữa và internet bây giờ khá nhanh và đáng tin cậy.

Là hiểu biết chung của tôi ở đây sai? Ai đó có thể làm rõ điều này cho tôi?


7
internet is now pretty fast and reliableKhông, không phải vậy. Các băng thông đã tăng lên đáng kể, vâng, nhưng độ trễ vẫn còn khá cao. Với TCP thuần túy, bạn cần thời gian đánh dấu của máy chủ nhiều hơn độ trễ tối đa phải chăng, trừ khi bạn thực hiện squishing gói - được thực hiện tốt nhất tại máy khách thông qua UDP. Vấn đề là một số thông tin trong một trò chơi cần phải đáng tin cậy, trong khi một số thông tin khác cần phải nhanh chóng. Các giao thức tùy chỉnh trên UDP cho phép điều đó, cũng như một loạt các giao thức độc quyền cung cấp cho bạn mọi thứ bạn cần trong một gói đẹp.
Thường

4
Họ không thực hiện chính xác TCP qua UDP. Có một số tính năng mà TCP cung cấp mong muốn và được triển khai trên UDP. Một điểm chính của việc sử dụng UDP là nếu bạn gửi một gói chứa trạng thái thế giới tại thời điểm t0không bao giờ nhận được, thì bạn gửi trạng thái thế giới mới tại thời điểm đó t1, bạn không phải đợi cho đến khi khách hàng thực sự nhận được gói đầu tiên, vốn đã lỗi thời
Vincent Savard

@Ordous Tôi nghĩ điều này trả lời câu hỏi của tôi :) Cảm ơn
flooblebit

4
Ngoài ra, hãy lưu ý rằng UDP dễ bị giả mạo IP, điều này có thể khiến máy chủ của bạn mở các cuộc tấn công DDoS nếu đó là một vấn đề đáng lo ngại. Bạn có thể tránh điều đó bằng cách có kết nối TCP "điều khiển" gửi địa chỉ IP của máy khách và các chi tiết khác đến máy chủ để chấp nhận các gói UDP từ địa chỉ "được xác thực". Ngoài ra, bạn có thể phải thực hiện lớp mã hóa của riêng mình vì không có tiêu chuẩn mở nào cho UDP đó.
ARau

@ blownie55 điểm tốt ở đó
Naresh Kumar

Câu trả lời:


12

Phụ thuộc vào việc bạn đang nói về máy ngang hàng, máy khách / máy chủ với người dùng đang chạy máy chủ hay máy khách / máy chủ có trung tâm dữ liệu chạy máy chủ. Chỉ trong trường hợp sau là internet thực sự nhanh và đáng tin cậy. Máy tính của người dùng của bạn không được đảm bảo là nhanh và chắc chắn sẽ không đáng tin cậy.

UDP cho phép bạn kiểm soát tốt hơn đối với loại triển khai giống như TCP mà bạn đang thực hiện. Nó cho phép bạn linh hoạt hơn để thực hiện các gói không theo thứ tự, loại bỏ các gói mà bạn cho là không cần thiết trong khi thử lại các gói bạn cho là quan trọng, đó là thứ tương tự. Nhưng điều này chỉ nên được thực hiện nếu cần thiết và nếu bạn có chuyên môn cần thiết.

Nếu bạn có thể làm mà không có sự linh hoạt đó, TCP hoạt động đủ tốt và giúp bạn tiết kiệm rất nhiều thời gian. Ngay cả các studio chuyên nghiệp (như tôi từng làm việc) cũng sử dụng TCP nếu họ không thực sự cần UDP và họ có những người dành riêng cho lập trình mạng.


Tôi cũng đề nghị rằng "vì điều gì" quan trọng - ví dụ: đối với hệ thống trò chuyện trong trò chơi, tôi thậm chí sẽ không xem xét UDP. Một điều khác mà tôi xem xét (ít nhất là đối với "máy chủ máy khách") là cách máy chủ có thể xử lý lưu lượng hiệu quả - các NIC hiện đại có rất nhiều công cụ "giảm tải" tích hợp cho TCP (tách và hợp nhất các gói, sắp xếp các gói thành luồng, v.v.) được thiết kế để giảm chi phí CPU và hầu hết không thể hoạt động cho UDP.
Brendan

1
Bây giờ mọi thứ có thể thay đổi rằng QUIC ( en.wikipedia.org/wiki/QUIC ) sẽ là một phần của HTTP / 3 sử dụng UDP và được mã hóa bằng TLS theo mặc định. Sẽ mất một thời gian để điều này được phổ biến rộng rãi và là điều đáng mong đợi. Chi tiết khác về một số vấn đề cần được xử lý tại đây blog.cloudflare.com/the-road-to-quic
ARau

3

Sẽ là một giả định để nói rằng "Internet bây giờ khá nhanh và đáng tin cậy" như @Ordous đã chỉ ra, và một điều nguy hiểm nữa.

Lý do tại sao giao thức tùy chỉnh UDP + cho các gói phân phối quan trọng thực hiện phép thuật trên hầu hết các trò chơi là vì đôi khi nó có thể "ổn" nếu bạn mất một số gói (ví dụ: ví dụ: các sự kiện không quan trọng thứ cấp để hoàn thành trò chơi) , cũng có những lúc "không ổn chút nào" để mất một số dữ liệu, ví dụ như di chuyển con trỏ, v.v. (Tôi không phát triển trò chơi để kiếm sống vì vậy hãy tha thứ cho những ví dụ mơ hồ của tôi)

Theo mặc định, UDP không lãng phí thời gian trong việc đẩy chúng nhiều lần.

Và, nhiều trò chơi dường như có các gói "đôi khi bị mất" hơn là "luôn luôn cần phân phối mà không bị lỗi". Do đó làm cho phù hợp tự nhiên cho nhiệm vụ này.

Tất cả những gì cần thiết trên UDP là sử dụng một giao thức tùy chỉnh chỉ giúp phân phối các gói "luôn luôn cần phân phối mà không bị lỗi", khiến phần còn lại của dữ liệu trò chơi bị tổn thương trong kết nối mạng.

Bây giờ quyết định loại lưu lượng nào chiếm phần lớn dữ liệu CỦA BẠN được truyền qua sẽ giúp bạn quyết định tốt hơn.

Điểm chống lại TCP sẽ là thời gian dành cho việc thử lại có thể được dành cho việc gửi các gói quan trọng NGAY BÂY GIỜ.

Cũng có khả năng nếu có bất kỳ sự cố nào trong quá trình truyền, TCP có thể chuyển sang kịch bản chơi trò chơi bị phá vỡ nhiều hơn cho người dùng, làm hỏng trải nghiệm của họ so với UDP + Ngăn xếp tùy chỉnh (Phần cuối này chỉ là linh cảm. Tôi sẽ rời khỏi điều này để các chuyên gia khác ở đây nhận xét về điều này. Rất muốn tìm hiểu về các khả năng của kịch bản này).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.