【问题标题】:Linux TCP Connection timeoutLinux TCP 连接超时
【发布时间】:2023-03-27 00:29:01
【问题描述】:

我观察到从服务器到客户端的 TCP 超时。 当 TCP 三向握手完成后,客户端很长一段时间没有任何动作。 TCP 会话会超时多少次?

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

超时(如果存在)允许调用者设置超时 提交给 TCP 的所有数据。如果在超时时间内数据没有成功传送到目的地,TCP 将中止连接。
当前的全局默认值为 5 分钟

以下是抓包连接, 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, 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;
}

【问题讨论】:

    标签: sockets tcp timeout


    【解决方案1】:

    TCP 连接没有标准化的空闲超时。理论上,连接可以在没有任何流量的情况下存在数天。空闲超时是特定于应用程序的,并在那里强制执行。

    应用程序通常还使用TCP keep-alive 来确保连接状态将由状态防火墙和 NAT 路由器等中间设备保持活动状态,并且会及早检测到静默断开连接(如系统关闭、连接断开)。这样,即使连接处于空闲状态,TCP keep-alive 也有助于检测断开的连接。

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

    您所指的与空闲超时无关。是发送数据但没有被对端确认的超时时间。

    【讨论】:

    • 那么,如果TCP连接的超时依赖于TCP KeepAilve呢?对于一个应用程序。空闲超时怎么样?
    • @Rain: 没有“TCP 连接超时”。您在问题中描述的是空闲超时,即当没有传输数据并且没有未完成传输数据的 ACK 时,连接存在的时间长。正如我所写 - 此超时完全取决于应用程序。即使没有数据传输,TCP 保持活动也仅用于检测连接丢失。因此,它不会确定空闲超时,但确保可以区分空闲和断开的连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2016-11-15
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多