我在我的iOS应用程序中使用openssl,直到我从服务器向客户端(iOS应用程序)发送了太大的消息(100kb),它才会被罚款。
问题是ssl_read()方法有一个限制缓冲区大小为16384字节,所以如果服务器发送的消息大于16384字节,则重置该消息将被忽略。我的问题是如何更改此限制(增加此限制)?
答案 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
相同。您一次读取一大块数据,直到您的应用确定何时读取整条消息。您将这些块累积在应用程序管理的较大缓冲区中。