TCP 保活机制(keepalive)

这篇具有很好参考价值的文章主要介绍了TCP 保活机制(keepalive)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.TCP保活机制简介

TCP保活机制是内核提供的一个心跳机制,当TCP连接异常时,能够通过保活机制释放TCP连接,确保资源不泄露。

2.TCP keepalive相关套接字选项

tcp保活,Linux网络编程,tcp/ip,网络,服务器,c语言,linux

SO_KEEPALIVE选项:SOL_SOCKET级别选项,用于开启和关闭TCP保活机制。

TCP_KEEPIDLE选项:IPPROTO_TCP级别选项,保活探测报文发送时间,简单理解就是多长时间没有收到TCP报文开始发送保活探测报文,单位为秒。

TCP_KEEPINTVL选项:IPPROTO_TCP级别选项,保活探测报文发送间隔周期,第一个探测报文发送完后,如果没有收到对端应答,则间隔TCP_KEEPINTVL时间后继续发送探测报文,单位为秒。

TCP_KEEPCNT选项:IPPROTO_TCP级别选项,探测失败后,总共发送多少个探测报文。

3.TCP keepalive选项设置

  • 系统设置

        a.查看系统级别参数:sysctl -a | grep "keepalive"

tcp保活,Linux网络编程,tcp/ip,网络,服务器,c语言,linux

        b.设置系统级别参数:sysctl -w

sysctl -w net.ipv4.tcp_keepalive_time=10
sysctl -w net.ipv4.tcp_keepalive_probes=3
sysctl -w net.ipv4.tcp_keepalive_intvl=3
  • 单个连接设置
int on = 1;
setsockopt(sock_fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on));
int idle = 10;
setsockopt(sock_fd, IPPROTO_TCP, TCP_KEEPIDLE, &idle, sizeof(idle));
int intvl = 3;
setsockopt(sock_fd, IPPROTO_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl));
int cnt = 3;
setsockopt(sock_fd, IPPROTO_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt));

4.保活探测过程分析

情况1:对端程序状态正常,双方能正常通信。

规定时间内,本端未接收到对端任何报文,将会发送TCP保活探测报文至对端,对端应答TCP保活探测报文,双方维持原来连接。

情况2:对端程序状态正常,双方无法正常通信。

规定时间内,本端未接收到对端任何报文,发送TCP保活探测报文至对端,由于无法和对端通信,保活探测报文无法生效,本端将重发TCP保活探测报文,超过重发次数后,仍未收到对端应答报文,本端将释放TCP连接,并发送RST报文。

情况3:对端程序异常,双方能正常通信。

a.对端程序异常退出。

本端发送保活探测报文,对端内核收到后回复RST报文。

b.对端程序异常退出,又重新起来。

对端内核收到探测报文后,未查询旧的连接信息,将回复RST报文。

情况4:对端程序异常,双方无法正常通信。

同情况2。

5.TCP 保活机制抓包调试

开启keepalive功能,发送时间:10秒,发送间隔:3秒,发送次数3次。

情况1:对端程序状态正常,双方能正常通信。

tcp保活,Linux网络编程,tcp/ip,网络,服务器,c语言,linux

 tcp保活,Linux网络编程,tcp/ip,网络,服务器,c语言,linux文章来源地址https://www.toymoban.com/news/detail-639152.html

