如何解决Linux TCP 连接超时
我观察到从服务器到客户端的 TCP 超时。 当TCP 三向握手完成后,客户端长时间没有任何动作。 TCP 会话将超时多少次?
我查阅了 RFC 793 文档,3.8 接口:
超时(如果存在)允许调用者设置超时
对于提交给 TCP 的所有数据。如果数据在超时时间内没有成功传送到目的地,TCP 将中止连接。
当前全局默认为五分钟
下面是抓包的连接, 10多分钟过去了,TCP没有断开。
操作系统: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,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,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 保持连接也有助于检测断开的连接。
...我查阅了 RFC 793 文档,3.8 接口:
您所指的与空闲超时无关。发送数据但没有被对方确认的超时时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。