クライアントがHTTPメッセージをサーバーに送信するクライアントサーバープログラムを実装しています。HTTP または HTTPS の両方を使用できます。HTTP を使用したファイル転送のような大きなメッセージの場合、クライアントはメッセージ全体を一度に送信しますが、複数のフラグメントでサーバーに到達します (ネットワークが行います)。メッセージ全体が届くのを待ち、メッセージ全体を取得できるようにマージを続けます。コンテンツの長さは、HTTP メッセージで送信するパラメーターを使用して検出されます。ただし、HTTPS の場合、enitre メッセージが到着したかどうかを知る方法はありません。フラグメントを復号化すると、ジャンク値が返されます。これは、暗号化されたメッセージ全体を復号化する前に結合する必要があるためだと思います。SSL ライブラリを使用し、Windows ソケットを使用している HTTP でメッセージ全体が到着したかどうかを識別する方法はありますか。
1 に答える
SSL はプレーン データをブロックに暗号化し、それらのブロックを個別に相手に送信します。受信者は生のソケット データを読み取り、到着時に SSL 復号化エンジンに送り込む必要があります。エンジンが特定のブロックに十分なバイト数を持っている場合、エンジンはそのブロックを復号化し、そのブロックだけのプレーン データを出力します。したがって、ソケット データを読み取り続けて復号化エンジンに送り込み、出力されたプレーン データをバッファリングして、復号化されたデータに遭遇するまで続けます。<CRLF><CRLF>
HTTP メッセージ ヘッダーの末尾を示すシーケンスを取得したら、それらのヘッダーを処理して、HTTP メッセージ本文が存在するかどうか、およびそのエンコード方法を判断します。メッセージ本文が存在する場合は、メッセージ本文の最後に到達するまで、ソケット データの読み取り、復号化エンジンへの送信、出力プレーン データのバッファリングを続けます。 RFC 2616 セクション 4.4 - 「メッセージの長さ」では、HTTP メッセージ本文のエンコードを決定する方法 (復号化が適用された後) と、メッセージ本文を終了させる条件について説明しています。
つまり、暗号化されたソケット メッセージの末尾を探す必要はありません。復号化された HTTP メッセージの終わりを検出するまで、受信したすべてのものを復号化することになっています。