コンピュータネットワークを科目として勉強していたとき、OSが宛先ポートに基づいてパケットを識別し、そのポートで実行されているアプリケーションに配信するという考えを持っていました。
後で、同じソース (SourceIP:SourcePort) を使用して 2 つの異なる宛先 (DestinationIP:DestinationPort) に接続できることを知りました。
tcp 0 0 192.168.1.5:60000 199.7.57.72:80 ESTABLISHED 1000 196102 10179/firefox
tcp 0 0 192.168.1.5:60000 69.192.3.67:443 ESTABLISHED 1000 200361 10179/firefox
tcp 0 0 192.168.1.5:60000 69.171.234.18:80 ESTABLISHED 1000 196107 10179/firefox
tcp 0 0 192.168.1.5:60000 107.21.19.182:22 ESTABLISHED 1000 196399 10722/ssh
tcp 0 0 192.168.1.5:60000 69.171.234.18:443 ESTABLISHED 1000 201792 10179/firefox
tcp 0 0 192.168.1.5:60000 69.192.3.34:443 ESTABLISHED 1000 200349 10179/firefox
tcp 0 0 127.0.0.1:4369 127.0.0.1:51889 ESTABLISHED 129 12036 1649/epmd
tcp 0 0 192.168.1.5:60000 69.192.3.58:443 ESTABLISHED 1000 200352 10179/firefox
tcp 0 0 192.168.1.5:60000 74.125.236.88:80 ESTABLISHED 1000 200143 10179/firefox
tcp 0 0 192.168.1.5:60000 174.122.92.78:80 ESTABLISHED 1000 202935 10500/telnet
tcp 0 0 192.168.1.5:60000 74.125.236.87:80 ESTABLISHED 1000 201600 10179/firefox
もう少し掘り下げてみると、アプリケーションが bind() システム コールを使用してソケット記述子を特定の IP とポートの組み合わせにバインドすると、同じポートを再び使用できないことがわかりました。それ以外の場合、ポートがソケット記述子にバインドされていない場合は、同じポートと IP の組み合わせを再度使用して、別の宛先に接続できます。
bind() syscall のマニュアルページを読みました
bind() assigns the address specified to by addr to the socket referred to by the file descriptor sockfd.
私の質問は次のとおりです。
通常、クライアント プログラムの作成中に bind() syscall を呼び出さない場合、OS はどのようにしてポート番号を自動的に選択するのでしょうか。
2 つの異なるアプリケーションが同じポートと IP の組み合わせを使用して 2 つの異なるサーバーに接続し、それらのサーバーが応答する場合、OS はどのパケットをどのアプリケーションにリダイレクトする必要があるかをどのように判断しますか。