Linux TCP 连接超时
Linux TCP Connection timeout
我观察到从服务器到客户端的 TCP 超时。
当 TCP 三向握手完成后,客户端很长时间没有任何反应。
TCP 会话会超时多少次?
我查阅了RFC 793文档,3.8接口:
The timeout, if present, permits the caller to set up a timeout
for all data submitted to TCP. If data is not successfully delivered to the destination within the timeout period, the TCP will abort the connection.
The present global default is five minutes
下面是抓包连接,
10多分钟过去了,TCP没有断开。
我是不是哪里误会了?
OS: Ubuntu 20
以下是我的测试代码
客户代码:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[]){
int socket_desc;
struct sockaddr_in server;
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if(socket_desc == -1){
printf("Socket failed\n");
}
server.sin_addr.s_addr = inet_addr("192.168.88.88");
server.sin_family = AF_INET;
server.sin_port = htons(8888);
if(connect(socket_desc, (struct sockaddr *)&server, sizeof(server)) <0){
printf("Connect failed\n");
} else{
printf("Connected\n");
while(0); // When connected, do not anything.
return 0;
}
服务器代码:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[]){
int socket_desc, new_socket, c;
struct sockaddr_in server;
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if(socket_desc == -1){
printf("Socket failed\n");
}
server.sin_addr.s_addr = INADDR_ANY;
server.sin_family = AF_INET;
server.sin_port = htons(8888);
if(bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) <0){
printf("bind failed\n");
}
listen(socket_desc, 5);
c = sizeof(struct sockaddr_in);
new_socket = accept(socket_desc, (struct sockaddr *) &client, (socklen_t *) &c);
if (new_socket < 0){
printf("Accept failed\n");
} else{
printf("Accept\n");
while(1); // When accept , do not anything.
}
return 0;
}
TCP 连接没有标准化的空闲超时。理论上,连接可以在没有任何流量的情况下存在数天。空闲超时是特定于应用程序的,并在那里强制执行。
通常,应用程序还使用 TCP keep-alive 来确保连接状态将由状态防火墙和 NAT 路由器等中间设备保持活动状态,并且静默断开连接(如系统关闭、连接断开)将是早发现。这样,即使连接处于空闲状态,TCP keep-alive 也有助于检测断开的连接。
... I consult the RFC 793 document, 3.8 Interfaces:
您所指的与空闲超时无关。发送数据但未被对端确认时的超时时间。
我观察到从服务器到客户端的 TCP 超时。 当 TCP 三向握手完成后,客户端很长时间没有任何反应。 TCP 会话会超时多少次?
我查阅了RFC 793文档,3.8接口:
The timeout, if present, permits the caller to set up a timeout for all data submitted to TCP. If data is not successfully delivered to the destination within the timeout period, the TCP will abort the connection.
The present global default is five minutes
下面是抓包连接, 10多分钟过去了,TCP没有断开。
我是不是哪里误会了?
OS: Ubuntu 20
以下是我的测试代码
客户代码:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[]){
int socket_desc;
struct sockaddr_in server;
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if(socket_desc == -1){
printf("Socket failed\n");
}
server.sin_addr.s_addr = inet_addr("192.168.88.88");
server.sin_family = AF_INET;
server.sin_port = htons(8888);
if(connect(socket_desc, (struct sockaddr *)&server, sizeof(server)) <0){
printf("Connect failed\n");
} else{
printf("Connected\n");
while(0); // When connected, do not anything.
return 0;
}
服务器代码:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[]){
int socket_desc, new_socket, c;
struct sockaddr_in server;
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if(socket_desc == -1){
printf("Socket failed\n");
}
server.sin_addr.s_addr = INADDR_ANY;
server.sin_family = AF_INET;
server.sin_port = htons(8888);
if(bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) <0){
printf("bind failed\n");
}
listen(socket_desc, 5);
c = sizeof(struct sockaddr_in);
new_socket = accept(socket_desc, (struct sockaddr *) &client, (socklen_t *) &c);
if (new_socket < 0){
printf("Accept failed\n");
} else{
printf("Accept\n");
while(1); // When accept , do not anything.
}
return 0;
}
TCP 连接没有标准化的空闲超时。理论上,连接可以在没有任何流量的情况下存在数天。空闲超时是特定于应用程序的,并在那里强制执行。
通常,应用程序还使用 TCP keep-alive 来确保连接状态将由状态防火墙和 NAT 路由器等中间设备保持活动状态,并且静默断开连接(如系统关闭、连接断开)将是早发现。这样,即使连接处于空闲状态,TCP keep-alive 也有助于检测断开的连接。
... I consult the RFC 793 document, 3.8 Interfaces:
您所指的与空闲超时无关。发送数据但未被对端确认时的超时时间。