UDP vs TCP, nó nhanh hơn bao nhiêu? [đóng cửa]


194

Đối với trao đổi thông điệp giao thức chung, có thể chịu được một số mất gói. UDP trên TCP hiệu quả hơn bao nhiêu?


Bạn cũng có thể thêm thẻ "tcp" vì câu hỏi cũng liên quan đến TCP.
Cristian Ciupitu

5
"Trao đổi thông điệp giao thức chung" nghĩa là gì? Câu hỏi cần làm rõ những gì hiệu quả là về. Chúng ta có muốn độ trễ ít hơn cho một tin nhắn nhỏ không? Hoặc, chúng ta có muốn thông lượng cao hơn cho một luồng dữ liệu liên tục không?
Johan Boulé

Tcp có nhiều tính năng tốt hơn UDP ngoại trừ Tốc độ.
RAJKUMAR NAGARETHINAM

3
Câu hỏi về tốc độ TCP so với UDP là tranh luận. Câu hỏi trong tiêu đề của bạn thực sự không khớp với nội dung câu hỏi. Cả hai gói TCP và UDP đều di chuyển với tốc độ chính xác như nhau trên cùng một phương tiện.
Ron Maupin

Câu trả lời:


86

UDP nhanh hơn TCP và lý do đơn giản là vì gói xác nhận không tồn tại (ACK) của nó cho phép luồng gói liên tục, thay vì TCP thừa nhận một tập các gói, được tính bằng cách sử dụng kích thước cửa sổ TCP và thời gian khứ hồi (RTT).

Để biết thêm thông tin, tôi khuyên bạn nên giải thích Skullbox đơn giản nhưng rất dễ hiểu (TCP so với UDP)


19
Thực tế có nhiều trường hợp TCP thực sự nhanh hơn UDP. Xem câu trả lời của tôi dưới đây.
Robert S. Barnes

2
Cái nào nhanh hơn phụ thuộc hoàn toàn vào đặc điểm giao thông.

4
Mặc dù câu trả lời có thể đúng, nhưng nó không trả lời câu hỏi và lặp đi lặp lại kiến ​​thức được đề cập ở nơi khác. Cũng không đề cập đến việc các phương pháp UDP đáng tin cậy với ACK có thể nhanh hơn đáng kể so với TCP.
Rừng Elliot

268

Mọi người nói rằng điều quan trọng mà TCP mang lại cho bạn là độ tin cậy. Nhưng điều đó không thực sự đúng. Điều quan trọng nhất mà TCP mang lại cho bạn là kiểm soát tắc nghẽn: bạn có thể chạy 100 kết nối TCP trên một liên kết DSL với tốc độ tối đa và tất cả 100 kết nối sẽ hoạt động hiệu quả, bởi vì tất cả đều "cảm nhận" băng thông có sẵn. Hãy thử điều đó với 100 ứng dụng UDP khác nhau, tất cả các gói đẩy nhanh nhất có thể và xem mọi thứ hoạt động tốt như thế nào đối với bạn.

Ở quy mô lớn hơn, hành vi TCP này là yếu tố giúp Internet không bị khóa thành "sụp đổ tắc nghẽn".

Những thứ có xu hướng đẩy các ứng dụng về phía UDP:

  • Ngữ nghĩa phân phối nhóm: có thể thực hiện phân phối đáng tin cậy cho một nhóm người hiệu quả hơn nhiều so với xác nhận điểm-điểm của TCP.

  • Giao hàng không theo đơn đặt hàng: trong rất nhiều ứng dụng, miễn là bạn nhận được tất cả dữ liệu, bạn không quan tâm đơn hàng đó sẽ đến theo thứ tự nào; bạn có thể giảm độ trễ cấp ứng dụng bằng cách chấp nhận khối không theo thứ tự.

  • Tính không thân thiện: trong một bữa tiệc LAN, bạn có thể không quan tâm nếu trình duyệt web của bạn hoạt động tốt miễn là bạn đang cập nhật mạng nhanh nhất có thể.

Nhưng ngay cả khi bạn quan tâm đến hiệu suất, có lẽ bạn không muốn sử dụng UDP:

  • Bây giờ bạn đang gặp khó khăn về độ tin cậy và rất nhiều điều bạn có thể làm để thực hiện độ tin cậy có thể sẽ chậm hơn so với những gì TCP đã làm.

  • Bây giờ bạn không thân thiện với mạng, điều này có thể gây ra sự cố trong môi trường dùng chung.

  • Quan trọng nhất, tường lửa sẽ chặn bạn.

