Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 假设(单个HTTP消息的)所有HTTP头到达同一个SSL/TLS记录是否合理?_C_Http_Ssl_Https_Openssl - Fatal编程技术网

C 假设(单个HTTP消息的)所有HTTP头到达同一个SSL/TLS记录是否合理?

C 假设(单个HTTP消息的)所有HTTP头到达同一个SSL/TLS记录是否合理?,c,http,ssl,https,openssl,C,Http,Ssl,Https,Openssl,openssl的SSL\u read()调用的手册页说明: SSL_read()基于SSL/TLS记录工作。数据以记录形式接收(SSLv3/TLSv1的最大记录大小为16kB)。只有在完全接收到记录后,才能对其进行处理(解密和完整性检查)。因此,在上一次调用SSL_read()时未检索到的数据仍然可以在SSL层内进行缓冲,并将在下一次调用SSL_read()时检索到 鉴于: 单个传出消息的HTTP头始终可以一次性发送 一条SSL/TLS记录显然可以保存16KB的数据,这对每个人(或者至少对任何

openssl
SSL\u read()
调用的手册页说明:

SSL_read()基于SSL/TLS记录工作。数据以记录形式接收(SSLv3/TLSv1的最大记录大小为16kB)。只有在完全接收到记录后,才能对其进行处理(解密和完整性检查)。因此,在上一次调用SSL_read()时未检索到的数据仍然可以在SSL层内进行缓冲,并将在下一次调用SSL_read()时检索到

鉴于:

  • 单个传出消息的HTTP头始终可以一次性发送
  • 一条SSL/TLS记录显然可以保存16KB的数据,这对每个人(或者至少对任何非异常HTTP请求)都应该足够了
浏览器几乎没有理由将标头划分为多个SSL记录,对吗?还是有浏览器在延迟方面过于激进,甚至会将这些小的有效负载分割成多个记录

我这样问是因为如果能够从一个成功的
SSL\u read()
调用填充的单个读取缓冲区解析整个HTTP头集,那就太好了。如果这意味着拒绝少数几个请求(例如,如果只有0.0000X%的请求),那对我来说可能是值得的

编辑:提出了一个有效的观点,即cookies可以非常长。但是,让我们考虑cookie从未被特定服务器设置或期望的场景。


edit2:这个问题有点过早。同时,我还编写了代码,可以高效地存储每个客户机状态,以便在解析时接受任意数量的SSL记录,而不会导致任何严重的性能损失。在这样做之前,我想知道我是否可以走捷径,但普遍的共识似乎是,我最好照本宣科。不,单是饼干就可能远远超过16K

根据,每个域的cookie大小的建议最小限制为80K

RFC 2109第6.3节“实施限制”:

  • 每个cookie至少4096个字节(根据 在语法中构成cookie非终端的字符 设置Cookie标头的说明)

  • 每个唯一主机或域名至少20个cookie


不,单是饼干就可能远远超过16K

根据,每个域的cookie大小的建议最小限制为80K

RFC 2109第6.3节“实施限制”:

  • 每个cookie至少4096个字节(根据 在语法中构成cookie非终端的字符 设置Cookie标头的说明)

  • 每个唯一主机或域名至少20个cookie


你不能做出这样的假设。就像
recv()
可以返回比请求更少的字节一样,
SSL\u read()
也可以。缓冲入站数据是您的责任,无论需要多少记录,您都要读取这些数据,然后只有在您完成了预期接收的所有内容后,才处理缓冲后的数据。在收到标头末尾的
序列之前,您不应该处理HTTP标头。

您不能这样假设。就像
recv()
可以返回比请求更少的字节一样,
SSL\u read()
也可以。缓冲入站数据是您的责任,无论需要多少记录,您都要读取这些数据,然后只有在您完成了预期接收的所有内容后,才处理缓冲后的数据。在收到标题末尾的
序列之前,您不应该处理HTTP标题。

也许更谨慎的说法是,假设是错误的,但我希望在大多数情况下,对于一般情况,您会得到您想要的行为。我不知道确切的答案,但可以做实验来找出答案


我完全支持黑客无视规则,滥用协议以获取学习、乐趣和利润,但除此之外,我看不到限制自己阅读单个SSL记录的好处。如果你不介意详细说明的话,我很好奇。

也许更谨慎的说法是假设是错误的,但我希望在大多数情况下,对于一般情况,你会得到你想要的行为。我不知道确切的答案,但可以做实验来找出答案

我完全支持黑客无视规则,滥用协议以获取学习、乐趣和利润,但除此之外,我看不到限制自己阅读单个SSL记录的好处。如果你不介意详细说明的话,我很好奇

浏览器几乎没有理由将标头划分为多个SSL 唱片,对吗?还是有那么激进的浏览器 至于延迟,他们甚至会切碎这类 将小有效载荷转换为多个记录

可能有一些原因导致将数据拆分为多个记录。其中一个是

您通常不能假设数据不会被分割成多个记录

我这样问是因为能够解析一个完整的 来自单个读取缓冲区的HTTP头集,该缓冲区由单个 SSL_read()调用成功。如果这意味着拒绝少数人(例如,如果 只有0.0000X%的请求),这对我来说可能是值得的

这不仅仅是一个SSL/TLS问题,这也适用于TCP:不将传入数据作为流处理只会导致错误和错误代码

浏览器几乎没有理由将标头划分为多个SSL 唱片,对吗?还是有那么激进的浏览器 至于延迟,他们甚至会切碎这类 小型有效载荷