使用非阻塞套接字进行SSL_pending,读写?

时间:2015-02-13 22:08:26

标签: ssl openssl

我有很短的时间来发送和阅读我的消息。

如果我使用SSL_pending,我可以确定呼叫不会阻止吗?

来自:https://www.openssl.org/docs/ssl/SSL_pending.html “数据是从对等体的块中接收的。因此,数据可以在ssl中缓冲,并且可以使用SSL_read立即检索。”

因此,如果服务器通过响应回复了我的请求。 SSL_pending只会给我整个TLS记录吗? 那么我可以确定我立刻阅读了整个消息吗?

如果服务器只回复一个TLS块,那么这绝不是问题吗? “”” SSL_pending()仅考虑当前正在处理的TLS / SSL记录中的字节(如果有)。如果设置了SSL对象的read_ahead标志(请参阅SSL_CTX_set_read_ahead),则可能已读取包含更多TLS / SSL记录的其他协议字节;这些被SSL_pending()忽略。

直到OpenSSL 0.9.6,SSL_pending()不检查挂起数据的记录类型是否为应用程序数据。 “”“

对于SSL_write,我可以检查是否可以一次发送所有内容?所以我的SSL_write不会阻止? 我使用非阻塞套接字,我不能有任何阻塞动作。

SSL_read 16kb是4ms到很短的时间吗?

编辑(添加内容),因为我仍然不完全理解它: 我可以使用非阻塞套接字正确地进行握手,但是当我执行SSL_read和SSL_write时,我会遇到问题。

当我调用SSL_pending时,我总是得到0但是如果我直接调用它,我可以用SSL_read读取。但是使用SSL_read也会阻塞非阻塞套接字,或者如果没有什么东西可以读取它会直接返回吗?我必须阅读整个信息/记录,或者没有。

对于SSL_write,如果返回而不发送整个消息,我该怎么办?只需将sent_bytes偏移量调用到缓冲区中再次调用它?如果它没有发送我要求的所有内容,那么这需要时间吗?

Sidequestion:我是否必须将套接字设置为异步以将其用作非阻塞或者是否足以将其设置为非阻塞?

SSL_pending似乎实际上没有返回正确的nbr字节。您是否首先必须调用SSL_read并且不读取SSL_pending的整个记录​​以返回非零值?我需要对大小未知的记录进行非阻塞读取(由于xml中的内容名称,它可能会有所不同)。 那可能吗? 如果没有什么东西可以阅读并使用非阻塞套接字,我还没想到SSL_read是否会立即返回。在那种情况下,我可以SSL_read(1个字节)然后检查SSL_pending以查看记录其余部分的大小并读取它。 我应该使用select吗?或者select,SSL_read和SSL_pending的组合?检查read_fds,SSL_read是1个字节,然后是SSL_pending以获取完整大小,然后检查SSL_read是什么?

未回答的问题摘要:

  1. 对SSL_read的调用是否仍然可以阻止非阻塞套接字?

  2. SSL_write可以阻止,还是会在不能全部写入时立即返回?什么是立即,是4ms到很短的时间能够 相信它能完成吗?

  3. 要真正获得非阻塞套接字,我是否必须使用select,SSL_read和SSL_pending的组合? select for read_fds,SSL_read 1 然后检查SSL_pending以获取记录的完整大小?**

1 个答案:

答案 0 :(得分:2)

SSL_pending不会从套接字读取任何新数据。它只会告诉你是否还有最后一帧的未读数据。

示例:

  • 服务器在单个SSL框架内发送10k数据
  • 您尝试使用SSL_read读取8k数据。因为它只能在收到完整的SSL帧后对数据进行解码,所以它将读取整个10k帧,解码整个帧并从该帧返回前8k。
  • 如果您再调用SSL_pending,它会告诉您仍有2k数据未决
  

SSL_pending只会给我整个TLS记录吗?

SSL_pending为您提供SSL_frame中尚未由SSL_read返回的部分。

  

对于SSL_write,我可以检查是否可以一次发送所有内容?

没有。但是如果发送所有数据失败,SSL_write将返回错误。确切的行为取决于CTX_mode。有关详细信息,请查看the documentation

  

SSL_read 16kb是4ms到很短的时间吗?

这取决于带宽和延迟,客户端和服务器的性能等。