Bạn có khả năng có thể khắc phục một số vấn đề về hiệu suất và độ trễ TCP bằng cách "kết nối" nhiều kết nối TCP với nhau; iSCSI thực hiện điều này để khắc phục sự kiểm soát tắc nghẽn trên các mạng cục bộ, nhưng bạn cũng có thể thực hiện để tạo kênh thông báo "khẩn cấp" có độ trễ thấp (hành vi "URGENT" của TCP bị hỏng hoàn toàn).


18
Câu trả lời hay, tôi thậm chí còn đi chung hơn, "điều khiển luồng" (trái ngược với điều khiển tắc nghẽn, là một tập hợp con của điều khiển luồng). Không chỉ nhiều kết nối TCP có thể chia sẻ một liên kết mà còn ngăn người gửi tràn bộ đệm của người nhận nếu họ tạm dừng xử lý dữ liệu đến vì bất kỳ lý do nào.
Alex B

1
@AaronLS: mất gói tintăng RTT (thời gian khứ hồi) (có thể được xem như là một proxy cho xếp hàng chậm trễ ) là / có thể được (ví dụ: mạng WiFi có thể mất các gói tin mà không tắc nghẽn động sản, lừa một số thuật toán điều khiển tắc nghẽn TCP vào tránh ùn tắc) chỉ tiêu tắc nghẽn.
ninjalj

2
UDP là một thằng khốn để đối phó với ... Tôi đã bị đốt cháy về điều này rồi. Bất kể tôi làm gì, tôi dường như không thể tìm thấy sự cân bằng về hiệu suất, độ trễ, thông lượng, độ tin cậy. Tuyệt vời cho những thứ trong thời gian thực như mọi thứ trên bộ tính giờ ... nhưng tôi đang làm việc thay thế TCP bằng cách sử dụng UDP và Sửa lỗi chuyển tiếp và điều này khó hơn nhiều so với tôi nghĩ nó sẽ xảy ra. Điều khiển tắc nghẽn. Một hệ thống phổ quát hoạt động trên các mạng 1GB và các mạng Không dây đều giống nhau là một tác phẩm nghệ thuật. Tôi cảm thấy như mình đang cố gắng lắp ráp lại các gói được nạp vào một khẩu súng ngắn.
Jason Nelson

1
Btw một ưu điểm khác của TCP là nó vốn được định hướng kết nối, giúp đơn giản hóa rất nhiều logic xử lý ứng dụng khách ( listen-> accept-> trạng thái máy khách độc lập tự nhiên với các máy khách khác). Việc xử lý nhiều kết nối từ một máy khách cụ thể trở nên sởn gai ốc với UDP. Và một điểm có lợi cho UDP là các ngăn xếp UDP rất dễ thực hiện, đó là một điểm cộng rất lớn trên các hệ thống nhúng (vi điều khiển, FPGA, v.v., đặc biệt là việc triển khai TCP cho một GPU nói chung là thứ bạn chỉ muốn mua từ người khác và không nghĩ về).
Jason C

1
Tất cả điều này chỉ giả định rằng chúng tôi quan tâm đến việc cung cấp dữ liệu lớn (mà không quan tâm quá nhiều đến độ trễ). Trong khá một vài ứng dụng (trò chơi / VoIP), tình hình là hoàn toàn khác nhau: chúng tôi có very_small lượng dữ liệu, nhưng làm chăm sóc về độ trễ A LOT; đó là điều đơn giản này chiếm 99% sử dụng hợp pháp cho UDP. Và một vài nitpicks: (a) phân phối nhóm KHÔNG hoạt động qua Internet (và có thể sẽ không bao giờ), vì vậy đó là vương quốc chỉ có Intranet; (b) trên Google, chỉ 8-9% dân số Internet gặp sự cố với UDP; (c) "không thân thiện với mạng" không áp dụng cho luồng tốc độ cố định
No-Bugs Hare

93

Trong một số ứng dụng, TCP nhanh hơn (thông lượng tốt hơn) so với UDP.

Đây là trường hợp khi thực hiện nhiều ghi nhỏ liên quan đến kích thước MTU. Ví dụ, tôi đã đọc một thử nghiệm trong đó một luồng gồm 300 gói đang được gửi qua Ethernet (MTU 1500 byte) và TCP nhanh hơn 50% so với UDP .

