.net - 通过 SSLStream 发送数据时的数据包碎片

标签 .net sockets sslstream

当使用 SSLStream 向(已经过身份验证的)客户端发送“大”数据 block (1 兆)时,我看到的数据包碎片/分解是 大于使用普通 NetworkStream 时。

在客户端使用异步读取(即 BeginRead()),ReadCallback 被重复调用 完全相同大小的数据 block 直到最后一个数据包(数据的其余部分)。使用我发送的数据(它是一个 zip 文件),这些段恰好是 16363 字节长。 备注 :我的接收缓冲区比这大得多,改变它的大小没有效果

我知道 SSL 以不大于 18Kb 的 block 加密数据,但由于 SSL 位于 TCP 之上,我不认为 SSL block 的数量与 TCP 数据包碎片有任何关系吗?

从本质上讲,客户端完全读取数据所需的时间比使用标准 NetworkStream(都在本地主机上!)

我错过了什么?

编辑:

我开始怀疑 SSLStream 的接收(或发送)缓冲区大小是有限的。即使我使用同步读取(即 SSLStream.Read()),也不会再有数据可用,无论我在尝试读取之前等待多长时间。这与我将接收缓冲区限制为 16363 字节的行为相同。设置底层 NetworkStream 的 SendBufferSize(在服务器上)和 ReceiveBufferSize(在客户端)没有任何效果。

最佳答案

这看起来像是由私有(private)成员定义的 SslStream 应用的数据包数据大小限制:

SSLStream._SslState.MaxDataSize

我很难理解为什么要应用此限制,或者是否可以更改它,并提出了问题 here

关于.net - 通过 SSLStream 发送数据时的数据包碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159494/

相关文章:

linux - 使用 MSG_NONBLOCK 和 MSG_WAITALL 接收

套接字发送失败会导致守护程序崩溃吗?

C# SSLStream 读取函数抛出 IOException

C# SslStream 与 GZipStream

c# - SslStream.Read() 的奇怪行为

c# - .Net 全局化在特定服务器上无法正常工作

c# - 使用 AutoFixture 为递归数据结构创建夹具

c# - 如何在解决方案资源管理器中隐藏 bin 和 obj 文件夹

c# - 如何判断XmlTextReader已经读取了多少数据?

c - 数据包套接字未接收自定义协议(protocol) ID 的数据