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 -
使ってみるとrpcinfo
NFSであることを確認しましたnlockmgr
。ソケットサーバを同じポートに明示的にバインドすることで34797
問題を再現できます。
rpc.mountd
NFSサービス(、)で使用されるポートにのみ適用されますnlockmgr
。既存のアプリケーションがインターフェイスにバインドされているポートに対して同じ操作を実行しようとすると、バインディング::
エラーAddress already in use
が発生します。これは予想通りです。
要求を受け取るために実行中のサービスを混乱させるので、これが問題になります。
私の質問は、NFSサービスがなぜそんなに特別なのか、そしてLinuxで(すでに使用されている一時ポートを割り当てることによって)これが起こるのを許可する理由です。
答え1
一般的に言えば、あなたが経験することはできるIPv6の場合は、既存の方法を維持してください。
あなたの場合、「すべてのアドレス」バインディングはIPv6アドレス、「localhost」アドレスバインディングはIPv4アドレスです。 IPv6「全アドレス」のアプリケーションバインディングが設定されている場合IPV6_V6ONLY
ソケットオプション。
Linuxでは、このオプションにはレポート設定可能なシステム全体のデフォルト値もあるため、IPv4とIPv6/proc/sys/net/ipv6/bindv6only
は0
TCP / 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 回バインドします。