Browse Source

optimize tcp connection lag

Nick Peng 6 years ago
parent
commit
044536aef6
3 changed files with 23 additions and 0 deletions
  1. 6 0
      src/dns_client.c
  2. 15 0
      src/util.c
  3. 2 0
      src/util.h

+ 6 - 0
src/dns_client.c

@@ -1380,6 +1380,9 @@ static int _DNS_client_create_socket_tcp(struct dns_server_info *server_info)
 	setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes));
 	setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority));
 	setsockopt(fd, IPPROTO_IP, IP_TOS, &ip_tos, sizeof(ip_tos));
+	setsockopt(fd, IPPROTO_TCP, TCP_THIN_DUPACK, &yes, sizeof(yes));
+	setsockopt(fd, IPPROTO_TCP, TCP_THIN_LINEAR_TIMEOUTS, &yes, sizeof(yes));
+	set_sock_keepalive(fd, 15, 3, 4);
 
 	if (connect(fd, (struct sockaddr *)&server_info->addr, server_info->ai_addrlen) != 0) {
 		if (errno != EINPROGRESS) {
@@ -1449,6 +1452,9 @@ static int _DNS_client_create_socket_tls(struct dns_server_info *server_info, ch
 	// setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes));
 	setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority));
 	setsockopt(fd, IPPROTO_IP, IP_TOS, &ip_tos, sizeof(ip_tos));
+	setsockopt(fd, IPPROTO_TCP, TCP_THIN_DUPACK, &yes, sizeof(yes));
+	setsockopt(fd, IPPROTO_TCP, TCP_THIN_LINEAR_TIMEOUTS, &yes, sizeof(yes));
+	set_sock_keepalive(fd, 15, 3, 4);
 
 	if (connect(fd, (struct sockaddr *)&server_info->addr, server_info->ai_addrlen) != 0) {
 		if (errno != EINPROGRESS) {

+ 15 - 0
src/util.c

@@ -11,6 +11,7 @@
 #include <openssl/crypto.h>
 #include <openssl/ssl.h>
 #include <pthread.h>
+#include <netinet/tcp.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
@@ -933,3 +934,17 @@ int has_network_raw_cap(void)
 	close(fd);
 	return 1;
 }
+
+int set_sock_keepalive(int fd, int keepidle, int keepinterval, int keepcnt)
+{
+	const int yes = 1;
+	if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes))!= 0) {
+		return -1;
+	}
+
+	setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle));
+	setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepinterval, sizeof(keepinterval));
+	setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepcnt, sizeof(keepcnt));
+
+	return 0;
+}

+ 2 - 0
src/util.h

@@ -69,6 +69,8 @@ void get_compiled_time(struct tm *tm);
 
 int has_network_raw_cap(void);
 
+int set_sock_keepalive(int fd, int keepidle, int keepinterval, int keepcnt);
+
 #ifdef __cplusplus
 }
 #endif /*__cplusplus */