Lý do là vì TCP sẽ thử và đệm dữ liệu và lấp đầy một phân đoạn mạng đầy đủ, do đó sử dụng hiệu quả hơn băng thông có sẵn.

Mặt khác, UDP đặt gói lên dây ngay lập tức, do đó làm tắc nghẽn mạng với rất nhiều gói nhỏ.

Bạn có thể không nên sử dụng UDP trừ khi bạn có một lý do rất cụ thể để làm như vậy. Đặc biệt là vì bạn có thể cung cấp cho TCP cùng loại độ trễ như UDP bằng cách vô hiệu hóa thuật toán Nagle (ví dụ: nếu bạn đang truyền dữ liệu cảm biến thời gian thực và bạn không lo lắng về việc làm nghẽn mạng với nhiều gói nhỏ).


3
Tôi thực sự đã thực hiện các tiêu chuẩn cho hiệu ứng này. Tôi đã gửi các gói lớn như UDP sẽ hỗ trợ mà không đưa ra ngoại lệ (trong Java) và TCP nhanh hơn nhiều. Tôi đoán rất nhiều tối ưu hóa hệ điều hành, trình điều khiển và phần cứng cũng là một phần của điều này.
Charlie

14
@Myforwik: Đầu tiên, đây không phải là triển khai được xác định, nó là một phần của giao thức TCP. Nó được gọi là thuật toán Nagle. Nó giúp ngăn ngừa những gì thường được gọi là Hội chứng cửa sổ ngớ ngẩn. Tra cứu cả hai điều khoản. Thứ hai, không có khái niệm về các gói từ PIP của TCP. Cuối cùng, cuốn sách "Lập trình TCP / IP hiệu quả" dành cả một chương cho chủ đề này và nhiều chương khác cho chủ đề liên quan để biết khi nào nên sử dụng TCP so với UDP. Tôi đưa ra tình huống này (điều này thực sự khá phổ biến) vì OP đã hỏi một câu hỏi chung và đây là một trong nhiều câu trả lời có thể có.
Robert S. Barnes

46
@Myforwik. Khi đề xuất chủ nghĩa đạo đức ở người khác, hãy cố gắng nhận ra rằng tất cả chúng ta đều có lỗ hổng kiến ​​thức - bao gồm cả bạn. SO, sau tất cả, là một diễn đàn để chia sẻ kiến ​​thức. Khá nhiều game bắn súng góc nhìn người thứ nhất sử dụng UDP và rất hiếm khi họ gửi các gói ở kích cỡ bất cứ nơi nào gần bằng MTU. Nếu bạn muốn đi và đề nghị với John Carmack rằng anh ta là một kẻ ngốc khi nghĩ ra phương pháp này, trước tiên tôi khuyến khích bạn nên tự học hỏi kỹ về vấn đề này. 15 năm, và mã mạng hiệu suất cao của một ngành công nghiệp không nằm xuống và chết vì bạn nghĩ rằng "biến thái" của nó.
Kỹ sư

2
" Tôi đã đọc một thử nghiệm trong đó một luồng gồm 300 gói tin được gửi qua Ethernet (MTU 1500 byte) và TCP nhanh hơn 50% so với UDP. " - bạn có thể liên kết thử nghiệm này không?
Leviathan

3
@Leviathan Có trong cuốn sách Lập trình TCP / IP hiệu quả.
Robert S. Barnes

31

với sự chịu đựng mất mát

Bạn có nghĩa là "với sự chịu đựng mất mát"?

Về cơ bản, UDP không "chịu lỗ". Bạn có thể gửi 100 gói cho ai đó và họ chỉ có thể nhận 95 gói trong số đó và một số có thể sai thứ tự.

Đối với những thứ như phát video và chơi game nhiều người, tốt hơn là bỏ lỡ một gói hơn là trì hoãn tất cả các gói khác đằng sau nó, đây là lựa chọn rõ ràng

Đối với hầu hết những thứ khác, một gói bị thiếu hoặc 'sắp xếp lại' là rất quan trọng. Bạn sẽ phải viết thêm một số mã để chạy trên UDP để thử lại nếu mọi thứ bị bỏ lỡ và thực thi đúng thứ tự. Điều này sẽ thêm một chút chi phí nhỏ ở một số nơi.

