疑问
- 应用层心跳机制是否有必要?
解答
- 对了这个问题,很早看别人的博客介绍是必须的,但是对于解释似懂非懂,当别人问我时也是解释不清楚,直到有一天我解决了一个问题。
问题描述
- 写测试程序时,实现了一个TCP客户端去连接服务器,客户端连接和发送数据都是成功的,没有返回任何错误,但是服务器端却没有接收到任何事件,甚至accept也没任何反应。
问题分析
- 最后问题定位于:服务器在某个处理阻塞了,循环阻塞住了,accpet函数没有执行到,但是客户端却连接成功了。
- socket连接以及其它流程,内核层实际包揽了所有的工作,只是在需要的时候将状态反馈给应用层,如果应用层忽略了或没及时处理这些上报,内核也不知道,导致内核层和应用层socket状态是不一致。
- 应用层并不是socket事件的真正执行者,出问题时非常可能出现和内核状态不一致,这是需要加 应用层心跳机制的原因,socket自己的心跳机制,内核层包揽了所有工作,当应用层出问题了,例如:阻塞了,心跳机制可能检测不到问题。