如何配置mbedtls将多次小写入合并为单个TLS应用记录?
解决mbedtls合并小写入为单个TLS记录的问题
当然可以配置mbedtls实现多次小写入的合并,核心是利用它的发送缓冲区功能,具体操作如下:
1. 配置发送缓冲区大小
在初始化SSL配置对象时,通过mbedtls_ssl_conf_send_buf_len()设置合适的缓冲区大小。通常可以设为TLS默认的最大记录长度(16384字节),也可以根据你的实际需求调整(比如和TCP MSS匹配)。示例代码:
mbedtls_ssl_config ssl_conf; mbedtls_ssl_config_init(&ssl_conf); // 其他配置步骤(如设置证书、加密套件等)... // 设置发送缓冲区为16KB(TLS标准最大记录长度) mbedtls_ssl_conf_send_buf_len(&ssl_conf, 16384);
2. 写入数据与主动刷新
配置完成后,当你调用mbedtls_ssl_write()写入小数据块时,数据会先存入发送缓冲区,而不是立即生成TLS记录发送:
- 当缓冲区被填满时,mbedtls会自动将缓冲区中的数据打包成一个TLS记录发送
- 如果你需要在缓冲区未满时强制发送(比如要保证低延迟),可以调用
mbedtls_ssl_flush_output()主动刷新缓冲区,把当前所有缓存的数据发送出去
示例代码:
// 多次写入小数据块 int ret; char buf1[52] = { ... }; char buf2[52] = { ... }; // 第一次写入,数据存入缓冲区 ret = mbedtls_ssl_write(&ssl_ctx, buf1, sizeof(buf1)); if (ret < 0 && ret != MBEDTLS_ERR_SSL_WANT_WRITE) { // 处理错误逻辑 } // 第二次写入,数据继续存入缓冲区 ret = mbedtls_ssl_write(&ssl_ctx, buf2, sizeof(buf2)); if (ret < 0 && ret != MBEDTLS_ERR_SSL_WANT_WRITE) { // 处理错误逻辑 } // 主动刷新,将两次写入的数据合并为一个TLS记录发送 ret = mbedtls_ssl_flush_output(&ssl_ctx); if (ret < 0) { // 处理错误逻辑 }
注意事项
mbedtls_ssl_write()返回MBEDTLS_ERR_SSL_WANT_WRITE是正常情况,说明数据已存入缓冲区,等待后续发送(要么缓冲区满,要么主动flush)- 如果你的应用对延迟敏感,不要盲目设置过大的缓冲区,避免数据等待时间过长
- 当SSL会话需要发送握手消息、或者调用
mbedtls_ssl_close()时,缓冲区中的数据会自动被刷新发送
内容的提问来源于stack exchange,提问作者Sam Kumar
相关产品推荐
相关产品推荐