Rất may, một số người rất thông minh đã làm điều này và họ gọi nó là TCP.

Hãy nghĩ về nó theo cách này: Nếu một gói bị mất, bạn chỉ nên lấy gói tiếp theo càng nhanh càng tốt và tiếp tục (sử dụng UDP) hoặc bạn thực sự cần dữ liệu bị thiếu đó (sử dụng TCP). Chi phí sẽ không thành vấn đề trừ khi bạn ở trong tình huống thực sự khó khăn.


1
5 gói trong số 100? Nó khá nhiều. Tôi đoán đó chỉ là một ví dụ. Câu hỏi: trong tình huống thực tế có thể mất bao nhiêu gói? Bởi vì nếu đó là ví dụ 2 trong số 10000 (cộng trừ 1), thì tôi sẽ không lo lắng về điều đó.
kỳ quái

1
@freakish, vâng nó chỉ là một ví dụ. Số lượng mất gói thực tế phụ thuộc vào kết nối của bạn, mạng ngược dòng, v.v. Tôi đã từng chơi rất nhiều trò chơi trực tuyến và tôi sẽ thấy rằng nếu chỉ sử dụng kết nối internet, tôi sẽ không bị mất gói, nhưng Ngay sau khi tôi khởi chạy tải xuống nền, tôi sẽ bắt đầu nhận được một số (có thể 10% -20%). Điều này là khoảng 5 năm trước, và kết nối internet nhanh hơn có thể giúp đỡ.
Orion Edwards

2
Bộ định tuyến Internet giảm udp trước tcp
user1496062

19

Giao thức nào hoạt động tốt hơn (về thông lượng) - UDP hoặc TCP - thực sự phụ thuộc vào đặc điểm mạng và lưu lượng mạng. Robert S. Barnes, ví dụ, chỉ ra một kịch bản trong đó TCP hoạt động tốt hơn (ghi nhỏ). Bây giờ, hãy xem xét một kịch bản trong đó mạng bị tắc nghẽn và có cả lưu lượng TCP và UDP. Người gửi trong mạng đang sử dụng TCP, sẽ cảm nhận được 'tắc nghẽn' và cắt giảm tốc độ gửi của họ. Tuy nhiên, UDP không có bất kỳ cơ chế kiểm soát tắc nghẽn hoặc tránh tắc nghẽn nào và người gửi sử dụng UDP sẽ tiếp tục bơm dữ liệu với cùng tốc độ. Dần dần, người gửi TCP sẽ giảm tốc độ gửi xuống mức tối thiểu và nếu người gửi UDP có đủ dữ liệu được gửi qua mạng, họ sẽ chiếm phần lớn băng thông có sẵn. Vì vậy, trong trường hợp như vậy, Người gửi UDP sẽ có thông lượng lớn hơn, vì họ nhận được miếng băng thông mạng lớn hơn. Trên thực tế, đây là một chủ đề nghiên cứu tích cực - Cách cải thiện lưu lượng TCP khi có lưu lượng UDP. Một cách mà tôi biết, sử dụng các ứng dụng TCP nào có thể cải thiện thông lượng là bằng cách mở nhiều kết nối TCP. Theo cách đó, mặc dù, thông lượng của mỗi kết nối TCP có thể bị giới hạn, tổng tổng thông lượng của tất cả các kết nối TCP có thể lớn hơn thông lượng cho một ứng dụng sử dụng UDP.


2
Đây không phải là bộ định tuyến chính xác sẽ bỏ UDP trước TCP. Trên một dây được chia sẻ, bạn có thể bị chết đuối bởi UDP, nhưng những gì có thể xảy ra trong tình trạng cung vượt quá phụ thuộc vào công nghệ nhưng khá dễ dàng để UDP xuống cấp đến mức rất ít bị gửi chỉ là va chạm.
user1496062

Tôi thích lời giải thích của bạn nhưng không được một điểm. Nếu các kết nối UDP có thể nhận được tất cả các phần thưởng (nếu băng thông thấp hoặc dữ liệu cao) thì trong trường hợp đó, ứng dụng của bạn nếu sử dụng TCP sẽ bị giữ làm con tin cơ bản cho những người sử dụng UDP. Nếu tất cả các ứng dụng đang sử dụng TCP thì chúng sẽ "chơi đẹp" với nhau. Vậy thì tại sao lại cho phép UDP trên máy phát điện ngay từ đầu?
Igor ordaš

