我可以依赖DataAvailable来获取SSL包裹的网络流吗?

时间:2012-08-14 14:38:14

标签: c# ssl network-programming

我正在处理一个执行大量异步读取的应用程序。为了提高性能,我希望直接从ReadSslStream进行同步调用,前提是该调用不会阻止。

SslStream本身不提供基础DataAvailable所属的NetworkStream属性。

所以,鉴于我知道它是一个正在读取的包装网络流,true中的DataAvailable是否会保证对SslStream的调用不会导致阻塞?< / p>

像这样:

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是否需要从基础流中读取多个字节以便读取一个加密字节。

2 个答案:

答案 0 :(得分:2)

不,不能保证,因为下一层有SSL记录,你可能还没有收到整个SSL记录,而且从密码学的角度来说,除非你拥有所有内容,否则你无法做任何事情。首先必须检查MAc是否完整。

但更重要的是,我质疑整个战略。只需在正常代码中按需要发出读取:不要试图猜测在每种情况下哪种模式最有效。 SSL开销可能会淹没同步/异步差异,并且网络带宽限制将使它们都淹没。

答案 1 :(得分:1)

它取决于使用中的密码 - 使用RC4或其他流密码的端点更可能一次解密一个字节,但不能保证。为DES或其他块密码配置的端点将等待,直到完整块可用。

你可以使用可窥探的中间缓冲流做一些棘手的事情,并尝试确保在进行阻塞读取之前你有一个合理的块大小,但这是令人讨厌的。

如果你绝对无法阻止,我会坚持使用BeginRead和一个完成委托。