目標
ブラウザーがローカルで実行されているサービスと情報を交換できるようにします。ブラウザを実行しているユーザー (Windows ではログオン セッション) をサービスが特定できるようにします。可能であれば、TLS 証明書と秘密鍵をマシンに保存しないでください。おまけタスク: Kaspersky や Sophos などのウイルス対策ソフトウェアがすべての TCP 接続をプロキシするセットアップのソリューションを提供します。
物語
基盤となる OS は Windows ですが、最新の任意の OS を使用できます。システムで実行されているデーモンがあります。Windows の場合、これは Windows サービスです。デーモンにデータを送信するリモート サーバーからインターネット ブラウザによって読み込まれる JavaScript があります。デーモンには HTTP/HTTP サーバーがありません。代わりに、デーモンは N 個のポートを開き、着信接続をリッスンします。N は下位 2 桁の数字です。
JS は範囲 N 内の選択されたポート K のグループへの TCP 接続を開始します。現在の実装では、JS は 127.0.0.1:port-number から JS スクリプトをロードしようとします。デーモンは接続を受け入れ、すぐに閉じます (ちょっとしたポート ノッキング)。デーモンは、JS によって「ノック」されたポートからデータを回復します。
現在の実装では、バックエンドはポートの一意のタプル (たとえば、3 つのポートの組み合わせ) を選択します。タプルは、ブラウザ セッションを識別するキーです。このサービスは、特定の OS プロセスによってアクセスされるポートである「ノック」を収集します。サービスは、収集されたポートを使用してバックエンドにクエリを実行します。
このソリューションの目標の 1 つは、サービスでの HTTP/HTTPS サーバーの実装を回避し、SSL 証明書のメンテナンスを節約することです。
問題
- JS がポートに接続する順序は定義されていません。具体的には、2 つのブラウザーがノッキング セッションを同時に実行できます。
- ポートがビジーであるため、サービスは範囲 N の一部のポートを開くことができない場合があります。
サーバーは範囲 N から一意の組み合わせを選択するため、順序は重要ではありません。ポートの欠落を許容するシステムが必要です。複数のタプルを選択し、複数の範囲 N を使用することを考えていました。
質問
問題にFECを採用するにはどうすればよいですか? デザインに意味はありますか?