Openssl iOS缓冲区限制

时间:2014-07-21 11:55:35

标签: ios io openssl

我在我的iOS应用程序中使用openssl,直到我从服务器向客户端(iOS应用程序)发送了太大的消息(100kb),它才会被罚款。

问题是ssl_read()方法有一个限制缓冲区大小为16384字节,所以如果服务器发送的消息大于16384字节,则重置该消息将被忽略。

我的问题是如何更改此限制(增加此限制)?

1 个答案:

答案 0 :(得分:3)

简答:

您无法更改限制。您必须读取一大块数据,将其保存在缓冲区中,读取另一个块,将其附加到该缓冲区,依此类推,直到收到整个消息为止。

更长的回答:

最大记录大小为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相同。您一次读取一大块数据,直到您的应用确定何时读取整条消息。您将这些块累积在应用程序管理的较大缓冲区中。