【发布时间】: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;
}
【问题讨论】: