web-dev-qa-db-ja.com

ソケットをIPv6アドレスにバインドする際の[::]と*の違いは何ですか?

UbuntuサーバーでIPv6ソケットをリッスンしていることを調査しようとしています。 [::]と*の違いがわかりません。

私の心の2つの質問:

  1. 違いはありますか?
  2. そうでない場合、なぜそれらは複数の表現で表示されますか?
$ ss --listening --tcp --ipv6

State       Recv-Q      Send-Q    Local Addr:Port    Peer Addr:Port                 
LISTEN      0           128            *:http             *:*
LISTEN      0           128            *:8083             *:*
LISTEN      0           128         [::]:ssh           [::]:*
LISTEN      0           128            *:19998            *:*
LISTEN      0           128            *:19999            *:*

3
Mustapha Hadid

*および[::]は、ソケットの作成中にIPV6_V6ONLYフラグがそれぞれfalseまたはtrueに設定されたかどうかを示します。

例:

$ socat UDP6-LISTEN:1234,ipv6only=0 - &
$ socat UDP6-LISTEN:4321,ipv6only=1 - &
$ ss -l -6 -e
Netid             State              Recv-Q             Send-Q                         Local Address:Port                          Peer Address:Port                                                                
udp               UNCONN             0                  0                                          *:1234                                     *:*                uid:1000 ino:3003972 sk:1 v6only:0 <->             
udp               UNCONN             0                  0                                       [::]:4321                                  [::]:*                uid:1000 ino:3004007 sk:2 v6only:1 <->

ただし、この表現はss固有の動作です。 netstatおよびそれ以前のバージョンのssは、両方のケースを[::]として表します。 ssのソースの関連する箇所は ここ にあります。

フラグの目的は、ipv6のマンページに記載されています。

IPV6_V6ONLY(Linux 2.4.21および2.6以降)

このフラグがtrue(ゼロ以外)に設定されている場合、ソケットはIPv6パケットの送受信のみに制限されます。この場合、IPv4とIPv6アプリケーションは同時に単一のポートにバインドできます。

このフラグがfalse(ゼロ)に設定されている場合、ソケットを使用して、IPv6アドレスまたはIPv4にマップされたIPv6アドレスとの間でパケットを送受信できます。

引数は整数のブール値へのポインタです。

このフラグのデフォルト値は、ファイルの内容/ proc/sys/net/ipv6/bindv6onlyによって定義されます。そのファイルのデフォルト値は0(false)です。

3
dirdi