1

コンピュータネットワークを科目として勉強していたとき、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.

私の質問は次のとおりです。

  1. 通常、クライアント プログラムの作成中に bind() syscall を呼び出さない場合、OS はどのようにしてポート番号を自動的に選択するのでしょうか。

  2. 2 つの異なるアプリケーションが同じポートと IP の組み合わせを使用して 2 つの異なるサーバーに接続し、それらのサーバーが応答する場合、OS はどのパケットをどのアプリケーションにリダイレクトする必要があるかをどのように判断しますか。

4

3 に答える 3

2

クライアントプログラムの作成中に一般的に bind() syscall を呼び出さない場合、OS はどのようにしてポート番号を自動的に選択するのですか?

OS は未使用のポートをランダムに選択します (「次の」ポートとは限りません)。

OS は、どのパケットをどのアプリケーションにリダイレクトする必要があるかをどのように判断しますか

各 TCP 接続は、4 つのタプル (src_addr、src_port、dst_addr、dst_port) によって識別されます。これは一意であるため、各セグメントが属する場所を識別するのに十分です。

編集

通常、クライアント プログラムの作成中に bind() syscall を呼び出さない場合、OS はどのようにしてポート番号を自動的に選択するのでしょうか。

TCP ソケットの場合、「接続」する前の時間。例えば、Linux にはinet_csk_get_port未使用のポート番号を取得する機能があります。inet_hash_connectでを探しtcp_v4_connectます。

于 2013-01-20T12:14:44.793 に答える
0

1 の場合: OS は次に使用可能なポートを選択します。
2 の場合: dst ポートに基づいて実行されます。クライアント アプリケーションは、異なるクライアント ポートを介して同じサーバーに接続します

于 2013-01-20T12:12:22.177 に答える
0

クライアントプログラムの場合、OSはTCP接続の確立後にソケットfd(クライアントによって開かれた)とサーバーIP +ポートを含むテーブルを維持していると思います。したがって、サーバーが返信するたびに、OSは特定のサーバーIP +ポートに対してソケットfdを取得できます。データはソケット fd に書き込まれます。したがって、サーバーの応答は、この特定のソケット fd でクライアントが利用できます。

于 2013-09-15T16:20:19.583 に答える