1.1 TCP和UDP的心跳包是用来维持长连接的

心跳包只是用来检测socket的链接状态

2.1 非阻塞情况下TCP 心跳包是否有必要建立心跳包

  需要,

  a.如果说 严格 检测掉线的话 那么不管是不是非阻塞 都需要心跳包。(主要是因为心跳比较方便),如果想保持长连接,就需要定期发送心跳包

  b.

  1). A和Z通信。实际路线可能是: A->b->c->d->...->Z。

  2). 后来,c和d有别扭,于是: A->b->c 「断X了」 d->->Z。

  3). 除非有超时机机制,否则recv函数不会知道c和d的分手的事。

3.1 TCP自带心跳包定时为2小时,是全局TCP心跳超时,会影响系统其他应用网络连接

TCP有个KeepAlive开关,打开后可以用来检测死连接。通常默认是2小时,可以自己设置。但是注意,这是TCP的全局设置。假如为了能更及时的检测出断开的连接,把tcp_keepalive_timetcp_keepalive_intvl的时间改小(参考:Link),该机器上所有应用程序的KeepAlive检测间隔都会变小,显然是不能接受的。因为不同应用程序的需求是不一样的。

4.1 recv 返回值判断连接情况,

a. 返回0

阻塞接收的recv有时候会返回0,这仅在socket被正常关闭时才会发生。

1) 正常关闭socket closesocket;

2)关机

b.返回-1

1)  阻塞,一般对于阻塞的socket都会用setsockopt来设置socket的超时。
      当超时时间到达后,recv会返回错误,也就是-1,关闭重连接,无需心跳包

2) 掉线,断网直接关闭程序

假设使用Socket基于TCP通信协议进行C/S通信编程,客服端已经成功与服务端建立tcp连接,并且可以正常进行收发数据。

当一段时间后,服务端的程序如果调用closesocket(sClient);WSACleanup();函数关闭socket,

那么客户端的recv()将会返回0;

如果服务端没有调用closesocket(sClient);而只调用WSACleanup();或直接关闭程序,

那么客户端的recv()将会返回-1(SOCKET_ERROR)。

以上结果在局域网经过实际验证。

3)由于终端信号,服务端返回-,但是客户端依然连接,能发数据,怎么办? 心跳包重连接

其实,要判定掉线,只需要send或者recv一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。

5.1 心跳包超时时间20~40s适宜

4.1 附录

https://www.zhihu.com/question/57736822

https://blog.csdn.net/qq_23167527/article/details/54290726

https://blog.csdn.net/liaomengge/article/details/50760831

https://www.zhihu.com/question/20849677/answer/16384522

https://www.cnblogs.com/nightwatcher/archive/2012/08/16/2643145.html

https://blog.csdn.net/tiandyoin/article/details/30044781

https://blog.csdn.net/baodi_z/article/details/43449315

http://www.nowamagic.net/academy/detail/23350382

嵌入式开发之网络心跳包---阻塞和非阻塞以及是否有必要心跳包heartbeat的更多相关文章

  1. python全栈开发day31-操作系统介绍,异步、同步、阻塞、非阻塞,进程

    一.网络编程内容回顾 1.arp协议 #交换机 #广播.单播 2.ip协议 3.tcp和udp协议 tcp:可靠的,面向连接的,字节流传输,长连接 三次握手:一方发送请求,另一方确认请求同时发送请求, ...

  2. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  3. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  4. 网络IO之阻塞、非阻塞、同步、异步总结

    网络IO之阻塞.非阻塞.同步.异步总结 1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一 ...

  5. 阻塞与非阻塞的IO网络读写

    看我之前的文章就知道,一般对于网络读的socket,都会加上O_NONBLOCK,非阻塞的选项. int setnonblocking(int fd) { int old_option = fcntl ...

  6. IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

  7. 芯灵思Sinlinx A64开发板 Linux内核等待队列poll ---阻塞与非阻塞

    开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 开发板详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 阻塞:阻塞调用是指调用结果 ...

  8. 网络IO之阻塞、非阻塞、同步、异步总结【转】

    1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解.网上有详 ...

  9. Java中的阻塞和非阻塞IO包各自的优劣思考(经典)

    Java中的阻塞和非阻塞IO包各自的优劣思考 NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式. 反应器(Reactor):用于事件多路分离和分派的体系结构模式 通常的,对一个 ...

  10. socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?

    一.举个打电话的例子: 阻塞   block   是指,你拨通某人的电话,但是此人不在,于是你拿着电话等他回来,其间不能再用电话.同步大概和阻塞差不多. 非阻塞   nonblock   是指,你拨通 ...

随机推荐

  1. idea中Hibernate反向生成工具

    HIbernate反向生成工具 1.使用idea数据库集成工具连接所需数据库 第一步 View-->Tool windows---->Database 第二步 找到所需连接的数据库 第三步 ...

  2. [洛谷P1638]逛画展

    [洛谷P1638]逛画展 题目大意: 有\(n(n\le10^6)\)个格子,每个格子有一种颜色.颜色种数为\(m(m\le2000)\).求包含所有颜色的最小区间. 思路: 尺取法裸题. 思路: # ...

  3. Shuffle 洗牌 [AHOI 2005]

    Description 为了表彰小联为 Samuel 星球的探险所做出的贡献,小联被邀请参加 Samuel 星球近距离载人探险活动. 由于 Samuel 星球相当遥远,科学家们要在飞船中度过相当长的一 ...

  4. python字符串面试题:找出一个字符串中第一个字母和最后一个字符是第一次重复,中间没有重复且最长的子串

    1.给出任意一个字符串,打印一个最长子串字符串及其长度,如果有相同长度的子字符串,都要一起打印出来,该子字符串满足以下条件, 第一个字母和最后一个字符是第一次重复 这个子字符串的中间字母没有重复 这个 ...

  5. bzoj 1008

    记得取模时对答案的处理 #include<bits/stdc++.h> #define ll long long using namespace std; ; ll qpow(ll a,l ...

  6. 前端工程化系列[03]-Grunt构建工具的运转机制

    在前端工程化系列[02]-Grunt构建工具的基本使用这篇文章中,已经对Grunt做了简单的介绍,此外,我们还知道了该如何来安装Grunt环境,以及使用一些常见的插件了,这篇文章主要介绍Grunt的核 ...

  7. jQuery之end()和pushStack()

    原文: https://www.cnblogs.com/AndyWithPassion/archive/2012/02/06/jquery_pushStack_javascript.html jque ...

  8. react diff 原理

    (1) 把树形结构按照层级分解,只比较同级元素.(2) 列表结构的每个单元添加唯一的 key 属性,方便比较.(3) React 只会匹配相同 class 的 component(这里面的 class ...

  9. py3下怎么用StringIO

    try: from StringIO import StringIO except ImportError: from io import StringIO

  10. VMWare 虚机迁移后Linux系统网卡启动问题

    重新安装VMWare或拷贝虚机文件后有时网卡会无法工作,主要是因为网卡的Mac地址改变了,如果系统中的网卡配置信息中有Mac的信息,则虚机的系统的网卡可能无法正常工作. 如果出现上述问题,解决办法如下 ...