c# - 我可以依赖 DataAvailable 来获取 SSL 封装的网络流吗?

标签 c# ssl network-programming

我正在处理一个执行大量异步读取的应用程序。为了提高性能,我想直接从 SslStream 同步调用 Read,前提是调用不会阻塞。

SslStream 本身并不像底层 NetworkStream 那样提供 DataAvailable 属性。

因此,鉴于我知道它是一个正在读取的包装网络流,DataAvailable 中的 true 是否保证对 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 开销可能会淹没同步/异步差异,而网络带宽限制会淹没它们。

关于c# - 我可以依赖 DataAvailable 来获取 SSL 封装的网络流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11954739/

相关文章:

python - Boto 在 ssl.c 中不断崩溃

python - 属性错误 : 'module' object has no attribute '_create_unverified_context'

c++ - 多个套接字连接

networking - Go package syscall conn.Read() 是非阻塞的,导致 CPU 使用率高

c# - ASP.NET MVC : code:-32000 message: No script for id: 32

c# - 制作 Gridview 列居中和右对齐 (MiddleRight)

ssl - Traefik:无法获取域的 ACME 证书

c++ - 如何修改 ns2 模拟器中节点的行为?

c# - 发布同名 nuget 包时在 .net vNext 中引用本地项目

c# - 在 C# 中替换字符串中多次出现的句点