You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BoringSSL SSL_write在Android 10中偶发2秒延迟问题求助

偶发2秒延迟:BoringSSL SSL_write()返回成功但数据包迟迟未发送(Android 10)

问题背景

在Android 10平台上用C开发.so库,采用BoringSSL的SSL_write()阻塞模式发送数据。偶发出现SSL_write()返回成功,但Wireshark捕获到对应Application Data数据包有2秒延迟,概率约每10-20次出现一次。

代码片段

设置套接字为阻塞模式:

// set to blocking before write
fcntl(g_ssl_sock_id, F_SETFL, flags & (~O_NONBLOCK));

提取后的SSL发送逻辑:

// Since the original function contains other judgment logic such as TCP, the SSL_write code is extracted separately
static int ssl_write()
{
    int send_len, len = total_len;;
    unsigned char *cur_p = send_data;
    print_timestamp("Before SSL_write");

    while (len > 0)
    {
        send_len = (len > TCP_MAX_SSL_SEND_BUFFER_SIZE) ? TCP_MAX_SSL_SEND_BUFFER_SIZE : len;

        ret = SSL_write((SSL *)ssl_handle.handle, cur_p, send_len);
        print_timestamp("After SSL_write");

        if (ret != send_len)
        {
            LOG("SslSend data error: %d, exp: %d\n", ret, send_len);
            memset(send_data, 0, total_len);
            if (dyn_allocate)
            {
                uai_free(send_data);
            }
            return (g_err_code = UAI_ERROR);
        }

        len -= send_len;
        cur_p += send_len;
    }

    memset(send_data, 0, total_len);
    if (dyn_allocate)
    {
        uai_free(send_data);
    }
    return (g_err_code = UAI_OK);
}

已做优化尝试

//setsockopt TCP_NODELAY to disable nagle algorithm but still not work.

日志与截图

日志显示SSL_write()仅耗时约300微秒,但数据包2秒后才被捕获:

<2024-10-16 11:13:55.505-0574700106>[info_callback]:SSL state: SSLv3 write client hello A
<2024-10-16 11:14:00.909-0574705510>[print_timestamp]:BBB ssl time=[2024-10-16 11:14:00.909600], Before SSL_write
<2024-10-16 11:14:00.909-0574705510>[print_timestamp]:BBB ssl time=[2024-10-16 11:14:00.909912], After SSL_write
<2024-10-16 11:14:02.890-0574707490>info_callback]:SSL alert: close notify

数据包延迟截图


排查思路与建议

1. 强制刷新SSL层缓冲

BoringSSL内部可能存在数据缓冲策略,并非调用SSL_write()就立即推送数据包。可以在SSL_write()循环结束后调用SSL_flush(),强制将缓冲数据发送出去,验证是否能消除延迟。

2. 验证套接字阻塞模式与TCP缓冲状态

  • 检查fcntl设置阻塞模式是否成功:打印flags修改前后的值,确认O_NONBLOCK位已被清除。
  • 监控TCP发送缓冲(SO_SNDBUF):通过getsockopt获取当前缓冲大小,若缓冲已满,SSL_write()返回成功但数据会滞留在内核,直到有空闲空间才发送。可以尝试调小缓冲大小,或在发送前后记录缓冲占用情况。

3. 排查Android系统网络调度延迟

  • 查看系统日志(logcat):聚焦延迟发生的时间点,查找是否有网络栈调度延迟、锁竞争、进程休眠等相关日志。
  • 确认进程优先级:若应用处于后台,Android的调度策略可能会延迟网络操作,可尝试提升进程优先级测试。

4. 检查SSL会话状态与关闭流程

日志中延迟后出现close notify,需确认:

  • 延迟是否和SSL会话关闭触发的后续操作有关?是否远端发起关闭后,本地SSL层缓冲数据未立即发送?
  • 在SSL_write()后调用SSL_get_state()检查会话状态,排查是否存在异常状态导致数据滞留。

5. 精准定位延迟环节

  • 对比测试:用原生send()直接发送同等大小数据,对比延迟出现概率,区分问题出在SSL层还是TCP/内核层。
  • 系统调用跟踪:用Android内置工具(如strace兼容工具)跟踪SSL_write()内部实际调用send()的时间点,确认延迟发生在BoringSSL逻辑内还是内核网络栈中。

内容的提问来源于stack exchange,提问作者Hazel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:22:47