Linux は NFS サービスで使用され、すべてのインターフェイス "::" にバインドされる一時ポートを提供します。

Linux は NFS サービスで使用され、すべてのインターフェイス "::" にバインドされる一時ポートを提供します。

localhost"(ポート0にバインドされている)の一時ポートを使用して作成されたJavaソケットサーバーがあります。しかし、一度実行すると、netstatは、すべてのインターフェイスの同じポートをリッスンする別のプロセスがあることを示しています。

netstat出力は次のとおりです。

$ sudo netstat -n -a -p | grep 34797
tcp6       0  0   127.0.0.1:34797     :::*        LISTEN      4210/java
tcp6       0  0   :::34797            :::*        LISTEN      -         

使ってみるとrpcinfoNFSであることを確認しましたnlockmgr。ソケットサーバを同じポートに明示的にバインドすることで34797問題を再現できます。

rpc.mountdNFSサービス(、)で使用されるポートにのみ適用されますnlockmgr。既存のアプリケーションがインターフェイスにバインドされているポートに対して同じ操作を実行しようとすると、バインディング::エラーAddress already in useが発生します。これは予想通りです。

要求を受け取るために実行中のサービスを混乱させるので、これが問題になります。

私の質問は、NFSサービスがなぜそんなに特別なのか、そしてLinuxで(すでに使用されている一時ポートを割り当てることによって)これが起こるのを許可する理由です。

答え1

一般的に言えば、あなたが経験することはできるIPv6の場合は、既存の方法を維持してください。

あなたの場合、「すべてのアドレス」バインディングはIPv6アドレス、「localhost」アドレスバインディングはIPv4アドレスです。 IPv6「全アドレス」のアプリケーションバインディングが設定されている場合IPV6_V6ONLYソケットオプション。

Linuxでは、このオプションにはレポート設定可能なシステム全体のデフォルト値もあるため、IPv4とIPv6/proc/sys/net/ipv6/bindv6only0TCP / UDPポート番号スペースを共有します。

127.0.0.1:34797 LISTEN また、ソケットにタグが付けられているという事実は、tcp6この目的とは関係ありません。これは、IPv6ネットワークスタックでサポートされていてもIPv4アドレスと見なされるためです。これも標準行動

あなたの場合、結果はTCP接続がアプリケーション127.0.0.1:34797に移動し、java同じポートへの接続ですが、コンピュータのIPv6アドレスはNFSロックサーバーに移動することです。

NFS開発者がこれを選択した理由1についてはわかりませんが、NFSに限定されていません。 IPv4およびIPv6アドレス(デフォルトでは「すべてのアドレス」すべて)、IPv40.0.0.0およびIPv6アドレスをそれぞれバインドするOpenSSHデーモンを参照してください::

さらに、一部のオペレーティングシステムではそのオプションもサポートされておらずIPV6_V6ONLY(設定を許可しない)、そのシステムで得られる唯一の動作は、IPv4とIPv6の間のポート番号スペースが完全に分離されることです。 IPv4 と IPv6 の両方をサポートするには、同じポートを 2 回バインドします。

1. 詳しく調べたことはないがここ はい関連コードの一部である可能性があります

関連情報