一般长连接都会附带着心跳保活机制,直观的理由就是为了确保这个连接一直有效,但是以前却没有往深层次去想为什么要这么做。本文尝试进行一下梳理。
一般互联网应用是“请求/响应”模式,即只能客户端主动发起请求,服务端被动响应请求(因为NAT的原因,服务端无法主动找到客户端)。对于一些需要服务器主动下发数据到客户端的场景,如果使用“请求/响应”模式,那么只能由客户端轮询的方式来服务端拉数据,这样不仅占用网络带宽,还给通信双方增加压力。如果客户端先主动发起建立长连接,然后一直保持连接有效,那么服务端相当于有一条主动通往客户端的通道。
一、什么是tcp长连接
tcp长连接是指通信双方在三次握手之后一直不关闭socket而维持着这个连接,然后在需要通信时,可以立刻发送tcp数据流,不需要每次通信前都经过三次握手和四次挥手的流程。这样做的优点有:
(1)节省连接建立和终止的开销,提高网络带宽利用率。一个典型的例子是http1.1支持的pipeline。
(2)支持双向通信,比如实时通信或者消息推送之类的服务。
那么,如何保证长连接一直有效?如果网络链路中间某个节点断了,双方是否能感知到?
二、无法感知tcp连接断开的一些场景
(1)NAT
IPv4环境下,客户端一般位于NAT