@PSIXO: Vâng, TCP và UDP phục vụ các yêu cầu ứng dụng khác nhau, vì vậy cả hai đều được các ứng dụng sử dụng. Hàm ý của đề xuất của bạn là chúng ta nên có cơ sở hạ tầng mạng khác nhau cho lưu lượng TCP và UDP - một đề xuất đắt đỏ và chắc chắn không phải là điều chúng ta có thể làm bây giờ, đặc biệt là với tất cả các khoản đầu tư đã được thực hiện. Đó là lý do tại sao các nhà nghiên cứu bận rộn tìm ra các cách khác để cân bằng xung đột trong 'phần mềm'.
gjain

Về cơ bản là có, có hai cơ sở hạ tầng sẽ là một giải pháp hoàn hảo nhưng thật không may, nó không hợp lý. Điều tôi muốn nói với nhận xét của tôi là bạn đang cường điệu hóa UDP thành TCP bởi vì nếu đó là yếu tố cao, mọi người sẽ vô hiệu hóa UDP trên bộ định tuyến (Đôi khi họ làm trong các công ty) nếu họ cần TCP để hoạt động nhanh. Cũng nên nhớ rằng các gói UDP có khả năng bị rủ xuống sau đó là TCP. Về phần còn lại của các sự kiện trong câu trả lời của bạn, tôi hoàn toàn đồng ý và thấy nó khá hữu ích nhưng tôi chỉ nghĩ rằng bạn đang đánh giá quá cao những hiệu ứng nhất định.
Igor ordaš

18

Khi nói về "cái gì nhanh hơn" - có ít nhất hai khía cạnh rất khác nhau: thông lượng và độ trễ.

Nếu nói về thông lượng - Kiểm soát luồng của TCP (như đã đề cập trong các câu trả lời khác), là cực kỳ quan trọng và làm bất cứ điều gì có thể so sánh với UDP, trong khi chắc chắn có thể, sẽ là một Nhức đầu lớn (tm). Kết quả là - sử dụng UDP khi bạn cần thông lượng , hiếm khi đủ điều kiện là một ý tưởng hay (trừ khi bạn muốn có được lợi thế không công bằng so với TCP).

Tuy nhiên, nếu nói về độ trễ - toàn bộ điều này hoàn toàn khác. Mặc dù không có mất gói, TCP và UDP hoạt động rất giống nhau (bất kỳ sự khác biệt nào, nếu có, là cận biên) - sau khi gói bị mất, toàn bộ mô hình thay đổi mạnh mẽ.

Sau khi mất gói, TCP sẽ chờ truyền lại ít nhất 200ms (1 giây cho mỗi đoạn 2.4 của RFC6298, nhưng các triển khai hiện đại thực tế có xu hướng giảm xuống còn 200ms). Ngoài ra, với TCP, ngay cả những gói đã đến máy chủ đích - sẽ không được gửi đến ứng dụng của bạn cho đến khi nhận được gói bị thiếu (nghĩa là toàn bộ giao tiếp bị trì hoãn ~ 200ms) - BTW, hiệu ứng này, được gọi là Head-of -Line Blocking, vốn có cho tất cả các luồng được đặt hàng đáng tin cậy, cho dù TCP hoặc UDP đáng tin cậy + được đặt hàng. Để làm cho mọi thứ trở nên tồi tệ hơn - nếu gói truyền lại cũng bị mất, thì chúng ta sẽ nói về độ trễ ~ 600ms (do cái gọi là backoffential theo cấp số nhân, lần truyền lại thứ nhất là 200ms và lần thứ hai là 200 * 2 = 400ms). Nếu kênh của chúng tôi bị mất gói 1% (không tệ theo tiêu chuẩn ngày nay), và chúng tôi có một trò chơi với 20 cập nhật mỗi giây - sự chậm trễ 600ms như vậy sẽ xảy ra trung bình cứ sau 8 phút. Và vì 600ms là quá đủ để khiến bạn bị giết trong một trò chơi có nhịp độ nhanh - tốt, nó khá tệ cho trò chơi. Những hiệu ứng này chính xác là lý do tại sao các gamedev thường thích UDP hơn TCP.

