Estou experimentando a comunicação pela porta UDP 6666 (o objetivo é configurar um ouvinte para o netconsole, mas isso não é realmente relevante aqui).
Do lado da escuta, nc -luv 6666
. Do lado do envio, nc -uv LISTENER_IP 6666
. Posso enviar e receber, a vida é boa.
Agora deixo o ouvinte em execução, mas mato o remetente e inicio outro remetente. Termina imediatamente. Um rastreamento de rede revela que o servidor receptor envia um ICMP Port Unreachable . No entanto, o ouvinte ainda escuta:
$ sudo ss -nlup|grep 6666
UNCONN 0 0 :::6666 :::* users:(("nc",pid=3417,fd=3))
Eu desligo o receptor e executo um novo. Tudo funciona como antes até eu matar o remetente.
O remetente e o destinatário são máquinas físicas na mesma rede. O mesmo teste entre uma máquina física e uma VM em execução produz o mesmo resultado.
Como esse comportamento pode ser explicado?
Devido à maneira como as "conexões" UDP funcionam, esse comportamento é esperado. Isso é discutido na
nc6(1)
página de manual ("UDP"), mas também é aplicávelsocat
anc
:Quando você se conecta do lado do remetente, uma porta de origem UDP aleatória é escolhida. O receptor então se liga a esse
host:port
par específico e não escutará nenhuma outra conexão a partir de então. Para resolver isso, você precisa forçar o remetente a usar sempre a mesma porta. Eu useisocat
para este exemplo porque era mais fácil de fazer:Ouvinte:
Remetente:
Como você pode ver, a porta de origem mudou no remetente, mas se eu o forçasse a reutilizar a mesma porta, funcionaria.