Pergunta

Não-bloqueando SocketChannels TCP / IP e Selector em NIO me ajudar a lidar com muitas conexões TCP / IP com pequeno número de threads. Mas como sobre UDP DatagramChannels? (Devo admitir que eu não sou muito familiarizado com UDP.)

operações de envio

UDP não parecem bloquear, mesmo se o DatagramChannel não está operando no modo de bloqueio. Existe realmente um caso onde os blocos DatagramSocket.send(DatagramPacket) devido ao congestionamento ou algo semelhante? Estou muito curioso para saber se há tal caso um eo que existem os casos possíveis em um ambiente de produção.

Se DatagramSocket.send(DatagramPacket) realmente não bloquear e não estou indo para usar um DatagramSocket conectado e se ligam a apenas uma porta, que não há vantagem de usar o modo não-bloqueio com DatagramChannel e Selector?

Foi útil?

Solução

Tem sido um tempo desde que eu usei DatagramSockets do Java, Canais e similares, mas ainda posso lhe dar alguma ajuda.

O protocolo UDP não estabelece uma conexão como TCP faz. Em vez disso, ele só envia os dados e esquece-lo. Se é importante para se certificar de que os dados realmente fica lá, que é de responsabilidade do cliente. Assim, mesmo se você estiver no modo de bloqueio, a sua operação de envio só irá bloquear durante o tempo que for preciso para liberar o buffer de fora. Desde UDP não sabe nada sobre a rede, ele vai escrevê-lo na primeira oportunidade sem verificar a velocidade da rede ou se ele realmente fica para onde é suposto ir. Assim, para você, ele aparece como se o canal é realmente imediatamente pronto para mais de envio.

Outras dicas

UDP não bloqueia (apenas blocos enquanto está a transferir os dados para o OS) Isto significa que se, em qualquer ponto do próximo salto / interruptor / máquina não pode tamponar o pacote UDP que ele cai. Isso pode ser um comportamento desejável em algumas situações. Mas é algo que você precisa estar ciente.

UDP também não garante a

  • pacotes de entrega na ordem em que são enviados.
  • não para quebrar grandes pacotes.
  • encaminhar pacotes através de switches. Muitas vezes, o encaminhamento de UDP entre switches é desligada.

No entanto UDP suporta multicast de modo que o mesmo pacote pode ser entregue a um ou mais hosts. O remetente não tem idéia se alguém recebe os pacotes no entanto.

A coisa complicada sobre UDP é que funciona a maior parte do tempo, mas não mal, por vezes de maneiras que são muito difíceis de reproduzir. Por esta razão, você não deve assumir confiabilidade, mesmo se você fizer alguns testes e parece trabalho.

Não bloquear UDP é útil principalmente no lado receptor. Envio de pacotes só pode ser atrasada devido a circunstâncias locais: ferramentas de modelagem de tráfego locais como "placas de rede de jogos" que o tráfego priorizar jogos sobre outras fontes de tráfego, ou placa de rede sobrecarregada (que não é provável que aconteça) podem atrasar o envio de um pacote. Uma vez fora do sistema. Uma vez que as folhas de pacotes a interface local, ele não é mais a preocupação do aplicativo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top