2019独角兽企业重金招聘Python工程师标准>>>

如果TCP连接被对方正常关闭,也就是说,对方是正确地调用了close或者shutdown的话,那么Recv或Send调用就能马上返回,并且报错。这是由于close或者shutdown有个正常的关闭过程,会告诉对方“TCP连接已经关闭,你不需要再发送或者接受消息了”。

但是,如果连接被意外断开,客户端并没有正常关闭socket。双方并未按照协议上的四次挥手去断开连接。那么这时候正在执行Recv或Send操作的一方就会因为没有任何连接中断的通知而一直等待下去,也就是会被长时间卡住。像这种如果一方已经关闭或异常终止连接,而另一方却不知道,我们将这样的TCP连接称为半打开的。

解决意外中断办法都是利用保活机制。而保活机制分又可以让底层实现也可自己实现。

一种是应用层的心跳机制;

还有一种就是启用TCP的keepAlive机制;

以服务器端为例,如果当前server端检测到超过一定时间没有数据传输,那么会向client端发送一个keep-alive packet(该keep-alive packet就是ACK和当前TCP序列号减一的组合),此时client端应该为以下三种情况之一:

1. client端仍然存在,网络连接状况良好。此时client端会返回一个ACK。server端接收到ACK后重置计时器(复位存活定时器),在一定时间后再发送探测。如果连接上一直有数据传输,那么在该时间基础上向后推延一段时间。

2. 客户端异常关闭,或是网络断开。在这两种情况下,client端都不会响应。服务器没有收到对其发出探测的响应,并且在一定时间(系统默认为1000 ms)后重复发送keep-alive packet,并且重复发送一定次数。

3. 客户端曾经崩溃,但已经重启。这种情况下,服务器将会收到对其存活探测的响应,但该响应是一个复位(RST),从而引起服务器对连接的终止。

在应用层socket编程的表现为:当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select/epoll会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT。

范例:

  1. int keepAlive = 1; // 开启keepalive属性
  2. int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
  3. int keepInterval = 5; // 探测时发包的时间间隔为5 秒
  4. int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
  5. setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
  6. setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
  7. setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
  8. setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

转载于:https://my.oschina.net/u/2940064/blog/1506309

TCP之keepalive机制的应用场景相关推荐

  1. tcp retransmission 出现的原因_浅谈TCP的keepalive机制

    相关背景: hbase集群大量regionserver节点进程挂掉,排查log发现每个节点上的有大量的和datanode建立连接失败的报错信息,进一步排查是大量的Too Many Open Files ...

  2. VC中如何设置Socket的TCP/IP KeepAlive机制(MSDN)

    说明: A TCP keep-alive packet is simply an ACK with the sequence number set to one less than the curre ...

  3. 闲说HeartBeat心跳包和TCP协议的KeepAlive机制

    很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据.使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议. ...

  4. TCP协议的KeepAlive机制与HeartBeat心跳包

    原文地址:http://www.nowamagic.net/academy/detail/23350382 心跳包 很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个 ...

  5. go tcp客户端自动重连_深入分析TCP的keepalive和time_wait,总能发现新东西

    TCP是一个有状态通讯协议,所谓的有状态是指通信过程中通信的双方各自维护连接的状态. 一.TCP keepalive 先简单回顾一下TCP连接建立和断开的整个过程.(这里主要考虑主流程,关于丢包.拥塞 ...

  6. TCP/IP协议栈:TCP超时重传机制

    目录 基础概念 重传超时时间RTO RTO的设定 连接往返时间RTT RTT的计算 Karn算法 往返时间测量 重传 拥塞避免算法 快速重传和快速恢复算法 重新分组 网络数据包丢失,重传和重复确认 是 ...

  7. 谈谈Http长连接和Keep-Alive以及Tcp的Keepalive

    一次性说清楚秒验(本机号码一键登录) 2021-03-02 技术总监面试,提问:Redis热点key解决方案 2021-02-28 [性能测试]轻量级压测工具Hey 2021-02-23 我们知道Ht ...

  8. TCP 是一个可靠传输的协议,那我们来重点介绍 TCP 的重传机制、滑动窗口、流量控制、拥塞控制。

    TCP 巨复杂,它为了保证可靠性,用了巨多的机制来保证,真是个「伟大」的协议,写着写着发现这水太深了... 本文的全部图片都是小林绘画的,非常的辛苦且累,不废话了,直接进入正文,Go! 相信大家都知道 ...

  9. Linux 环境运维 - 查看远程调试端口被占用的ip地址,设置连接处于空闲状态快速自动化断开方法,keepalive机制相关说明

    开发有时候需要连接远程调试端口调试环境,上一个开发用完没有主动断开,下一个开发再用也用不了,如果等待系统主动断开,默认的话可能需要等 2 小时. netstat -a | grep 端口号 命令可以查 ...

最新文章

  1. pyspark汇总小结
  2. 【Rollo的Python之路】Scrapy Selector选择器的学习
  3. 图书销售统计程序c语言,图书销售管理系统C语言程序报告.pdf
  4. python算程序员吗_我算是优秀的程序员吗?
  5. 禁止word另存为,禁止图片另存为excel禁止另存为
  6. 递增输出链表结点,删除重复结点
  7. Netty 5.X 官方指南翻译版6:Writing a Time Client
  8. laravel 扩展包
  9. Java学习笔记1:Java中有关print、println、printf的用法和区别
  10. 线代总结1 线性代数中的线性方程组
  11. WIN8下安装USB转串口驱动出现“文件的哈希值不在指定的目录”的解决办法
  12. java 汉字乱码_Java中文乱码问题
  13. 法勒二维码读头数据读写测试
  14. ☆☆☆Windows服务器部署及原理☆☆☆
  15. “苏宁SAP上线“有感(原)
  16. python安装教程(搬运工)
  17. Lawnmower(除草)
  18. 计算DNA中每种核苷酸的数目
  19. vue路由之路由的两种模式
  20. 《工程伦理》2022秋长江雨课堂习题答案

热门文章

  1. 使用ftp命令之后,如何退出
  2. C#爬网页时“远程服务器返回错误: (403) 已禁止”解决方法
  3. datatable行内内容太长,有时不自动换行解决方法
  4. vue2强制刷新,解决页面不会重新渲染的问题
  5. Data truncation: Out of range value for column ‘quanity‘ at row 问题解决方案
  6. ValidateAntiForgeryToken的用途,解释和示例
  7. 您如何性能测试JavaScript代码?
  8. 如何编写内联if语句用于打印?
  9. 未捕获的错误:始终违反:元素类型无效:预期为字符串(对于内置组件)或类/函数,但得到了:对象
  10. 枚举的字符串表示形式