如何在mbedtls FTPS客户端中正确处理-0x7880错误?
错误码本质说明
MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY (-0x7880)是mbedtls定义的TLS层通知返回码,被归类为错误码的原因是:它表示当前TLS会话已经被对端主动终止,后续无法再通过该会话收发数据,属于通用的会话中断返回逻辑,本身不代表传输过程出现了数据损坏、丢包等异常。
服务端行为合法性判定
vsftpd的该行为完全符合FTPS协议规范:FTPS的数据连接本身是短连接设计,单个数据连接仅负责一次文件传输、目录列表拉取等单任务,任务完成后服务端会主动发送TLS层关闭通知,再断开TCP连接,属于标准实现,没有问题。
正确处理方案
你只需要在业务逻辑层增加针对性的判断即可,不需要修改底层mbedtls的源码:
- 首先在数据连接的
mbedtls_ssl_read/mbedtls_ssl_write调用返回值判断逻辑中,单独处理该错误码,不将其判定为传输失败,也不打印错误日志:
int ret = mbedtls_ssl_read(&data_ssl_ctx, recv_buf, BUF_SIZE); if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) { // 数据传输完成,对端正常关闭会话,属于正常结束流程 return TRANSFER_SUCCESS; } else if (ret < 0) { // 其他负返回值才是真正的传输错误,按异常处理 printf("SSL read error: -0x%x\n", -ret); return TRANSFER_FAILED; }
- 收到该关闭通知后,客户端也需要调用
mbedtls_ssl_close_notify回送关闭通知,再释放TLS上下文、关闭对应TCP套接字,符合TLS正常关闭的握手逻辑,避免产生半开连接。 - 如果需要屏蔽mbedtls底层打印的该错误日志,可以调整mbedtls的错误回调配置,或者在日志过滤规则中,将返回码为
-0x7880的日志级别从ERROR下调为DEBUG级别,仅在调试阶段输出。
注意:该处理逻辑仅适用于FTPS的数据连接场景,如果是FTP控制连接收到该错误码,依然属于异常断开,需要执行重连等异常处理流程。
内容的提问来源于stack exchange,提问作者stdcerr
相关产品推荐
相关产品推荐

