リスニングソケットにバインドできないIPアドレスは何ですか?

リスニングソケットにバインドできないIPアドレスは何ですか?

リスニングソケットにバインドできないIPアドレスは何ですか?

たとえば、サーバープロセスは255.255.255.255をリスニングソケットにバインドできますか?

ありがとうございます。

ベストアンサー1

Linuxのbind(2)マニュアルページから:

SOCK_STREAMソケットが接続を許可する前に、通常はバインディング()を使用してローカルアドレスを割り当てる必要があります(accept(2)を参照)。

名前バインディングに使用されるルールは、アドレス系列によって異なります。詳細については、セクション7のマニュアルを参照してください。 AF_INETの場合はip(7)、AF_UNIXの場合はipv6(7)、AF_APPLETALKの場合はddp(7)、AF_X25の場合はx25を参照してください。 (7); AF_NETLINK については netlink(7) をご覧ください。

IPv4 の場合、ip(7)マニュアルページに次のように表示されます。

プロセスが新しく着信パケットまたは接続を受信する場合は、バインディング(2)を使用してソケットをローカルインターフェイスアドレスにバインドする必要があります。この場合、1つのIPソケットのみが指定されたローカル(アドレス、ポート)ペアにバインドできます。 INADDR_ANY がバインディング呼び出しで指定されると、ソケットはすべてのローカルインターフェイスにバインドされます。バインドされていないソケットでListen(2)が呼び出されると、ソケットはローカルアドレスがINADDR_ANYに設定されている任意の使用可能なポートに自動的にバインドされます。

したがって、IPv4 TCPまたはUDPソケットの場合、バインドするIPは、INADDR_ANYローカルシステムのネットワークインターフェイスに割り当てられているIPアドレスの1つ以上でなければなりません。

しかし、それも次のように言います。

いくつかの特別なアドレスがあります。 INADDR_LOOPBACK(127.0.0.1) は常にループバックデバイスを介してローカルホストを参照します。 INADDR_ANY(0.0.0.0) は、バインドするすべてのアドレスを表します。 INADDR_BROADCAST(255.255.255.255) は、記録上の理由からすべてのホストを表します。バインディングは INADDR_ANY と同じ効果を持ちます。

したがって、255.255.255.255へのバインディングは有効であり、0.0.0.0と同じ効果を持ちますが、最新の実装では0.0.0.0が優先されます。

ソケットオプションが設定されている場合、バインドされIP_FREEBINDたアドレスが後で一部のローカルインターフェイスに表示されることを前提として、任意のアドレスにバインドできます。しかし、実際にこれが起こるまで、この方法でバインドされたソケットはあまり役に立ちません。

SO_BINDTODEVICELinuxには、IPアドレスを指定せずにソケットを特定のネットワークインターフェースにバインドするために使用できるソケットオプションもあります。

おすすめ記事