3 votes

Est-ce que la communication UDP en Java est cassée sur macOS?

J'ai essayé de comprendre pourquoi un programme Java qui utilise la communication UDP sur Windows fonctionne parfaitement à 100 % mais semble régulièrement perdre des paquets sur une version macOS de la JVM (8.x).

J'ai vu un autre fil de discussion sur StackExchange qui n'a jamais vraiment été résolu, mais il semble qu'une personne ait remarqué un problème similaire sur OSX là-bas également.

Je n'ai pas activé le pare-feu standard dans les préférences et je ne pense pas avoir de paramètres réseau spéciaux qui pourraient interrompre les datagrammes UDP. De plus, si j'exécute le même programme sur une machine virtuelle Windows 7 via VirtualBox sur le même matériel, le programme fonctionne très bien.

Des idées sur ce qu'il faut rechercher ou si c'est un problème connu ?

MISE À JOUR 2018-11-24 : Plus de détails. J'utilise Java 1.8.0_92-b14 d'Oracle sur un MacPro3,1 avec macOS 10.13.6. Le programme que j'exécute est ADTPro 2.0.2 en tant que serveur Ethernet essayant de communiquer avec un vieux Apple //e qui a un Uthernet II de l'autre côté de ADTPro. Il s'agit d'un logiciel pour transférer des images de disque vers/depuis les machines.

Le problème est que les transferts finissent souvent par expirer et échouer et il semble que des paquets se perdent et que le code n'est pas suffisamment sophistiqué pour corriger les erreurs et renvoyer/réessayer. En examinant le code source, tout semble être en UDP, ce qui soulève certainement des suspicions. Selon le mainteneur sur GitHub, le fait d'utiliser l'UDP est historique et personne n'a fait le travail de le convertir en TCP. Étant donné que le logiciel fonctionne parfaitement en communiquant avec une machine Windows avec les mêmes logiciels et versions Java, je suppose que c'est quelque chose lié à macOS ou à la version Java OSX et je demande si quelqu'un sait comment le déterminer avec certitude ou autrement. Est-ce que cela aide ?

0 votes

Pouvez-vous décrire le problème plus en détail? Le problème est-il uniquement la perte de paquets? Combien de paquets sont perdus? Quel type d'interface? (Ethernet?) Pouvez-vous vérifier la perte de paquets avec une trace de paquets? (Wireshark, tcpdump, etc) Quelle JVM utilisez-vous exactement? (Fournisseur et version)

0 votes

Comment mesurez-vous ?

0 votes

Fourni plus d'informations.

1voto

Oskar Points 1242

Non - UDP n'est pas fondamentalement cassé sur macOS (ou l'un des autres AppleOS)

La définition de l'UDP est des paquets de données unicast et en raison de la nature d'envoi et d'oubli du casting, la livraison de ces derniers est parfois plaisamment appelée des paquets de données non fiables.

Comme étape de dépannage, ma première étape de triage serait d'établir que le commutateur et le routeur distribuent effectivement les paquets à l'interface macOS. Wireshark ou un outil de gestion sur votre réseau serait d'excellents outils pour enregistrer ces paquets pour voir s'ils sont distribués.

Je ne me préoccuperais pas des gens disant que TCP est plus ou moins fiable que UDP puisque l'UDP présente de nombreux avantages techniques pour les performances de streaming et que vous êtes sur la bonne voie en vous concentrant sur une application Java spécifique qui consomme des données sur un Mac spécifique de votre réseau. Beaucoup de vos détails sont bons, mais c'est un peu comme détailler la pression dans les pneus et la couleur de la peinture lorsque vous devez en fait savoir si le conducteur a pris une à droite dans votre rue.

Pouvez-vous exécuter Wireshark et vérifier les paquets ou accéder aux journaux réseau pour vérifier l'expéditeur et vous pourriez également avoir besoin de faire un peu de recherche sur UDP et poser une question de suivi si cela concerne effectivement davantage le réseau.

0 votes

Je suis capable de faire passer de nombreux paquets car cela fonctionne pendant un certain temps aléatoire, mais ensuite cela tombe en panne à un moment donné et je dois attendre que le logiciel se rende compte qu'il y a un manque de communication et se réinitialise. Bien sûr, cela semble être la faute du logiciel car il n'a pas une bonne gestion des erreurs (c'est donc en partie pourquoi je pense qu'il doit simplement être réécrit en TCP pour éviter ce genre de problème), mais ce qui est déroutant, c'est qu'une JVM Windows sur la même machine ne montre pas le même problème.

0voto

Sam Ginrich Points 101

J'avais même un problème de base avec la liaison d'un socket de datagramme en utilisant Java 8. Le changement de jeu a été de réduire la taille du tampon d'envoi/réception à 8K par les options du socket.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X