web-dev-qa-db-ja.com

ロードバランサーはどのようにして64kポート制限を回避しますか?

リクエストが受信されると、そのリクエストに使用可能ないくつかのサーバーの1つに再ルーティングされます。ただし、使用可能なポートは64kしかないため、常に最大64kの送信リクエストしかありません。では、どのようにしていくつかのWebサイトが何百万もの同時リクエストを処理できるのでしょうか。誰かがこの混乱を解消できれば、それは素晴らしいことです。ありがとう!

3
Jayson Tatum

すでにリンクされている トラフィックの多いサイトは65535を超えるサービスをどのように処理しますかTCP接続? およびStack Overflowに関するその他の質問では、5タプルとその方法(少し少ない)64Kの制限はIPごとにです-エフェメラルポートごとに接続を取得します。これは「ロードバランサー」の作業負荷にも適用され、IPソフトウェアスタックです。その端にも。

IP 203.0.113.80ポート443でサービスを実行するとします。そして、なんとかして172.16.0.0/12の100万個のIPのそれぞれが個別にヒットします。 64Kポートは、IPアドレスによってすでに一意であるため、重要ではありません。 172.16.0.1クライアントは64K接続を確立でき、172.16.0.2クライアントも同様に接続できます。これらのフローが異なるため:

Proto Source IP port Target IP  port
TCP 203.0.113.80 443 172.16.0.1 44321
TCP 203.0.113.80 443 172.16.0.2 44321

実際には、バックエンドサービスと接続を仲介するデバイスは、100万に達するために調整とスケールアップが必要です。たくさんのホストが必要で、それらのTCPスタックを微調整して、それを高くします。

通常、同じポートの同じIP間で数万の接続が発生するのは、負荷テストユーティリティを使用している場合のみです。ほとんどの単一IPには、数千の同時接続をセットアップするのに十分な作業がほとんどありません。

2
John Mahowald

これは、関与するレイヤー4プロトコルに依存します。

UDPおよびその他のコネクションレス型トランスポートプロトコル(UDP-Lite、RUDP、DCCP、およびその他のプロトコル)では、問題はありません。接続がないため、ソケットが特定のリモートホストに永続的に関連付けられていることを心配する必要はありません。したがって、ポート番号が16ビット整数であるという事実を心配する必要はありません。ターゲットのバックエンドにメッセージを送信し、どこに行ったかを追跡するだけです。ただし、負荷分散ソフトウェアとその構成方法によっては、バックエンドサーバーへの未処理の要求が65536に制限される場合があります。

SCTPおよびその他の本質的に多重化されたコネクション型トランスポートプロトコル(たとえば、TIPCは、ほとんど誰も使用していませんが)の場合、実際には問題ではありません。ロードバランサーから各バックエンドサーバーへの接続は1つだけで、トランスポートプロトコルがサポートしているため、その1つの接続で必要な数のストリームを多重化するだけです。 HTTP/2(HTTP 1.1以前ではない)やSSHプロトコルなど、一部のアプリケーション層プロトコルでも同じことが実際に実行できます。

TCPおよびその他のシングルストリーム接続指向のトランスポートプロトコルの場合、これは少しトリッキーになります。構成によっては、設定された数の永続的な接続で要求を多重化します(接続を永続的に保つことにより、時間を節約できます。 TCP接続はめちゃくちゃ遅い)を設定する一方で、他の人はアプリケーション層で独自の拡張機能を使用して、単一の接続を介して物事を多重化します。

上記のいずれの場合も、複数の物理ネットワーク、VLAN、またはその他のネットワーク多重化テクノロジーを介して、複数のバックエンドネットワークを使用するオプションがあります。このアプローチは、バックエンドサーバーが仮想マシンの場合に最も一般的ですが、他の状況でも依然として広く使用されています。バックエンドシステムごとに個別のサブネットを設定することで、64kポートの制限がフロントエンドごとからバックエンドごとに変わります(つまり、ロードバランサーがすべてのバックエンドサーバーへの64kのアクティブな接続のみを許可する代わりに、64kから- eachバックエンドサーバー)。これは、バックエンドの数とそれぞれの強力さのボトルネックを押し上げます。

0