Tuy nhiên, khi sử dụng UDP để giảm độ trễ - điều quan trọng là phải nhận ra rằng chỉ "sử dụng UDP" là không đủ để cải thiện độ trễ đáng kể, tất cả là về CÁCH BẠN đang sử dụng UDP. Đặc biệt, trong khi các thư viện RUDP thường tránh "backoffential mũ" đó và sử dụng thời gian truyền lại ngắn hơn - nếu chúng được sử dụng như một luồng "có thứ tự đáng tin cậy", thì chúng vẫn phải chịu Chặn đầu dòng (vì vậy trong trường hợp gấp đôi mất gói, thay vì 600ms, chúng tôi sẽ nhận được khoảng 1,5 * 2 * RTT - hoặc với RTT 80ms khá tốt, đó là độ trễ ~ 250ms, đây là một cải tiến, nhưng vẫn có thể làm tốt hơn). Mặt khác, nếu sử dụng các kỹ thuật được thảo luận trong http://gafferongames.com/networked-physics/snapshot-compression/ và / hoặc http: // ithare. , có thể loại bỏ hoàn toàn việc chặn Head-of-Line (vì vậy, đối với việc mất gói kép cho trò chơi với 20 lần cập nhật / giây, độ trễ sẽ là 100ms bất kể RTT).

Và như một lưu ý phụ - nếu bạn chỉ có quyền truy cập vào TCP nhưng không có UDP (chẳng hạn như trong trình duyệt hoặc nếu khách hàng của bạn đứng sau một trong 6-9% tường lửa xấu xí chặn UDP) - dường như có một cách để triển khai UDP-over-TCP mà không phát sinh quá nhiều độ trễ, xem tại đây: http://ithare.com/al ultra -zo-additable -latency-udp-over-tcp / (đảm bảo cũng đọc các bình luận (!)).


13

Mỗi kết nối TCP yêu cầu bắt tay ban đầu trước khi dữ liệu được truyền. Ngoài ra, tiêu đề TCP chứa rất nhiều chi phí dành cho các tín hiệu và phát hiện gửi tin nhắn khác nhau. Đối với trao đổi tin nhắn, UDP có thể sẽ đủ nếu một cơ hội thất bại nhỏ được chấp nhận. Nếu biên nhận phải được xác minh, TCP là lựa chọn tốt nhất của bạn.


Cơ hội thất bại nhỏ và giới hạn về kích thước gói.

11

@Andrew , tôi xin khác. UDP là sự lựa chọn trong một số loại ứng dụng vì yêu cầu về hiệu năng. Một ví dụ kinh điển là hội nghị truyền hình. Loại ứng dụng này không đáp ứng tốt với điều khiển TCP.

Một khía cạnh khác cần xem xét là nếu bạn sẽ cần phát đa hướng. Nếu vậy, sử dụng UDP.


8
UDP cũng được sử dụng vì nếu bạn bỏ lỡ một hoặc hai gói, dù sao thì có lẽ đã quá muộn và tốt nhất là bạn nên bỏ qua nó và tiếp tục để bạn có thể tiếp tục xem. Một đốm sáng nhỏ trong video vì một số gói bị rơi tốt hơn nhiều so với việc bị tắc nghẽn.
Kibbee

1
Đúng - đa truyền mạng là khá hiếm hầu hết các bộ định tuyến chặn nó.
user1496062

8

Nếu bạn cần nhanh chóng gửi một tin nhắn qua mạng giữa hai IP chưa được nói đến, thì một UDP sẽ đến nhanh hơn ít nhất 3 lần, thường là nhanh hơn 5 lần.


1
Bất kỳ tài liệu tham khảo?
Gerard

8

Tôi sẽ chỉ làm cho mọi thứ rõ ràng. TCP / UDP là hai chiếc xe đang được lái trên đường. giả sử rằng các biển báo và chướng ngại vật giao thông là lỗi TCP quan tâm đến các biển báo giao thông, tôn trọng mọi thứ xung quanh. Lái xe chậm vì một cái gì đó có thể xảy ra với chiếc xe. Trong khi UDP chỉ tắt, tốc độ tối đa không liên quan đến biển báo đường phố. Không có gì, một tài xế điên. UDP không có lỗi khôi phục, nếu có chướng ngại vật, nó sẽ va chạm với nó sau đó tiếp tục. Mặc dù TCP đảm bảo rằng tất cả các gói được gửi và nhận hoàn hảo, Không có lỗi, vì vậy, chiếc xe chỉ vượt qua chướng ngại vật mà không va chạm. Tôi hy vọng đây là một ví dụ tốt để bạn hiểu, Tại sao UDP được ưa thích trong chơi game. Chơi game cần tốc độ. TCP được ưu tiên tải xuống hoặc các tệp đã tải xuống có thể bị hỏng.


