ls0f / my-issues

0 stars 0 forks source link

使用了TCP,为什么还要在应用层做心跳? #4

Open ls0f opened 8 years ago

ls0f commented 8 years ago

TCP是一个面向连接的、可靠的全双工通信协议。通过三次握手连接,四次(三次)挥手断开连接。为什么我们还需要在应用层做心跳检测连接是否断开呢?

ls0f commented 8 years ago

TCP连接终究是虚拟链路,是基于软件状态的连接。client 或者 server直接没有数据通信,就算你切掉网站,两端都不知道连接已经断开了的。

ls0f commented 8 years ago

你ssh上服务器,不做任何操作,拔掉网线,然后再连接上网线,这个ssh连接还是可以用。

ls0f commented 8 years ago

为了应对客服端突发的网络断开、机器故障,有必要在应用层引入心跳包检测。一般是客户端定时发心跳包,如果服务器没有及时收到客户端的心跳包,就断开连接。当然服务端发心跳也可以的,看业务场景。

ls0f commented 8 years ago

心跳包的另外一个好处就是可以避免运营商断开连接。我们大多数网络都是处于nat下面,由运营商的公网路由器转发和维持我们的连接。运营商为了减轻负担,会断开长时间没有数据传输的连接。

ls0f commented 8 years ago

TCP不是有keep-alive选项吗?为什么还要我们自己做心跳包?TCP的keep-alive默认是两小时,还是有点长,当然在系统调节这个参数,但这个是全局修改的。自己发心跳更灵活,更方便控制检测方式、检测间隔。