私はBIOメモリインターフェイスを使用してSCTPでTLSを実装しています。メモリBIOインターフェイスを使用してSCTPストリーム上のTLSのEAGAINケースを処理する方法
ので、アプリケーションデータを送出しながら、クライアント側で、
SSL_write()
APIは、データを暗号化し、関連する書き込みBIOインターフェイスにデータを書き込みます。- そしてBIOインタフェースは、次に
BIO_read()
コールと - を用いて出力バッファに読み出されるデータは、
sctp_sendmsg()
APIを使用してソケットに送出します。サーバ側で同様
、ソケットからデータを読み出す
sctp_recvmsg()
APIがソケットからecryptedメッセージチャンクを読み込みながら、BIO_write()
APIが読み出さBIOバッファに書き込み、そしてSSL_read()
apiは、BIOから読み取ったデータを復号化します。
私が興味を持っているケースは、クライアント側でステップ1と2が実行され、3を実行しているときにソケットからEAGAINが取得されます。ですから、私がBIOバッファから読み込んだデータが何であれ、私はそれをきれいにし、しばらくしてからアプリケーションを再送するように依頼します。
これを行うと、クライアント側の1,2,3のステップがうまくいっているときに、サーバ側でopensslが見つけたレコードにbad_record_macがあり、接続を閉じていることがわかります。
グーグルで私は、MACエンコーディングがエンコードされている前のパケットに依存しているため、TLSパケットが順序外れする場合があることを知りました。TLSは同じ順序でパケットを配信する必要があります。だから私はEAGAIN上のデータをクリーンアップしていたときに私はSSLパケットを落として、次のパケットを送信しています。
私の仮説を確かめるために、ソケットがEAGAINを返すたびに、ソケットが書き込み可能になるまで無限の待機をするようにコードを変更しました。そしてすべてがうまく行き、サーバー側でbad_record_macを見ません。
このEAGAINの取り扱いで私を助けることができる人はいますか?私は問題を回避するために無限の待機をすることはできません、他の方法はありますか?
非常に良い、私は彼が何について話していたのか分からなかった。 – EJP