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
相关产品推荐
相关产品推荐

