在利用uds 0x36服务传输软件升级包的时候,发现数据传输速率特别慢,需要半个小时以上才能将软件升级包传输完毕。
通过wireshark抓包发现,TCP包传输的过程中,并没有开启TCP_NODELAY机制。
在没有开启TCP_NODELAY机制的情况下,TCP会等待收到ack包后才继续发送下一帧报文,如下图:
此时网络延迟对于数据传输的速率影响巨大,而在开启TCP_NODELAY机制后,发送端不会等待收到ack包后才开始发送下一帧数据,而是连续发送数据包。接收端在收到TCP包后,发送ack响应即可。如下图:
这样收发端网络延迟导致的影响就可以忽略不计了。
这个问题是我在开发HAD控制器的诊断模块时发现的,HAD控制器基于Linux系统,增加如下代码就可以实现TCP_NODELAY机制的开启
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
int sockfd;
// 假设sockfd是已经建立连接的socket文件描述符
// 启用TCP_NODELAY选项
int flag = 1; // 使用TCP_NODELAY的标志
if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag)) < 0) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
printf("TCP_NODELAY is enabled\n");
return 0;
}