65536 +1システム上の接続


35

ネットワーク内のすべてのシステムに65536個のポートがあり、すべての接続または送受信がそれらのいずれかを使用します。

私の質問は、65536 + 1の接続がある場合はどうなりますか?!

私はそれが通常の方法では起こらないことを知っていますが、オペレーティングシステムがそれをどのように扱うか知りたいです。


12
接続は拒否されます。しかし、実際には、65535の接続を開くかなり前に問題が発生します。
ChrisInEdmonton

1
@ChrisInEdmontonいいえ。アウトバウンド接続の場合、ローカルポートを割り当てることができないため、バインドエラーが発生します。インバウンド接続の場合、ポート制限は適用されません。
user207421

接続がinboutの場合、拒否された接続を受信します。接続がアウトバウンドの場合、ソケット呼び出しはエラーになります。よくわからないので、これを答えとしては入れません。
ホルヘアルド

回答:


61

システムは、それぞれが個別のポートを使用する必要はないため、65536を超える同時接続を処理できることに注意してください。

TCP接続またはUDPフローは、4タプルによって定義されます。

(source IP address, source port, destination IP address, destination port)

したがって、単一のIPアドレスを持つWebサーバーマシンと、ポート80のみでリッスンする単一のHTTPサーバーソフトウェアパッケージがある場合でも、理論的には、接続するクライアントIPアドレスごとに 65536接続を処理できます。したがって、クライアントIPアドレス1からの64Ki接続、およびクライアントIPアドレス2からの64Ki接続など

したがって、プロトコルは、最初の概算では、単一のIPv4アドレス上の単一のTCPまたはUDPポートへの2 48接続/フローをサポートします。TCPとUDPの両方、およびIPv4のアドレス空間とIPv6の宇宙的/コミカルに大きなアドレス空間の両方を検討すると、プロトコル自体がホストの同時接続数の制限の原因になりそうにないことがわかります。処理できます。

同様に、TCPまたはUDPプロトコルには、クライアントマシンが単一のIPアドレスの単一のソースポートを使用してさまざまなサーバーアドレスとポートに複数の発信接続を行うことを妨げるものはありません。時々、与えられたOSのネットワーキングAPIはこれを簡単にしないかもしれませんが、例えば、由緒ある古い「[BSD] Sockets」APIはTCPとUDPの1つのAPIにすぎないことを覚えておくことが重要です。TCPとUDPには、従来のSockets APIで公開されていない機能がある場合があります。

したがって、特定のホストが処理できる同時TCP接続またはUDPフローの数は、ポート番号ではなく、すべての接続を追跡してすべてを処理するために必要なRAMスペースやCPU時間などのシステムリソースによって制限されます。また、OSの実装固有の詳細によって、人為的な制限が課される場合があります。たとえば、Unixの「すべてはファイルです」という哲学では、すべてのTCP接続またはUDPフローに対してファイル記述子が存在する場合があります。Unixカーネルが追跡できるファイル記述子の数に制限がある場合、そのファイル記述子の制限は、カーネルが処理できる同時TCP接続またはUDPフローの数に対する人為的な制限です。


2
この優れた回答では、en.wikipedia.org / wiki / C10k_problemにリンクする価値があります。
ChrisInEdmonton

1
考えられるすべてのIPアドレスからの65,534の接続に同時に対応できるTCPサーバーを実装しました。あまり機能しません-いくつかの文字を置換するだけで受信テキストをエコーし​​ますが、非常に小さなハードウェアプラットフォームで実行されます。RFCに完全に準拠しているとは思いませんが、ほとんどのポートでいくつのTCP接続が開かれているのかを知らず、気にしなくても、うまく機能しているようです。
supercat

2
2つのマシン間で65536を超える接続を本当に接続する必要がある場合は、複数のIPアドレスを使用するようにマシンをセットアップできます。2つのマシンに追加するIPアドレスごとに、接続の最大数が2次的に増加します(少なくとも理論的には、最初に他の問題に遭遇する可能性が高くなります)。
ライライアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.