mbedtls应用程序记录大小



我使用mbedtls在TCP上运行SSL。我正在为mbedtls和TCP之间的接口使用我自己的自定义I/O函数,使用mbedtls_ssl_set_bio调用进行设置。

我注意到应用程序记录是通过调用mbedtls_ssl_write一对一生成的。例如,如果我以52字节的块写入数据,那么客户端将发送52字节的记录。如果我以520字节的块写入数据,那么客户端发送520字节的记录。后一种情况更可取;在前一种情况下,TLS头丢失了大量带宽。

我的问题是:是否可以将mbedtls配置为";聚结";对单个记录进行多次小写入?例如,TCP可以做到这一点(例如,如果你将52字节的数据块快速连续地写入TCP连接,它们最终会合并成MSS大小的段(。我想知道是否有可能为TLS做一些类似的事情。

使用TCP,当write函数返回时,数据已写入套接字,并且不受应用程序控制。如果需要的话,网络堆栈仍然可以合并数据包。如果第二个数据包在发送前一个数据包之前到达,则发送方或路由器可以在连接上合并连续的TCP数据包。

使用TLS,当mbedtls_ssl_write函数返回(或任何TLS堆栈中的类似函数(时,数据已被加密并验证为TLS记录,并且该记录已通过套接字发送(或底层I/O函数所做的任何操作(。TCP堆栈仍然可以合并TCP数据包,但不能合并TLS记录,因为它没有必要的加密密钥。

如果要在TLS连接上合并数据,则在将其传递到TLS堆栈之前需要对其进行缓冲,或者TLS堆栈需要对其本身进行缓冲。如果你想让TLS堆栈缓冲它,你需要一个至少有两个函数的API:一个是将一些数据作为输入,而不是立即发送,另一个是说"立即发送数据!"。第一个函数除了将数据写入某个临时缓冲区之外,什么都不会做,除非缓冲区已满,在这种情况下,它需要首先刷新缓冲区。这是你自己可以做的事情:只需将数据memcpy到一个临时缓冲区,并在准备发送时在该临时缓冲区上调用mbedtls_ssl_write。因此,TLS堆栈并没有真正的动机来提供这个接口。

最新更新