TCPポート0に接続することは可能ですか?


59

TCPポート0をリッスンすると、システム上の空きポート番号が割り当てられます。

しかし、TCPポート0 に接続しようとするとどうなりますか?明白な答えは、「機能しません」です。

$ nc localhost 0                 
nc: port number too small: 0

これはシステムのどこで処理されますか?OSカーネルのTCPスタックに?TCPポート0への接続が機能するUnixはありますか?


2
理論的には次の2つのそのような実装は、ポート0でお互いに話すことができたことを意味0作品、またはポートから接続しているリスニングでカスタムTCPスタックを構築することができ
ジョシュア

回答:


60

私たちが同じページにいることを確認するため(あなたの質問はこのようにあいまいです)、ポート0でTCPをバインドするように要求することは、未使用のポート番号を動的に生成する要求を示します。つまり、そのリクエスト後に実際にリッスンしているポート番号はゼロではありません。この中程度のコメントがあります[linux kernel source]/net/ipv4/inet_connection_sock.cのはinet_csk_get_port()

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */

これは標準的なUNIXの規則です。実際にポート0の使用を許可するシステムもありますが、それは悪い習慣と見なされます。ただし、この動作はPOSIX、IANA、またはTCPプロトコルで正式に指定されていません。1 これは面白い かもしれません。

そのため、ポートゼロへのTCP接続を賢明に行うことはできません。おそらくncこれを認識しており、あなたが無意味なリクエストをしていることを通知します。ネイティブコードでこれを試す場合:

int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
    fprintf(stderr,"%s", strerror(errno));
}    

他の利用できないポートに接続しようとするのと同じエラーECONNREFUSED、「接続が拒否されました」が表示されます。だからへの返信:

これはシステムのどこで処理されますか?OSカーネルのTCPスタックに?

おそらくない。特別な処理は必要ありません。つまり、ポート0でバインドとリッスンを許可するシステムを見つけることができれば、おそらくそれに接続できます。


1.しかし、IANA それを「予約済み」と呼びますこちらを参照)。つまり、このポートオンラインで使用しないください。これにより、動的割り当て規則に関しては問題ありません(実際には使用されないため)。明確に目的としてそれを規定することは、おそらくIANAの範囲外です。本質的に、オペレーティングシステムは、何も含めないで、自由にやりたいことができます。


ipv4のアドレス0.0.0.0と同じ考えのように見えます。予約された値。OSおよびプログラムが特別な目的で使用します。類推として、無線では、誰も送信に使用しない予約済み周波数がありますが、機器の内部で使用されます。
ctrl-alt-delor

1
無効不明または非適用対象や「放送」とを指定するために使用される);無@richard、0.0.0.0は異なる意味を持っている
AndreaCi

2
@AndreaCiは255.255.255.255を放送しませんでしたか?
ラチェットフリーク

4
@ratchetfreak 255.255.255.255がブロードキャストされます。0.0.0.0には、コンテキストに応じて2つの意味があります。プログラミングでINADDR_ANYは、同義語w / であり、これはリチャードが参照しているものです(システムはこれをデフォルトに置き換えます)。しかし、実際にネットワーク上のアドレスを使用することは、アンドレアが言及する意味を持っているようです(「ブロードキャスト」としてカウントされるほど明確でない限り):en.wikipedia.org/wiki/0.0.0.0
goldilocks


5

ポート0を使用すると、オペレーティングシステムがトリガーされ、次に使用可能なポートが検索されて割り当てられます。これにより、特定のポートをハードコーディングしたり、使用可能なポートを検索したりする必要がなくなります。My Mint Linuxシステムが戻ります

nc: port range not valid

nc localhost 0 

2

nc -l 0OSにポート0でリッスンするように要求します。しかし、上記のように、ほとんどのオペレーティングシステムは0を参照し、アプリケーションに正数のポートを選択するための特定のカスタムを呼び出しますnc


ほとんどのオペレーティングシステムは、大丈夫、そうではないでしょうか?
barlop
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.