TCP ではプロセスに IP アドレスがどのように割り当てられるのでしょうか?

TCP ではプロセスに IP アドレスがどのように割り当てられるのでしょうか?

2 つのソケット間で TCP 接続が確立されるとき、コンピューターに複数の NIC があると仮定すると、通信が確立される前にソケットがどの IP アドレスにバインドされるか [または - どの IP アドレスが bind() 関数に渡されるか ] は OS によって決定されるのでしょうか?

基本的に私はいくつかの疑問を持っています:

  1. socket()、bind()、connect() 関数は OS によって呼び出されますか? そうであれば、マシンに複数の NIC がある場合、bind() 関数で渡される IP アドレスはどれですか? 一部間違っているかもしれませんが、訂正してください。

答え1

socket()、bind()、connect() 関数は OS によって呼び出されますか?

彼らは呼ばれていないによるOSは一部のOS では、プログラムによって呼び出されます。

はいの場合、マシンに複数の NIC がある場合、bind() 関数で渡される IP アドレスはどれですか?

ほとんどのプログラムはアドレスを指定しません。

  • プログラムがbind()を呼び出して、着信接続を受け入れるローカルポートを選択する場合、特別な値[::](別名IN6ADDR_ANY_INIT)と0.0.0.0(別名INADDR_ANY)を使用して、着信接続を受け入れることを示すことができます。全てすべてのローカル NIC 上のアドレス (現在および将来)。

  • アウトバウンド接続を行う場合、プログラムは通常bind()を呼び出さない。まったくローカル アドレスとローカル ポートの両方を OS が決定できるようにします。

    各 OS には、送信元アドレスの選択ロジックが若干異なります。(たとえば、Windows 7/Srv2008 以降では、OS は送信インターフェイスから数値が最も小さいアドレスを選択します。Linux では、プログラムがアドレスを選択しない場合に使用する「優先」送信元アドレスを個々のルーティング テーブル エントリに指定できます。)

プログラムがするローカル アドレスを指定します。多くの場合、これはプログラムではなくユーザーによって選択されます。(たとえば、ほとんどのサービスには、構成に「リッスン アドレス」設定があります。)

関連情報