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)
TCP 连接没有标准化的空闲超时。理论上,连接可以在没有任何流量的情况下存在数天。相反,空闲超时是特定于应用程序的,并在那里强制执行。
应用程序通常还采用TCP 保持活动状态来确保连接状态将由状态防火墙和 NAT 路由器等中间设备保持活动状态,并尽早检测到静默断开连接(如系统关闭、连接断开)。这样,即使连接空闲,TCP 保持活动状态也有助于检测断开的连接。
...我查阅了 RFC 793 文档,3.8 接口:
你所指的与空闲超时无关。这是数据发送但对方未确认的超时时间。