Netstat(Windowsの場合)を使用して、TCPおよびUDPのリッスンポートを表示しました。
Foreign Address列で、UDPが*:*
ではなく0.0.0.0:0
を表示することに気付きました。これら2つの値は同じことを表していますか?その場合、UDPが*:*
ではなく0.0.0.0:0
を表示するのはなぜですか?
私の答えが間違っていたことが指摘されています。削除できないので、代わりに正しいものを提供します。
*:*
という表現は、「任意のアドレス、任意のポート」を意味します。すべてのUDPリスナーがこの署名を表示します。これは、UDPのコネクションレスの性質によるものです。
元の(正しくない)回答。はいといいえ。 *:*
は、任意のIPv6アドレスを指します。不明/未指定アドレスの区別はIPv4ではあいまいであるため、ネットワーク上の任意のホストを表すために0.0.0.0/0を使用しますが、IPv6では微妙な違いがあります。
ただし、ほとんどの場合、人々は::
を使用して、0の連続した文字列を表します。
IPv6アドレスでは、連続するゼロのシーケンスを::
で置き換えることができます。
0.0.0.0/0
=> 0000:0000:0000:0000:0000:0000:0000:0000 => ::
=> *:*
fe80:0000:0000:0000:2000:0aff:fea7:0f7c
=> fe80::2000:0aff:fea7:0f7c
ただし、ワイルドカードを使用した表現では、アドレスパターンをより細かく制御できます。たとえば、::
はfe80::2000:0aff:fea7:0f7c
と一致しませんが、*:*
は一致します。
この違いは、ルーティングを実行していないデバイスにはあまり意味がありませんが、集約されたアドレススペースへの最適なルートを選択するときに、ワイルドカード表記により、宛先ネットワークをより柔軟に選択できます。
/
は、IPレイヤーの一部であるサブネットネットマスクを指します。
:
は、トランスポート層の一部であるポートを指します。
TCPの場合、接続のリモートエンドがあることは理にかなっています。
UDP。コネクションレス型であるため、外部アドレスを表示しても意味がありません。
私の直感は、常にUDPのワイルドカードを表示し、出力の解析を少しわかりやすくするため、またはIPv4/6を使用しているかどうかを表示するために潜在的に存在するということです。
IPV4 "*:*"
対IPV6 "[::]:*"
違いは単に表記法です。
WindowsのNetstatは、0.0.0.0:0
を使用して、ローカルIPv4の「任意のリモートアドレスおよびポート」という概念を表しますTCPリスナーおよびUDPリスナーの*:*
。IPv6の場合、リモートアドレスは[::]:0
で表されますTCPおよびUDPの*:*
の場合。
OS Xでは、*.*
はTCPとUDP、IPv4とIPv6のどちらでも使用されます(OS Xはアドレスとポートを区切るためにドットを使用することに注意してください)。LinuxはIPv4には0.0.0.0:*
を、IPv6には:::*
を使用します。最初の2つのコロンはすべてのIPv6アドレスの省略形を表し、3番目のコロンはアドレスとポートの間の区切り文字です。
IIRCは私がずっと前に聞いたり読んだりしたものから、UDPのペアリングcanが表示されると思いますが、完了時に破棄され、UDP接続は通常非常に短く、ミリ秒以下続くため、通常は表示されません。自分でこれを見たことがないので、間違っている可能性があります。
どちらの場合も、情報は基本的に無意味ですが、多かれ少なかれ同じことを示しています。
最初の行はTCPリッスンソケットです。ローカルアドレス列は、接続を受け入れるアドレスとポートを示します。リッスンソケットにはリモートエンドがないため、リモートアドレス列は何も意味しません。 A connected TCPソケットは、その列に接続のもう一方の端のアドレスを表示しますが、待機ソケットの場合、すべてを表示することを決定します-ゼロのアドレスとポート。
2行目はUDPソケットです。 UDPはコネクションレス型プロトコルです。つまり、だれが誰に接続したか、パケットが既存の会話の一部であるか、データが突然到着したかを意識せずにパケットを送受信します。ローカルアドレスカラムはTCPの場合と同じ意味を持ち、リモートアドレスカラムは意味がありません。UDPソケットは常に1つのピア、多くのピア、またはピアがない可能性があるためです。 (実際にはPOSIXには「接続されたUDPソケット」という概念がありますが、少し遠くになっています)。
さて、質問:なぜ表示が異なるのですか?それは、Windows netstatコードの奇妙なことに過ぎないようです。 Linux(net-tools)netstatは、両方のリモートエンドに対して0.0.0.0:*
を表示しますTCP待機ソケットとUDPソケット(IPv4の場合; IPv6の場合は:::*
を表示します)。はWindowsのどちらの例とも異なりますが、少なくとも同じプログラム内で一貫しています。おそらくWindowsは、TCPと " UDPの場合は「何でもオープン」ですが、2ビットのコードは、一貫性を特に気にせずに2人の異なる人によって書かれた可能性が高いです。