문제

비 블로킹 TCP/IP SocketChannel모래 Selector NIO에서는 적은 수의 스레드로 많은 TCP/IP 연결을 처리하도록 도와줍니다. 그러나 UDP는 어떻습니까? DatagramChannels? (저는 UDP에 익숙하지 않다는 것을 인정해야합니다.)

UDP Send 작업은 DatagramChannel 차단 모드에서 작동하지 않습니다. 실제로 사례가 있습니까? DatagramSocket.send(DatagramPacket) 혼잡으로 인한 블록 또는 비슷한 것? 그런 경우가 있고 생산 환경에서 가능한 사례가 무엇인지 궁금합니다.

만약에 DatagramSocket.send(DatagramPacket) 실제로 차단하지 않고 연결된 것을 사용하지 않을 것입니다. DatagramSocket 그리고 하나의 포트에만 바인딩되며, 비 차단 모드를 사용하는 이점이 없습니다. DatagramChannel 그리고 Selector?

도움이 되었습니까?

해결책

Java의 Datagramsockets, 채널 등을 사용한 지 오래되었습니다. 그러나 여전히 도움을 줄 수 있습니다.

UDP 프로토콜은 TCP와 같은 연결을 설정하지 않습니다. 오히려 그것은 단지 데이터를 보내고 그것을 잊어 버립니다. 데이터가 실제로 도착하는지 확인하는 것이 중요하다면 이는 고객의 책임입니다. 따라서 차단 모드에 있더라도 보내기 작업은 버퍼를 플러시하는 데 걸리는 한 오랫동안 차단됩니다. UDP는 네트워크에 대해 아무것도 알지 못하므로 네트워크 속도를 확인하지 않고 또는 실제로 가야 할 곳으로 도착하는지 가장 빠른 기회에 기록합니다. 따라서, 당신에게, 그것은 채널이 실제로 더 많은 전송을 위해 즉시 준비된 것처럼 보입니다.

다른 팁

UDP는 차단하지 않습니다 (데이터를 OS로 전송하는 동안 만 차단). 이는 어느 시점에서 다음 홉/스위치/머신이 UDP 패킷을 버퍼링 할 수없는 경우 삭제합니다. 이것은 어떤 상황에서는 바람직한 행동 일 수 있습니다. 그러나 그것은 당신이 알고 있어야 할 것입니다.

UDP도 보장하지 않습니다

  • 전송 순서대로 배달 패킷.
  • 큰 패킷을 분해하지 마십시오.
  • 스위치를 가로 지르는 패킷. 종종 스위치 간의 UDP 전달이 꺼집니다.

그러나 UDP는 멀티 캐스트를 지원하므로 동일한 패킷을 하나 이상의 호스트에게 전달할 수 있습니다. 그러나 발신자는 누군가가 패킷을 받는지 전혀 모른다.

UDP에 대한 까다로운 점은 대부분의 시간에 작동하지만 때로는 재생산하기가 매우 어려운 방식으로 실패합니다. 이러한 이유로, 몇 가지 테스트를 수행하고 작동하는 것처럼 보이더라도 신뢰성을 가정해서는 안됩니다.

비 블록 UDP는 주로 수신 측에서 유용합니다. 패킷 전송은 현지 상황으로 인해 지연 될 수 있습니다. 다른 트래픽 소스보다 게임 트래픽을 우선 순위를 정하는 "게임 네트워크 카드"와 같은 로컬 트래픽 형성 도구 또는 과부하 된 네트워크 카드 (발생하지 않을 가능성이 없음)는 패킷 발송을 지연시킬 수 있습니다. 한 번 시스템에서 벗어나. 패킷이 로컬 인터페이스를 떠나면 더 이상 응용 프로그램의 문제가 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top