2009-02-20 39 views
14

Không chặn TCP/IP SocketChannels và Selector trong NIO giúp tôi xử lý nhiều kết nối TCP/IP với số lượng chủ đề nhỏ. Nhưng làm thế nào về UDP DatagramChannels? (Tôi phải thừa nhận rằng tôi không quen thuộc với UDP.)Không chặn UDP I/O khi chặn UDP I/O trong Java

Hoạt động gửi UDP dường như không chặn ngay cả khi DatagramChannel không hoạt động ở chế độ chặn. Có thực sự là một trường hợp DatagramSocket.send (DatagramPacket) khối do tắc nghẽn hoặc một cái gì đó tương tự? Tôi thực sự tò mò nếu có trường hợp như vậy và những trường hợp có thể tồn tại trong môi trường sản xuất.

Nếu DatagramSocket.send (DatagramPacket) không thực sự chặn và tôi sẽ không sử dụng DatagramSocket được kết nối và chỉ liên kết với một cổng, không có lợi thế nào khi sử dụng chế độ không chặn với DatagramChannel và Selector?

Trả lời

12

Đã lâu rồi kể từ khi tôi sử dụng DatagramSockets, Kênh và các loại tương tự của Java, nhưng tôi vẫn có thể cung cấp cho bạn một số trợ giúp.

Giao thức UDP không thiết lập kết nối như TCP. Thay vào đó, nó chỉ gửi dữ liệu và quên nó đi. Nếu điều quan trọng là phải đảm bảo rằng dữ liệu thực sự đến đó, đó là trách nhiệm của khách hàng. Vì vậy, ngay cả khi bạn đang ở trong chế độ chặn, hoạt động gửi của bạn sẽ chỉ chặn miễn là nó cần xóa bộ đệm ra. Vì UDP không biết gì về mạng, nó sẽ ghi nó ra ở cơ hội sớm nhất mà không kiểm tra tốc độ mạng hoặc nếu nó thực sự đến nơi nó được cho là sẽ đi. Vì vậy, với bạn, có vẻ như kênh thực sự đã sẵn sàng ngay lập tức để gửi nhiều hơn.

+1

Điều gì sẽ xảy ra nếu bộ đệm hạt nhân bị ngập do ghi quá nhanh trên ổ cắm UDP? – trustin

+0

Viết (cấp độ người dùng) của bạn sẽ chặn cho đến khi hạt nhân xóa các ổ cắm đó gửi đệm. – JLR

+7

Vì vậy, có sự khác biệt rõ ràng giữa ổ cắm UDP chặn và không chặn, giống như sự khác biệt giữa chặn TCP và không chặn. Tôi đã viết một ứng dụng khách PoC đơn giản và tôi xác nhận rằng gửi UDP kênh không chặn() thường trả về 0, trong khi chặn một không bao giờ trả về 0. Cảm ơn! – trustin

8

UDP không chặn (Nó chỉ chặn trong khi chuyển dữ liệu sang hệ điều hành) Điều này có nghĩa là tại bất kỳ thời điểm nào, hop/switch/máy tiếp theo không thể đệm gói UDP. Đây có thể là hành vi mong muốn trong một số trường hợp. Nhưng đó là điều bạn cần phải biết.

UDP cũng không đảm bảo để

  • gói giao hàng theo thứ tự chúng được gửi đi.
  • không chia nhỏ các gói lớn.
  • gói chuyển tiếp trên các nút chuyển. Thường thì chuyển tiếp UDP giữa các công tắc sẽ bị tắt.

Tuy nhiên UDP hỗ trợ phát đa hướng để cùng một gói có thể được gửi đến một hoặc nhiều máy chủ. Người gửi không có ý tưởng nếu bất cứ ai nhận được các gói tin tuy nhiên.

Một điều khó khăn về UDP là nó hoạt động phần lớn thời gian, nhưng đôi khi không thành công theo những cách rất khó để tái sản xuất. Vì lý do này, bạn không nên giả định độ tin cậy ngay cả khi bạn làm một vài bài kiểm tra và nó có vẻ hoạt động.

0

Không chặn UDP chủ yếu hữu ích ở phía bên nhận. Việc gửi gói chỉ có thể bị trì hoãn do hoàn cảnh cục bộ: công cụ định hình lưu lượng cục bộ như "thẻ mạng chơi game" ưu tiên lưu lượng truy cập trò chơi trên các nguồn lưu lượng khác hoặc thẻ mạng bị quá tải (điều này không có khả năng xảy ra) có thể trì hoãn việc gửi gói . Sau khi ra khỏi hệ thống. Khi gói tin rời khỏi giao diện cục bộ, nó không còn là mối quan tâm của ứng dụng nữa.

Các vấn đề liên quan