アプリケーションがバインドするポートを見つけるときに/etc/services
競合が発生しないことを確認するために積極的に検索しますか?つまり、 にポートが登録されていれば実際に使用するかどうか/etc/services
に関係なく予約されているのでしょうか?
ベストアンサー1
各 TCP 接続には 1 つは含まれませんが、二つポート番号:ローカルポートとリモートポート。発信接続では、ローカルポート番号は重要ではなく、ほとんどのプログラムではオペレーティングシステムにそれを選択させます。 binstaが指摘したように、オペレーティングシステムは一時ポート範囲から最初の利用可能なポートを自動的に選択します。
ただし、アプリケーション(またはアプリケーションを実行しているユーザー)は、接続するリモートポート番号を指定する必要があります。そうしないと、リモートホストから正しいサービスに接続できません。
着信接続の場合、状況はミラーリングされます。サーバーアプリケーションは通常、オペレーティングシステムに着信接続をリスンするローカルポート番号を選択させることはできません。そうしないと、クライアントは接続するポートを知ることができません。ただし、着信接続をリッスンするアプリケーションは、しばしばリモートポート番号を無視し、リモートホストにそれを決定させます。
(一部のサービスは完全動的ポート番号を使用し、多くの場合、サポート検索プロトコルを使用してサーバーがリッスンしているポートを識別します。NFSv3はrpc.statd
おそらくrpc.mountd
現代のLinuxユーザーにとって最も使いやすい例です。リモートホストに接続するにはまず、111のRPC portmapperポートからそのホストにアクセスし、サービスがどのポートにあるかを尋ねます。
一部のサーバーアプリケーション(主にクラシックUnixサーバーアプリケーションinetd
)は、使用するローカルポートを名前で見つけることができ、通常はインポートgetportbyname()
されます/etc/services
。
ただし、アプリケーションはこのステップをスキップし、目的のポートを数値で直接指定できます。ほとんどの最新アプリケーションはこれを行う傾向があります。番号で受信ポートを設定する必要があるすべてのサーバープログラムがこれを行います。
今日より一般的に使用されるアプリケーションは、出力のポート番号をより人間に優しい名前に置き換えることができる、またはなどのアプリケーション/etc/services
です。ただし、名前検索のためのこのポート番号は説明にのみ依存できることに注意してください。lsof
netstat
tcpdump
/etc/services
一般的な用途:ポートの正確な説明でもそうでない場合もあります。実際の使用特定のシステムで。
/etc/services
したがって、「ポートが に登録されていれば予約されていますか?」という質問に対する答えは次のとおりです。いいえ、そうではありません。。
一部/etc/services
ポート番号がアプリケーション設定で直接指定されている場合、またはユーザーが指定しない限り、アプリケーションはそれを使用して使用するポート番号を決定できます。
「衝突」に対する保護はオペレーティングシステムレベルで発生し、次の状況にはまったく関係ありません/etc/services
。アプリケーションがbind(2)
特定のポート番号を使用しようとしていることを指定するためにシステムコールを実行し、そのポートがすでに別のプログラムで使用されている場合、システムコールは失敗します。EADDRINUSE
これは、他がすでにそれを使用していることを示します。