Không, UDP vẫn vượt trội về độ trễ hiệu năng và sẽ luôn nhanh hơn, vì triết lý của 2 giao thức - giả sử dữ liệu truyền thông của bạn được thiết kế với UDP hoặc bất kỳ giao tiếp mất mát nào khác.
TCP tạo ra một sự trừu tượng trong đó tất cả các gói mạng đến và chúng đến theo thứ tự chính xác mà chúng được gửi. Để thực hiện một sự trừu tượng như vậy trên một kênh bị mất, nó phải thực hiện truyền lại và hết thời gian, tiêu tốn thời gian. Nếu bạn gửi 2 bản cập nhật trên TCP và một gói của bản cập nhật đầu tiên bị mất, bạn sẽ không thấy bản cập nhật thứ hai cho đến khi:
- Mất bản cập nhật đầu tiên được phát hiện.
- Yêu cầu truyền lại bản cập nhật đầu tiên.
- việc truyền lại đã đến và được xử lý.
Không quan trọng việc này được thực hiện nhanh như thế nào trong TCP, bởi vì với UDP, bạn chỉ cần loại bỏ bản cập nhật đầu tiên và sử dụng bản cập nhật thứ hai, mới hơn, ngay bây giờ. Không giống như TCP, UDP không đảm bảo rằng tất cả các gói đến và nó không đảm bảo rằng chúng đến theo thứ tự.
Điều này đòi hỏi bạn phải gửi đúng loại dữ liệu và thiết kế giao tiếp của bạn theo cách mà việc mất dữ liệu được chấp nhận.
Nếu bạn có dữ liệu mà mọi gói phải đến và các gói phải được xử lý bởi trò chơi của bạn theo thứ tự chúng được gửi, thì UDP sẽ không nhanh hơn. Trong thực tế, việc sử dụng UDP trong trường hợp này có thể sẽ chậm hơn vì bạn đang xây dựng lại TCP và triển khai nó bằng UDP trong trường hợp đó bạn cũng có thể sử dụng TCP.
EDIT - Thêm một số thông tin bổ sung để kết hợp / giải quyết một số ý kiến:
Thông thường, tốc độ mất gói trên Ethernet rất thấp, nhưng nó sẽ trở nên cao hơn nhiều khi có liên quan đến WiFi hoặc nếu người dùng đang tiến hành tải lên / tải xuống. Giả sử chúng ta có một gói mất hoàn toàn thống nhất là 0,01% (một chiều, không phải khứ hồi). Trên một game bắn súng góc nhìn người thứ nhất, khách hàng nên gửi thông tin cập nhật bất cứ khi nào có chuyện gì xảy ra, chẳng hạn như khi con trỏ chuột xoay người chơi, điều này xảy ra khoảng 20 lần mỗi giây. Họ cũng có thể gửi các bản cập nhật trên mỗi khung hoặc trong một khoảng thời gian cố định, sẽ là 60-120 cập nhật mỗi giây. Vì các bản cập nhật này được gửi vào các thời điểm khác nhau, nên chúng sẽ / nên được gửi trong một gói cho mỗi bản cập nhật. Trên trò chơi 16 người chơi, tất cả 16 người chơi gửi 20-120 gói này mỗi giây đến máy chủ, dẫn đến tổng số 320-1920 gói mỗi giây. Với tỷ lệ mất gói là 0,01%, chúng tôi hy vọng sẽ mất gói sau mỗi 5,2-31,25 giây.
Trên mỗi gói chúng tôi nhận được sau gói bị mất, chúng tôi sẽ gửi DupAck và sau DupAck thứ 3, người gửi sẽ gửi lại gói bị mất . Vì vậy, thời gian TCP yêu cầu để bắt đầu truyền lại là 3 gói, cộng với thời gian để DupAck cuối cùng đến người gửi. Sau đó, chúng tôi cần đợi truyền lại đến, vì vậy tổng cộng chúng tôi chờ 3 gói + 1 độ trễ khứ hồi. Độ trễ khứ hồi thường là 0-1 ms trên mạng cục bộ và 50-200 ms trên internet. 3 gói thường sẽ đến trong 25 ms nếu chúng tôi gửi 120 gói mỗi giây và trong 150ms nếu chúng tôi gửi 20 gói mỗi giây.
Ngược lại, với UDP, chúng tôi phục hồi từ gói bị mất ngay khi nhận được gói tiếp theo, vì vậy chúng tôi mất 8,3 ms nếu chúng tôi gửi 120 gói mỗi giây và 50 ms nếu chúng tôi gửi 20 gói mỗi giây.
Với TCP, mọi thứ trở nên rắc rối hơn nếu chúng ta cũng cần xem xét Nagle (nếu nhà phát triển quên tắt gửi kết hợp hoặc không thể vô hiệu hóa ACK bị trì hoãn ), tránh tắc nghẽn mạng hoặc nếu mất gói là đủ để chúng ta phải tính toán nhiều mất gói (bao gồm mất Ack và DupAck). Với UDP, chúng tôi có thể dễ dàng viết mã nhanh hơn vì chúng tôi hoàn toàn không quan tâm đến việc trở thành một công dân mạng tốt như TCP.