UDP có làm được gì không?
Tôi hiểu rằng TCP có logic để đảm bảo giao tiếp đáng tin cậy, nhưng UDP chỉ gửi thông tin một cách ngây thơ dọc theo kênh được thiết lập cho nó bằng cách sử dụng IP và những thứ ở các lớp thấp hơn.
UDP có thực sự làm được gì không? Tôi hơi bối rối không hiểu tại sao nó lại có tên.
Trả lời
Quan điểm và câu hỏi thú vị!
Vâng, hầu hết những gì UDP làm là cung cấp một phương tiện tiêu chuẩn để nhiều ứng dụng cùng tồn tại bằng cách sử dụng cùng một địa chỉ IP, bằng cách xác định khái niệm về cổng UDP .
Phần thú vị về UDP không phải là giao thức mạng mà là API được triển khai bởi hệ điều hành và thư viện socket. Mặc dù bản thân nó không phải là một phần của các đặc tả UDP, nhưng khả năng sử dụng các phần trừu tượng như API socket POSIX để dễ dàng phát triển các giao thức phần mềm trên đỉnh như UDP là chìa khóa cho sự thành công của ngăn xếp Giao thức Internet.
UDP là một giao thức truyền tải, giống như TCP. Điều đó có nghĩa là nó cung cấp một giao thức để ứng dụng sử dụng IP. Giống như TCP, UDP có địa chỉ (cổng) mà các ứng dụng liên kết để các biểu đồ dữ liệu dành cho các ứng dụng bị ràng buộc được UDP gửi đến các ứng dụng chính xác. UDP cho IPv4 cũng cung cấp tổng kiểm tra tùy chọn, nhưng tổng kiểm tra là bắt buộc đối với IPv6.
UDP là một giao thức dựa trên tin nhắn, trong đó TCP là một giao thức dựa trên luồng. UDP có thể hữu ích cho các giao thức lớp ứng dụng để cung cấp một số, nhưng không phải tất cả các tính năng của TCP và nhiều ứng dụng hoặc giao thức lớp ứng dụng không thể sử dụng, hoặc thậm chí bị hỏng do độ tin cậy của TCP. Ví dụ: các giao thức thời gian thực, chẳng hạn như VoIP, video hoặc thậm chí chơi game, không thể sử dụng các biểu đồ dữ liệu bị mất sau khi chúng không còn hữu ích, vì vậy việc TCP gửi lại dữ liệu sẽ có kết quả xấu. Khi bạn sử dụng VoIP và người kia trả lời, bạn muốn nghe "Xin chào" chứ không phải "Ồ, chết tiệt".
Những thứ khác, chẳng hạn như đa hướng, là một chiều, nhưng TCP yêu cầu thiết lập kết nối hai chiều giữa hai ứng dụng, trong khi một ứng dụng đa hướng gửi dữ liệu đến nhiều máy thu. TCP thực sự không thể làm được điều đó, nhưng có thể dễ dàng sử dụng UDP với multicast.
Tôi khuyến khích bạn xem cách các giao thức cấp cao hơn sử dụng UDP thực sự sử dụng nó như thế nào. Các ví dụ cổ điển và được ghi chép rõ ràng là DNS (trong hầu hết các trường hợp, có thể sử dụng DNS qua TCP nhưng nó thực sự không phổ biến), DHCP, NTP và PTP.
Tất cả các giao thức này đều có một số điểm chung cụ thể:
- Họ quan tâm đến việc có thể cùng tồn tại với các dịch vụ khác trên cùng hệ thống.
- Họ quan tâm đến một số mức độ toàn vẹn dữ liệu của các thông điệp của họ.
- Chúng được định hướng thông điệp , không định hướng dòng .
- Chúng chủ yếu liên quan đến việc trao đổi dữ liệu rất ngắn và thường không thường xuyên.
Hai điểm đầu tiên được bao phủ bởi bất kỳ giao thức lớp truyền tải hợp lý nào (ngay cả những thứ kỳ lạ như TIPC), bao gồm cả TCP. Tuy nhiên, TCP là khủng khiếp cho hai điểm khác, bởi vì nó đòi hỏi bạn phải cuộn giao thức nhắn khung của riêng bạn trên đầu trang của các dòng của nó cho các giao thức thông điệp định hướng và khởi động kết nối và duy trì chi phí đáng kể phương tiện mà nó rất hiệu quả cho sự trao đổi thường xuyên thiếu dữ liệu .
Nói cách khác, 'tính năng' của UDP khiến nó đáng lo ngại là nó cung cấp mức tối thiểu cho hai điểm đầu tiên đó mà không cản trở bạn như TCP làm cho các loại ứng dụng này. Nó cũng có một chút lợi thế so với TCP ở chỗ nó tầm thườngđể triển khai hoàn toàn trong phần cứng hoặc trên một hệ thống nhỏ với ít hơn 1Kb RAM và một lượng nhỏ không gian lưu trữ cho mã (đây là một phần lý do tại sao BOOTP, RARP, TFTP và các giao thức bootstrap khác ban đầu sử dụng nó). Điểm bất lợi là độ tin cậy và dễ bị một số loại tấn công nhất định nếu sử dụng các 'kết nối' trạng thái lâu dài trên nó mà không được quản lý cẩn thận, nhưng các giao thức sử dụng nó và quan tâm đến nó lại tự xử lý nó (xem TFTP để biết ví dụ về xử lý vấn đề độ tin cậy, mặc dù phải trả giá bằng tốc độ).
Giờ đây, có những tùy chọn có thể đạt được các bộ tính năng tương tự (hoặc thậm chí là các bộ tính năng toàn diện hơn) cho TCP với chi phí thấp hơn nhiều và vẫn cho phép giao tiếp theo định hướng thông điệp (các ví dụ chính bao gồm RUDP, DCCP và SCTP), chúng thực sự không bị bắt vì nhiều lý do, vì vậy UDP chỉ là một loại tồn tại.
Có một điểm quan trọng là UDP không yêu cầu thiết lập "kết nối" .
Ví dụ, sẽ rất khó và phức tạp, nếu không muốn nói là không thể, để triển khai DHCP trên TCP, nơi máy khách không có địa chỉ IP và không có kiến thức về môi trường mạng hiện có. Do đó, việc "thiết lập kết nối" là vô nghĩa, vì máy khách không biết địa chỉ đích và không có địa chỉ nguồn. UDP làm cho việc này trở nên dễ dàng bằng cách cho phép phát một yêu cầu DHCP tới mạng hiện có và một (và hy vọng chỉ một) máy chủ DHCP sẽ phản hồi với một đề nghị.
Tương tự, hầu hết các hành động quảng bá mạng không có ý nghĩa gì với TCP *, bởi vì bạn không thể có "kết nối" với "mục tiêu phát sóng" nơi mọi máy chủ duy nhất chấp nhận và phản hồi. Những thứ như số thứ tự và tổng kiểm tra không cộng lại.
* Chúng tôi không nói về những thứ như thế nào MPI_Bcast(). Họ thực sự nằm ngoài phạm vi cho câu hỏi này.
Đối với tôi, điều quan trọng mà UDP làm là cung cấp cả số cổng nguồn và cổng đích và do đó không chỉ cho phép nhiều giao thức ứng dụng khác nhau mà còn cho phép nhiều phiên bản của cùng một giao thức ứng dụng.
Về nguyên tắc, bạn có thể xây dựng giao thức ứng dụng của mình trực tiếp trên IP và lấy số giao thức cho nó. Điều đó hoạt động tốt nếu bạn chỉ có một phiên bản của giao thức ứng dụng của mình trên mỗi máy chủ lưu trữ, tuy nhiên nó không hoạt động tốt nếu bạn muốn có nhiều phiên bản của cùng một giao thức ứng dụng trên mỗi máy chủ.
Bằng cách có số cổng nguồn và cổng đích riêng biệt và đánh giá các quy ước rằng máy khách sử dụng cổng tạm thời trong khi máy chủ sử dụng các cổng nổi tiếng và phản hồi hoán đổi số cổng, UDP hỗ trợ nhiều phiên bản của cùng một giao thức ứng dụng trên cùng một máy chủ.
Nó cung cấp các dịch vụ ghép kênh / phân kênh cho các lớp trên (Ứng dụng) để nó có thể xử lý dữ liệu từ các quy trình khác nhau. Với tổng kiểm tra, nó cũng sẽ cung cấp cho bạn khả năng phát hiện lỗi.
UDP, là một giao thức đơn giản, rất hữu ích cho các giao thức lớp trên thích giao tiếp nhanh chóng mà không cần thiết lập kết nối hoặc truyền dữ liệu đáng tin cậy.
Ngoài ra, một số giao thức như DNS, sử dụng UDP cho mục đích của chúng ...
Tôi nghĩ điều quan trọng cần lưu ý là DHCP dựa vào UDP 100% và nó được sử dụng cực kỳ rộng rãi.
Ngoài ra, DNS trước đây đã sử dụng UDP và chỉ sử dụng TCP khi phản hồi quá lớn đối với một gói UDP.