心跳相关
2020-03-29 本文已影响0人
7d972d5e05e8
一、TCP中已有SO_KEEPALIVE选项,为什么还要在应用层加入心跳包机制?
参考文章:https://blog.csdn.net/gettogetto/article/details/76736371?utm_source=blogxgwz9
其中有两点说的很好:
因为TCP协议中的SO_KEEPALIVE有几个致命的缺陷:
- keepalive只能检测连接是否存活,不能检测连接是否可用。比如服务器因为负载过高导致无法响应请求但是连接仍然存在,此时keepalive无法判断连接是否可用。
- 如果TCP连接中的另一方因为停电突然断网,我们并不知道连接断开,此时发送数据失败会进行重传,由于重传包的优先级要高于keepalive的数据包,因此keepalive的数据包无法发送出去。只有在长时间的重传失败之后我们才能判断此连接断开了。
我的理解:tcp的keepalive是传输层上的心跳检测,心跳在操作系统层面就返回了,数据包不会到达应用层,更不会由应用层处理了。对于这种包,应用层无法感知到,更谈何检测应用程序的心跳呢!所以,应用层的心跳必须要在应用层来设计,你既然要关心应用是否还在存活,就只能让心跳包达到该应用。举例:同一个物理机上有多个不同的应用跑着,你需要关注每个应用的存活,就必须对每个应用设计相应的心跳包。心跳包怎么设计,数据结构是什么样子的,每个应用可以各不相同,取决于你的心跳包协议,约定好了就OK。