到了这里,关于TCP 保活机制(keepalive)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux网络编程——tcp套接字

    本章Gitee仓库:tcp套接字 客户端: 客户端: 关于构造和初始化,可以直接在构造的时候,将服务器初始化,那为什么还要写到 init 初始化函数里面呢? 构造尽量简单一点,不要做一些“有风险”的操作。 tcp 是面向连接的,通信之前要建立连接,服务器处于等待连接到来的

    2024年02月20日
    浏览(58)
  • Linux网络编程(TCP状态转换关系)

    本篇文章来讲解一下TCP的状态转换关系,学习这个状态转换关系对于我们深入了解网络编程是非常有必要的。 客户端状态转换: 1.CLOSED - SYN-SENT:当客户端尝试与服务器建立连接时,客户端从CLOSED状态转换到SYN-SEND状态。此时客户端发送SYN(同步)包,表示请求建立连接,并

    2024年02月07日
    浏览(44)
  • Linux网络编程之TCP文件传输

    1. 要求 在Linux环境下,编程实现文件的上传和下载,即客户端可以发送文件给服务器,服务器将文件写到服务器端文件系统中;客户端请求下载文件时服务器读取文件内容,发送给客户端,客户端接收内容并写入本地文件。要求 (1)源代码格式化良好并适当注释; (2)除上述核心功

    2024年02月08日
    浏览(43)
  • 【Linux】网络---->套接字编程(TCP)

    TCP的编程流程:大致可以分为五个过程,分别是准备过程、连接建立过程、获取新连接过程、消息收发过程和断开过程。 1.准备过程:服务端和客户端需要创建各自的套接字,除此之外服务端还需要绑定自己的地址信息和进行监听。注意:服务端调用listen函数后,处理监听状

    2024年02月04日
    浏览(67)
  • SO_KEEPALIVE、TCP_KEEPIDLE、TCP_KEEPINTVL、保活包

    SO_KEEPALIVE 是一个套接字选项,用于设置是否启用 keepalive 机制。在这段代码中没有涉及到 SO_KEEPALIVE 选项的设置。 当 SO_KEEPALIVE 被设置为非零值时,表示启用 keepalive 机制。keepalive 是一种用于检测连接是否仍然有效的机制。通过定期发送一些特定的探测数据,可以检测到网络

    2024年02月14日
    浏览(39)
  • Linux socket网络编程实战(tcp)实现双方聊天

    在上节已经系统介绍了大致的流程和相关的API,这节就开始写代码! 回顾上节的流程: 创建一个NET文件夹 来存放网络编程相关的代码: 这部分先实现服务器的连接部分的代码并进行验证 server1.c: 代码验证: 先编译并运行这部分代码: 可见,此时没有客户端进行连接,程

    2024年02月03日
    浏览(51)
  • Linux 网络编程学习笔记——一、TCP/IP 协议族

    数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(以太网、令牌环等)上的传输,不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。最常用的协议是 ARP(Address Resolve Protocol,地址解析协议)和 RARP(

    2024年02月02日
    浏览(74)
  • [Linux] 网络编程 - 初见TCP套接字编程: 实现简单的单进程、多进程、多线程、线程池tcp服务器

    网络的上一篇文章, 我们介绍了网络变成的一些重要的概念, 以及 UDP套接字的编程演示. 还实现了一个简单更简陋的UDP公共聊天室. [Linux] 网络编程 - 初见UDP套接字编程: 网络编程部分相关概念、TCP、UDP协议基本特点、网络字节序、socket接口使用、简单的UDP网络及聊天室实现…

    2024年02月16日
    浏览(66)
  • Linux网络编程——C++实现进程间TCP/IP通信

    地址接口 1、通用地址接口 共16字节 = 2字节地址类型 + 14字节地址数据 2、自定义地址接口 地址转换 1、需要将点分字符串ip转化为程序ip,使用inet_addr函数: 2、字节序转换 地址接口配置中的端口需要字节序转换,网络规定使用大端字节序。 地址接口配置 1、socket:创建套接

    2024年02月20日
    浏览(57)
  • 初学记录【linux应用】 TCP/UDP 网络编程 C语言

    以下内容分别为TCP 与 UDP编程,内容有相似或者重合部分,可根据流程 相互对照学习,都已经附上源码 。 **1.** socket 创建 tcp套接字 (监听的套接字) 2、IPv4套接字地址结构 #include netinet/in.h struct in_addr: 如果使用 Internet 所以 sin_family 一般为 AF_INET。 ⚫ sin_addr 设置为 INADDR_AN

    2024年02月03日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包