Đố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?
Đố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?
Câu trả lời:
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)
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).
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ề).
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ỏ).
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.
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.
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 (!)).
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.
@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.
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.
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.
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.
Đã 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
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.
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.
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: