Linux TCP 连接超时

Rai*_*ain 5 sockets timeout 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;
}
Run Code Online (Sandbox Code Playgroud)

服务器代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ich 9

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

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

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

你所指的与空闲超时无关。这是数据发送但对方未确认的超时时间。