OpenSSL iOS缓冲区限制

5
我在我的iOS应用程序中使用openssl,它可以正常工作,直到我从服务器发送了一个太大的消息(100KB)给客户端(iOS应用程序)。
问题在于ssl_read()方法有一个缓冲区大小限制为16384字节,因此如果服务器发送的消息大于16384字节,则剩余的消息将被忽略。
我的问题是如何更改这个限制(增加这个限制)?

请注意,相较于OpenSSL,你可能更好地使用苹果的API;如果你使用后者,则需要将其保持最新,并且你需要将其打包到应用程序中。对于普通的HTTPS,你可以使用Core Foundation和/或Foundation来完成大部分任务。对于更复杂的任务,请查看Secure Transport和/或Common Crypto。 - al45tair
1个回答

4

简短回答:

您无法更改限制。您需要读取一块数据,将其保存在缓冲区中,然后读取另一块数据,将其附加到该缓冲区中,以此类推,直到接收到整个消息。

较长回答:

最大记录大小为16384(2^14),因为标准定义了这样的大小。例如,对于TLS 1.2,可以查看 rfc5246

记录层将信息块分成TLSPlaintext记录,在每个记录中携带2 ^ 14字节或更少的数据块。客户端的消息边界在记录层中不得保留(即,同一ContentType的多个客户端消息可以合并到单个TLSPlaintext记录中,或者单个消息可以跨越多个记录进行分段)。

规范非常清楚地说明了长度具有固定大小:

长度不得超过2 ^ 14。

您的发射器不应构造大于该大小的SSL记录。它应该将消息分割成多个SSL记录。

一个SSL记录类似于一个IP数据包。你实际上可以放在IP数据包里的最大数据量略小于你的MTU,通常为1500字节。那么TCP是如何工作的,允许你发送任意长度的消息?它通过分块发送你的消息来工作,每次发送1500字节,直到你接收到整个消息为止。
TCP如何知道你何时接收到整个消息?它不知道。这就是为什么TCP被称为流协议的原因。它只是向你的应用程序流传递字节。你的应用程序必须知道何时接收到了一条消息。在HTTP的情况下,你会知道客户端发送一个Content-Length头告诉服务器需要期望多少字节。
ssl_read也是一样。你每次读取一块数据,直到你的应用程序确定你已经读完整条消息。你将这些块累积到一个更大的缓冲区中,由你的应用程序管理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接