短连接与长连接
短连接为一次连接一次交互,如大部分web网页请求
长连接为一次连接多次交互, 如微信聊天
健康检查
长连接时会有突然断开连接的可能,所以需要增加健康检查,常见的解决方案为轮询机制或心跳机制
轮询机制为服务端向客户端定时发送请求,而心跳机制为客户端向服务端定时发送请求。个人建议采用心跳机制
TCP
TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议,使用三次握手协议建立连接,四次挥手断开连接。所以能保证数据通信的完整性和可靠性,防止丢包。TCP把连接作为最基本的对象,每条TCP连接都有两个端点,这种端点叫做套接字(socket),端口号拼接到IP地址即构成了套接字。
UDP
一种无连接的传输层协议,UDP协议的主要作用是将网络数据流量压缩成数据包的形式。
两者对比
- udp性能高于tcp,但可能会存在丢包的情况。适用于对高速传输和实时性有较高的通信或广播通信。
- tcp面向字节流,udp面向报文。
- tcp连接只能是点到点,udp支持一对一,一对多,多对一和多对多的交互通信。
TCP连接三次握手
- 首先由客户端向服务端请求建立连接,发送参数SYN,seq。
- 服务器针对客户端的SYN的确认应答并请求建立连接,服务端生成新的seq及ack(ack的值为客户端的seq+服务器生成ACK)。此时发送SYN,ACK及生成的ack,seq。
- 客户端针对服务器的SYN的确认应答,传递参数ACK及新生成的ack(生成逻辑同上)。
第一次握手的目的是检测客户端的发送能力以及服务端的接收能力。
第二次握手的目的是检测服务端的接收、发送能力以及客户端的接收、发送能力。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手的目的是得出客户端的接收、发送能力正常,服务端的发送、接收能力正常。
TCP断开连接四次握手
- 客户端向服务端请求断开连接,发送FIN。
- 服务端接收到请求,针对客户端的FIN的确认应答,并生成新的ack(生成逻辑同上)
- 服务端请求断开连接,生成FIN。
- 客户端针对服务端的FIN的确认应答,发送ACK及ack。此时服务端接收到之后会断开,客户端进入TIME-WAIT,等待完2MSL之后,进入CLOSED阶段。
TCP连接标识说明
tcp粘包问题
tcp发送数据的时候因为存在数据缓存的关闭。简单的说tcp的请求类似公交车,到点走或者人满发车。每个人相当于一份数据,所以会出现这个问题。
处理方案分为两种
- 采用特殊自负来分割
- 固定包头+包体协议(主流)