Linux TCP连接超时

5
我观察从服务器到客户端的TCP超时。 当TCP三次握手完成后,客户端长时间不做任何操作。 TCP会超时多少次会话?
我查阅了RFC 793文档,3.8接口:
如果有超时,则允许调用者为所有提交给TCP的数据设置超时。如果数据在超时期间未成功传递到目标位置,则TCP将中止连接。
当前全局默认值为五分钟。
以下是捕获的数据包连接, 已过去10分钟以上,仍未发生TCP断开连接。
我是否有什么误解? enter image description here 操作系统: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;
}
1个回答

8
TCP连接没有标准的空闲超时时间。在没有任何流量的情况下,连接理论上可以存在数天。空闲超时时间是针对应用程序的,并在应用程序中执行。
通常,应用程序还会使用TCP keep-alive来确保中间设备(如有状态防火墙和NAT路由器)保持连接状态,并且会尽早检测到静默断开(例如系统关闭,连接中断)。这样,TCP keep-alive有助于检测连接是否中断,即使连接处于空闲状态。

... 我查阅了RFC 793文档,3.8接口:

你所提到的与空闲超时无关。这是在数据被发送但未被同行确认时的超时时间。

那么,TCP连接的超时时间是否取决于TCP KeepAlive?对于一个应用程序而言。 空闲超时呢? - Rain
1
@Rain:TCP连接没有“THE timeout”。你在问题中描述的是空闲超时,即当没有数据传输且未确认传输数据的ACK时,连接存在的时间。正如我所写的-这个超时完全取决于应用程序。 TCP keep alive仅用于检测连接丢失,即使没有数据传输。因此,它不确定空闲超时,但确保可以区分空闲和断开的连接。 - Steffen Ullrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接