UDP: giao thức không kết nối và cách hoạt động

Tác giả: IT Sectr Đã đăng: 2026-03-06 Thời gian đọc: 8 phút

UDP (User Datagram Protocol) là giao thức truyền dữ liệu không kết nối hoạt động trên IP và cung cấp độ trễ tối thiểu khi gửi dữ liệu. Không giống như TCP, UDP không đảm bảo giao hàng, thứ tự gói tin hoặc bảo vệ khỏi trùng lặp. Theo IETF RFC 768 (2024), UDP xử lý hơn 40% lưu lượng Internet toàn cầu nhờ các cuộc gọi video, streaming và truy vấn DNS.

Những điểm chính

  • UDP là giao thức không kết nối gửi dữ liệu mà không cần xác nhận giao hàng
  • Độ trễ tối thiểu đạt được nhờ không có bắt tay, kiểm soát tắc nghẽn và truyền lại
  • Được sử dụng trong cuộc gọi video, trò chơi trực tuyến, DNS, DHCP và streaming
  • Tiêu đề UDP chỉ 8 byte so với 20–60 byte của TCP
  • Mất gói tin được bù đắp ở lớp ứng dụng qua FEC, truyền lại hoặc dự phòng dữ liệu

UDP là gì?

UDP (User Datagram Protocol) là một trong những giao thức chính của lớp truyền tải trong mô hình TCP/IP, được David Reed thiết kế vào năm 1980. Nó cung cấp cơ chế truyền dữ liệu tối thiểu: ứng dụng gửi một dữ liệu và giao thức không theo dõi xem nó có đến được người nhận hay không.

Tiêu đề UDP chỉ gồm bốn trường: cổng nguồn, cổng đích, độ dài và tổng kiểm tra. Mỗi trường chiếm 2 byte, vì vậy tổng kích thước tiêu đề là 8 byte. Để so sánh, tiêu đề TCP không có tùy chọn là 20 byte, và có tùy chọn — lên đến 60 byte.

Giao thức không hỗ trợ phân mảnh ở cấp độ riêng của nó — nếu một dữ liệu vượt quá MTU (Maximum Transmission Unit), nó sẽ bị phân mảnh ở cấp IP. Nếu một mảnh bị mất, toàn bộ dữ liệu sẽ bị loại bỏ, vì UDP không thể yêu cầu truyền lại các mảnh riêng lẻ. Các nhà phát triển phải kiểm soát kích thước dữ liệu — đối với mạng di động, MTU thường là 1400 byte, vì vậy kích thước tối đa không được vượt quá giá trị này.

UDP hoạt động như thế nào

Một ứng dụng sử dụng UDP tạo một socket loại SOCK_DGRAM, chỉ định cổng và địa chỉ IP đích, và gửi một dữ liệu. Giao thức thêm một tiêu đề tối thiểu và chuyển gói tin đến lớp IP. Người nhận lắng nghe trên cổng của mình và trích xuất dữ liệu từ các dữ liệu đến.

UDP không thực hiện kiểm soát tắc nghẽn — ứng dụng có thể gửi dữ liệu ở tốc độ tối đa mà mạng hỗ trợ. Điều này có thể dẫn đến tắc nghẽn kênh, nhưng trong các kịch bản thời gian thực, sự tích cực như vậy là hợp lý: đối với cuộc gọi video, luồng dữ liệu có thể mất mát quan trọng hơn việc dừng truyền.

python
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()

Trong ví dụ này, một socket SOCK_DGRAM được tạo cho UDP. Phương thức sendto gửi một dữ liệu mà không thiết lập kết nối — chỉ cần biết IP và cổng của người nhận. Phương thức recvfrom ở phía máy chủ trả về cả dữ liệu và địa chỉ của người gửi để phản hồi. Các socket UDP trên nền tảng di động được cấu hình tương tự nhưng yêu cầu thêm quyền: trên iOS, cần thêm NSAppTransportSecurity cho kết nối UDP không mã hóa, và trên Android, quyền INTERNET trong tệp kê khai.

Ưu và nhược điểm của UDP

Chọn UDP là hợp lý trong các kịch bản mà tốc độ quan trọng hơn độ tin cậy. Giao thức không lãng phí thời gian vào thiết lập kết nối, xác nhận và truyền lại — điều này mang lại độ trễ tối thiểu, nhưng yêu cầu nhà phát triển xử lý mất mát một cách độc lập.

Ưu điểmNhược điểm
Độ trễ thấp — không bắt tayKhông đảm bảo giao hàng
Tiêu đề nhỏ hơn — 8 byteKhông kiểm soát tắc nghẽn
Hỗ trợ broadcast và multicastCó thể trùng lặp gói tin
Dữ liệu độc lập — không xếp hàngKích thước dữ liệu bị giới hạn bởi MTU

