9.9. UDP -- gửi gói tin, hy vọng điều tốt nhất¶
UDP, giao thức datagram người dùng, là dịch vụ đơn giản hơn trong hai dịch vụ mà tầng vận chuyển cung cấp. Mỗi lần gửi UDP là một datagram -- một khối byte tự chứa được địa chỉ hóa đến một IP và một cổng, được thả vào mạng một mình. Giao thức phân phối nó nếu có thể; nếu không thể, nó không thử lại, không cảnh báo người gửi, và không giữ bất kỳ thứ tự nào giữa các datagram.
9.9.1. Những gì UDP bổ sung cho IP¶
UDP là một tầng mỏng trên nền IP. Nó bổ sung ba thứ vào việc phân phối IP thô:
Số cổng ở cả hai đầu, để một datagram có thể được giao đến đúng chương trình trên máy chủ đích, không chỉ là máy chủ (xem Cổng (Ports)).
Trường độ dài để bên nhận biết chính xác bao nhiêu byte của payload cần đọc.
Checksum nhỏ trên header và payload, để bên nhận có thể phát hiện datagram bị hỏng và loại bỏ nó.
Chỉ vậy thôi. Mọi thứ khác mà IP làm hoặc không làm, UDP giữ nguyên. Các datagram không được thử lại. Chúng có thể đến không đúng thứ tự. Chúng có thể bị trùng lặp do các đặc điểm kỳ lạ của mạng bên dưới. Chúng có thể bị bỏ đi im lặng nếu mạng bị tắc nghẽn, bộ đệm tại đích đầy, hoặc một trong các router ở giữa quyết định như vậy.
Mỗi UDP datagram được gửi độc lập. Nếu một cái bị mất trong quá trình truyền, không có gì thông báo cho bên gửi hoặc bên nhận -- khoảng trống là im lặng.¶
9.9.2. Tại sao lại dùng nó¶
Nếu UDP không đáng tin cậy như vậy, tại sao lại có nó? Ba lý do.
Tốc độ và chi phí. Một lần gửi UDP là một gói tin đơn đi ra; không có bắt tay, không có xác nhận, không có trạng thái kết nối cần duy trì. Độ trễ và chi phí băng thông là tối thiểu.
Các thông điệp độc lập. Một số lưu lượng là luồng cập nhật trạng thái khi mỗi thông điệp là một ảnh chụp mới và một cái cũ vô giá trị. Một camera phát "Tôi vẫn đang hoạt động, đây là chỉ số hiện tại của tôi" mỗi giây chỉ quan tâm đến việc phân phối mỗi số đọc mới, không phải về việc phát lại các số đọc đã bị mất.
Multicast. Một UDP datagram duy nhất có thể được gửi đến nhiều bên nhận cùng lúc. (TCP không thể làm điều đó; mỗi kết nối TCP là giữa đúng hai điểm cuối.) Hữu ích cho khám phá dịch vụ, telemetry đến nhiều người nghe, phát trực tuyến video.
Khi mạng tốt và khả năng chịu đựng mất mát của bên gửi cao, UDP là câu trả lời đúng. Khi việc phân phối và thứ tự phải được đảm bảo, UDP cần thêm một tầng tin cậy bên trên, hoặc ứng dụng nên dùng TCP thay thế.
9.9.3. Khi không nên dùng nó¶
Điều ngược lại cũng cần được nói rõ ràng. UDP là lựa chọn sai khi:
Mỗi byte đều quan trọng. Dữ liệu cấu hình, cập nhật mã, giao dịch đã ký -- bất kỳ trường hợp nào mà một byte bị thiếu làm cho kết quả sai.
Thứ tự quan trọng. UDP datagram 2 có thể đến trước datagram 1.
Thông điệp lớn. Các payload lớn phải được chia thành các datagram nhỏ hơn bởi ứng dụng; tầng vận chuyển sẽ không làm điều đó. Nếu bất kỳ phần nào bị mất, toàn bộ thông điệp là không đầy đủ.
Nếu bất kỳ điều nào trong số đó áp dụng, hãy dùng TCP thay thế.
9.9.4. Các ví dụ cụ thể trên camera¶
Các ví dụ về lưu lượng UDP trên camera trong thực tế:
Khám phá. Một camera phát quảng bá datagram "ai đang ở đây" đến mạng cục bộ khi khởi động; các thiết bị khác trả lời.
Telemetry. Mỗi giây, camera gửi một datagram nhỏ với các chỉ số cảm biến hiện tại của nó đến một bộ thu. Mất đôi khi một mẫu không quan trọng vì mẫu tiếp theo đến sau một giây nữa.
Đồng bộ hóa thời gian. NTP, giao thức thời gian mạng, chạy qua UDP. Client gửi một yêu cầu nhỏ, server trả lời với thời gian hiện tại; nếu trả lời bị mất, client chỉ hỏi lại sau.
Tra cứu DNS. Hỏi mạng "IP nào ứng với tên này?" chạy qua UDP. (Được đề cập ở Tên và DNS.)
API Python để gửi và nhận datagram có tại UDP sockets, sau khi câu chuyện còn lại của tầng vận chuyển được trình bày đầy đủ.