我在我的iOS应用程序中使用openssl,直到我从服务器向客户端发送过大的消息(100kb)(iOS应用程序),它才会被罚款.
问题是ssl_read()方法有一个限制缓冲区大小为16384字节,所以如果服务器发送一个大于16384字节的消息,它将被忽略的消息重置.
我的问题是如何改变这个限制(增加这个限制)?
简短回答:
您无法更改限制。您必须读取一块数据,将其保存在缓冲区中,读取另一块数据,将其附加到该缓冲区,依此类推,直到收到整个消息。
更长的答案:
最大记录大小为 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
。您一次读取一大块数据,直到您的应用程序确定您何时已读取整条消息。您将这些块累积在应用程序管理的更大缓冲区中。
归档时间: |
|
查看次数: |
1137 次 |
最近记录: |