Trong ứng dụng di động, UDP được sử dụng qua các framework như WebRTC, thêm kiểm soát mất mát, tốc độ bit thích ứng và bộ đệm jitter trên UDP. Điều này mang lại lợi ích về tốc độ mà không có nhược điểm của giao thức trần.

Một khía cạnh quan trọng khác của UDP là không có kiểm soát tắc nghẽn. Trong TCP, các thuật toán Slow Start và Congestion Avoidance giảm tốc độ truyền khi mất gói tin để tránh quá tải mạng. UDP thiếu các cơ chế như vậy, vì vậy các nhà phát triển phải tự triển khai chiến lược kiểm soát tốc độ — ví dụ, tốc độ bit thích ứng trong cuộc gọi video hoặc giới hạn tốc độ trong máy chủ trò chơi để ngăn tắc nghẽn mạng quá mức.

UDP được sử dụng ở đâu

UDP không thể thiếu trong các kịch bản mà khả năng chịu độ trễ quan trọng hơn khả năng chịu mất gói tin. Hãy khám phá các lĩnh vực ứng dụng chính của giao thức trong phát triển di động và web.

Streaming âm thanh và video

Các giao thức RTP và RTSP, chạy trên UDP, được sử dụng để truyền luồng âm thanh và video thời gian thực. WebRTC — tiêu chuẩn cho cuộc gọi video trong trình duyệt và ứng dụng di động — sử dụng UDP làm phương tiện truyền tải chính cho dữ liệu đa phương tiện và TCP cho báo hiệu. Mất một gói tin trong video 30 fps là không thể nhận thấy đối với người dùng, không giống như độ trễ truyền lại gây ra hiện tượng đóng băng hình ảnh rõ rệt.

Trò chơi trực tuyến

Các game bắn súng nhiều người chơi và MOBA yêu cầu độ trễ dưới 50 ms để đồng bộ hóa thích hợp. UDP truyền vị trí người chơi, phát bắn và sự kiện nhanh hơn TCP, và mất gói tin đơn giản bị bỏ qua — bản cập nhật tiếp theo sẽ đến trong 16–33 ms. Các engine trò chơi phổ biến, bao gồm Unity và Unreal Engine, sử dụng UDP qua các lớp truyền tải riêng với độ tin cậy bổ sung cho các sự kiện quan trọng thông qua xác nhận ở cấp ứng dụng.

DNS và DHCP

Truy vấn DNS sử dụng UDP trên cổng 53 vì mỗi truy vấn là một dữ liệu nhỏ duy nhất (thường lên đến 512 byte). Nếu không có phản hồi, máy khách chỉ cần thử lại sau một thời gian chờ, nhanh hơn so với thiết lập kết nối TCP với bắt tay ba bước. DHCP cũng hoạt động trên UDP, vì máy khách chưa có địa chỉ IP và không thể thiết lập kết nối TCP, trong khi các gói UDP broadcast cho phép tìm máy chủ DHCP trên mạng cục bộ.

So sánh UDP và TCP

Sự lựa chọn giữa UDP và TCP là sự đánh đổi giữa tốc độ và độ tin cậy. Mỗi giao thức tối ưu cho lớp nhiệm vụ của nó, và hiểu sự khác biệt giữa chúng giúp đưa ra quyết định kiến trúc đúng đắn khi thiết kế giao tiếp mạng trong ứng dụng di động.

Tiêu chíUDPTCP
Thiết lập kết nốiKhông cầnBắt tay ba bước
Tiêu đề8 byte20–60 byte
Đảm bảo giao hàngKhôngCó, với xác nhận
Sắp xếp thứ tựKhông
Kiểm soát tắc nghẽnKhôngCó (AIMD, Slow Start)
Trường hợp sử dụngStreaming, trò chơi, DNSWeb, email, tệp, API

Các dự án di động thường sử dụng phương pháp kết hợp: TCP cho các yêu cầu đáng tin cậy (xác thực, tải dữ liệu) và UDP cho luồng đa phương tiện. QUIC — giao thức hiện đại của Google chạy trên UDP — kết hợp tốc độ của UDP với độ tin cậy của TCP và đã được sử dụng trong HTTP/3.

Ví dụ mã UDP

Hãy xem xét một máy chủ UDP đơn giản bằng Python nhận tin nhắn từ máy khách và gửi phản hồi. Máy chủ lắng nghe trên cổng 8888 và xử lý các dữ liệu đến trong một vòng lặp vô hạn.

python
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('Máy chủ UDP đã khởi động trên cổng 8888')

while True:
    data, addr = server.recvfrom(1024)
    print(f'Đã nhận từ {addr}: {data.decode()}')
    server.sendto(b'OK', addr)

