我可以依赖DataAvailable进行SSL封装的网络流吗?
问题描述:
我正在处理大量异步阅读的应用程序。为了提高性能,我希望直接从SslStream
进行Read
的同步呼叫,前提是呼叫不会阻塞。我可以依赖DataAvailable进行SSL封装的网络流吗?
SslStream
本身不提供DataAvailable
属性,如底层的NetworkStream
。
因此,鉴于我知道这是一个包装的网络流正在读取,将true
在DataAvailable
保证调用SslStream
不会导致块?
像这样:
public void Read(NetworkStream netStream, SslStream sslStream)
{
// given that netStream is the inner stream of sslStream
if (netStream.DataAvailable)
{
// Will not block
sslStream.Read(...);
}
else
{
// Would block
sslStream.Read(...);
}
}
的SslStream
已经被验证,并准备去。我不确定除了加密/解密之外是否还有额外的开销。我假设答案依赖于SslStream
是否需要从基础流读取多个字节以读取一个加密字节。
答
不,它不能保证,因为下一层有SSL记录,而且你可能还没有收到完整的记录,而从密码学的角度来说,除非你拥有一切,否则不能做任何事情,如你首先必须检查MAc的完整性目的。
但更重要的是,我质疑整个战略。只需在正常代码中发布所需的读数:不要试图猜测哪种模式在每种情况下都能发挥最佳效果。 SSL开销可能会淹没同步/异步差异,而网络带宽限制会使它们都陷入瘫痪。
答
它取决于使用中的密码 - 使用RC4或另一个流密码的端点一次可能可解密一个字节,但不能保证。为DES或其他块密码配置的端点将一直等到满块可用。
你可以做一些棘手的东西与一个peekable中间缓冲流,并尝试确保你有一个合理的块大小之前进行阻塞阅读,但这是讨厌的。
如果你绝对不能阻止,我会坚持BeginRead和完成委托。
谢谢。除非我知道这个流是没有SSL的普通网络流,否则我会一直使用异步阅读。 – Dervall 2012-08-15 06:08:53