![TCP ではプロセスに IP アドレスがどのように割り当てられるのでしょうか?](https://rvso.com/image/1672343/TCP%20%E3%81%A7%E3%81%AF%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AB%20IP%20%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%8C%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%89%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
2 つのソケット間で TCP 接続が確立されるとき、コンピューターに複数の NIC があると仮定すると、通信が確立される前にソケットがどの IP アドレスにバインドされるか [または - どの IP アドレスが bind() 関数に渡されるか ] は OS によって決定されるのでしょうか?
基本的に私はいくつかの疑問を持っています:
- 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 では、プログラムがアドレスを選択しない場合に使用する「優先」送信元アドレスを個々のルーティング テーブル エントリに指定できます。)
プログラムがするローカル アドレスを指定します。多くの場合、これはプログラムではなくユーザーによって選択されます。(たとえば、ほとんどのサービスには、構成に「リッスン アドレス」設定があります。)