7

UDP là một chút nhanh hơn trong kinh nghiệm của tôi, nhưng không nhiều. Sự lựa chọn không nên được thực hiện về hiệu suất nhưng về nội dung tin nhắn và kỹ thuật nén.

Nếu đó là một giao thức có trao đổi thông báo , tôi khuyên rằng hiệu năng rất nhẹ mà bạn đạt được với TCP sẽ đáng giá hơn nó. Bạn được cung cấp một kết nối giữa hai điểm cuối sẽ cung cấp cho bạn mọi thứ bạn cần. Đừng thử và sản xuất giao thức hai chiều đáng tin cậy của riêng bạn trên UDP trừ khi bạn thực sự, thực sự tự tin vào những gì bạn đang thực hiện.


5

Hãy nhớ rằng TCP thường giữ nhiều tin nhắn trên mạng. Nếu bạn muốn thực hiện điều này trong UDP, bạn sẽ có khá nhiều công việc nếu bạn muốn thực hiện nó một cách đáng tin cậy. Giải pháp của bạn sẽ là ít đáng tin cậy hơn, nhanh hơn hoặc một lượng công việc đáng kinh ngạc. Có những ứng dụng hợp lệ của UDP, nhưng nếu bạn hỏi câu hỏi này thì có lẽ bạn không biết.


5

Đã có một số công việc được thực hiện để cho phép lập trình viên có được lợi ích của cả hai thế giới.

SCTP

Nó là một lớp vận chuyển độc lập protolol, nhưng nó có thể được sử dụng như một thư viện cung cấp lớp bổ sung trên UDP. Đơn vị giao tiếp cơ bản là một tin nhắn (được ánh xạ tới một hoặc nhiều gói UDP). Có kiểm soát tắc nghẽn được tích hợp. Giao thức có các nút và twiddles để bật

  • để gửi tin nhắn
  • tự động truyền lại tin nhắn bị mất, với các tham số do người dùng xác định

nếu bất kỳ điều này là cần thiết cho ứng dụng cụ thể của bạn.

Một vấn đề với điều này là thiết lập kết nối là một quá trình phức tạp (và do đó chậm)

Những thứ tương tự khác

Thêm một điều thử nghiệm độc quyền tương tự

Điều này cũng cố gắng cải thiện cách bắt tay ba cách của TCP và thay đổi điều khiển tắc nghẽn để xử lý tốt hơn các đường nhanh.


3

Thật vô nghĩa khi nói về TCP hoặc UDP mà không tính đến điều kiện mạng. Nếu mạng giữa hai điểm có chất lượng rất cao, UDP hoàn toàn nhanh hơn TCP, nhưng trong một số trường hợp khác như mạng GPRS, TCP có thể nhanh hơn và đáng tin cậy hơn UDP.


1

Thiết lập mạng là rất quan trọng cho bất kỳ phép đo. Nó tạo ra một sự khác biệt lớn, nếu bạn đang giao tiếp qua các ổ cắm trên máy cục bộ của bạn hoặc với đầu kia của thế giới.

Ba điều tôi muốn thêm vào cuộc thảo luận:

  1. Bạn có thể tìm thấy ở đây một bài viết rất hay về TCP so với UDP trong bối cảnh phát triển trò chơi.
  2. Ngoài ra, iperf ( jperf tăng cường iperf với GUI) là một công cụ rất hay để tự trả lời câu hỏi của bạn bằng cách đo.
  3. Tôi đã triển khai một điểm chuẩn trong Python (xem câu hỏi SO này ). Trung bình 10 ^ 6 lần lặp, sự khác biệt khi gửi 8 byte là khoảng 1-2 micro giây cho UDP.

1
Để làm cho điểm chuẩn phù hợp với Internet trong thế giới thực, bạn cần chạy lại nó với một trình giả lập mất gói như netem. Nếu thực hiện đúng (và với RTT mô phỏng là 100ms và mất gói mô phỏng 1%), kết quả sẽ khác nhau đáng kể. Nói tóm lại - trong khi độ trễ TCP và UDP thực sự giống nhau khi mất gói không - chúng bắt đầu khác nhau rất nhiều cho mỗi gói bị mất.
No-Bugs Hare
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.