Máy chủ tạo một socket UDP, gắn vào cổng 8888 và chờ các dữ liệu đến. recvfrom trả về dữ liệu và địa chỉ của máy khách, cho phép phản hồi qua sendto. Không giống như TCP, máy chủ không duy trì trạng thái kết nối — mỗi dữ liệu được xử lý độc lập. Điều này làm cho máy chủ UDP có khả năng mở rộng: một máy chủ duy nhất có thể xử lý hàng triệu máy khách mà không cấp phát bộ nhớ cho từng kết nối riêng lẻ, điều quan trọng đối với máy chủ DNS và hệ thống ghép trận trò chơi.

Trong phát triển di động, UDP thường được sử dụng qua các thư viện cấp cao. Ví dụ, CocoaAsyncSocket cho iOS cung cấp socket UDP với delegate và GCD để xử lý sự kiện bất đồng bộ. Trên Android, lớp DatagramSocket là một phần của thư viện java.net tiêu chuẩn và không yêu cầu phụ thuộc bổ sung. Cho Flutter, có gói udp cung cấp giao diện đơn giản để gửi và nhận dữ liệu mà không cần cấu hình socket gốc.

Điều quan trọng cần lưu ý là nhiều mạng di động và tường lửa doanh nghiệp chặn lưu lượng UDP, đặc biệt trên các cổng trên 1024. Nếu ứng dụng của bạn sử dụng UDP, bạn phải cung cấp phương án dự phòng sang TCP hoặc kiểm tra khả dụng của giao thức qua máy chủ STUN, như WebRTC làm. Trên iOS, framework hệ thống Network.framework với NWConnection hỗ trợ cả TCP và UDP, tự động chọn giao thức tối ưu dựa trên khả dụng. Đối với ứng dụng thời gian thực, cũng nên triển khai tốc độ bit thích ứng, giảm chất lượng luồng khi mất gói tin, đảm bảo phát lại liên tục ngay cả trên kênh không ổn định với tỷ lệ lỗi cao.

Câu hỏi thường gặp

UDP khác TCP như thế nào?

UDP không thiết lập kết nối và không đảm bảo giao hàng gói tin, khiến nó nhanh hơn TCP. Tiêu đề UDP là 8 byte so với 20–60 byte của TCP. UDP phù hợp cho streaming và trò chơi, trong khi TCP dành cho yêu cầu web và truyền tệp.

Dữ liệu trong UDP là gì?

Dữ liệu là gói tin độc lập với tiêu đề UDP (cổng nguồn, cổng đích, độ dài, tổng kiểm tra). Mỗi dữ liệu được xử lý độc lập, không liên quan đến các dữ liệu trước. Kích thước dữ liệu bị giới hạn bởi MTU mạng và theo đặc tả — lên đến 65507 byte.

Độ tin cậy được đảm bảo như thế nào khi sử dụng UDP?

UDP không cung cấp độ tin cậy ở cấp độ truyền tải — nó được triển khai bởi ứng dụng. Nhà phát triển thêm số thứ tự, tổng kiểm tra, yêu cầu truyền lại và sửa lỗi. FEC (Forward Error Correction) cho phép khôi phục gói tin bị mất mà không cần truyền lại.

Khi nào không nên sử dụng UDP?

UDP không phù hợp cho các kịch bản mà tính toàn vẹn dữ liệu quan trọng: truyền tệp, giao dịch ngân hàng, REST API. Trong những trường hợp này, TCP đảm bảo mỗi byte đến đúng thứ tự. UDP cũng không được khuyến nghị trên các kênh không ổn định với tỷ lệ mất cao.

QUIC là gì và nó liên quan đến UDP như thế nào?

QUIC là giao thức truyền tải chạy trên UDP, được Google phát triển và IETF chuẩn hóa thành RFC 9000. Nó kết hợp tốc độ của UDP với độ tin cậy của TCP, hỗ trợ ghép kênh không chặn đầu dòng và có mã hóa tích hợp. HTTP/3 sử dụng QUIC làm lớp truyền tải.

Tổng kết

  • UDP là giao thức không kết nối với độ trễ tối thiểu và tiêu đề 8 byte
  • Không đảm bảo giao hàng, thứ tự gói tin hoặc bảo vệ khỏi trùng lặp
  • Được sử dụng trong cuộc gọi video, trò chơi trực tuyến, DNS, DHCP và streaming
  • Chọn UDP hay TCP phụ thuộc vào sự cân bằng giữa tốc độ và độ tin cậy cho mỗi kịch bản
  • Mất gói tin được bù đắp ở lớp ứng dụng qua FEC, truyền lại hoặc dự phòng
  • QUIC trên UDP kết hợp tốc độ của UDP với độ tin cậy của TCP trong giao thức HTTP/3
  • Nhà phát triển phải kiểm soát kích thước dữ liệu và cung cấp phương án dự phòng sang TCP khi UDP bị chặn hoặc lọc trên mạng

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm