実際の例: TIBCO Rendezvous。
データは、シーケンス番号を付けてマルチキャスト経由で送信されます。欠落しているシーケンス番号を検出したクライアントは、マルチキャスト グループで「パケット 12345 を逃しました」というメッセージを送信します。サーバーはそのデータを再マルチキャストします。サーバーには、クライアントが要求した場合に備えて、構成可能な量のデータをバッファリングできます。
問題:
パケットの半分をドロップする 1 つのクライアントと、100 の正常なクライアントがあるとします。このクライアントは、1 つおきのパケットに対して再送信要求を送信します。サーバーは、正常なクライアントの 1 つに十分な負荷をかけ始め、パケットのドロップと再送信の要求を開始します。それによる余分な負荷により、別の正常なクライアントが再送信を要求し始めます。等々。輻輳崩壊が発生します。
Tibco は、再送信要求が多すぎるサブスクライバーを切断する回避策を提供しています。これにより、単一の加入者が輻輳の崩壊を引き起こすことが難しくなります。
輻輳崩壊のリスクを制限するもう 1 つの回避策は、サーバーが再送信するデータの量を制限することです。
また、Tibco は、再送信要求をマルチキャストまたはユニキャストするかどうか、および再送信自体について、クライアントとサーバーにヒューリスティックを提供する必要があります。彼らはしません。(サーバーの場合、特定の時間枠内に 1 つのクライアントのみが再送信を要求した場合、再送信をユニキャストできます。クライアントの場合、サーバーが再送信パケットで、要求しているのが自分だけであることを通知した場合、再送信要求をユニキャストできます。再送信し、将来的にリクエストをユニキャストしてください)
基本的に、クライアントがデータを受信することをどの程度強く保証したいかと、輻輳崩壊のリスクとの間で決定する必要があります。パケットがドロップされた場所と、再送信がユニキャストとマルチキャストのどちらで最も効率的に送信されたかを推測する必要があります。サーバーがデータを理解し、送信する更新されたデータがある場合に再送信を送信しないことを決定できる場合 (再送信は無関係になります)、Tibco RV などのフレームワークよりもはるかに優れた立場にあります。
データを理解すると、間違った仮定につながる場合があります。たとえば、市場データ - 更新されたクオートがある場合、クオートを再送信しなくても最初は問題ないように思えるかもしれません。しかし、後で、サブスクライバーが現在の見積もりを追跡しようとしているだけでなく、見積もりの履歴を保持していたことに気付く場合があります。サブスクライバーによって要件が異なる可能性があり、一部のクライアントはマルチキャスト TCP よりもユニキャスト TCP を好む場合があります。
ある時点で、再送信や遅いクライアントの場合にバッファするデータの量をサーバーで任意に決定する必要があります。