本篇文章我们先从了解一下网络通信的基本常识,小鱼将会从Socket 逐步介绍短连接、长链接,以及长连接与短连接的选择。
何为Socket
Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,即是一组接口,Socket 的概念最先由UNIX 操作系统提及,被广泛应用于各种操作系统和网络编程中。
在设计模式中,Socket 就是一个门面模式,将复杂的 TCP/IP 协议处理、通信缓存管理等,隐藏在 Socket 接口背后,对用户提供一组简单的接口来进行网络应用编程,复杂的数据处理和协议转换等逻辑交由 Socket 去组织。
例如:主机 A 的应用程序要和主机 B 的应用程序进行通信时,就必须先通过 Socket 建立连接。
- 客户端连接上服务器时,客户端就会产生一个socket 接口实例。
- 服务端每建立一个客户端连接,也会产生一个socket 接口实例,与客户端的socket 接口实例进行通信。
- 服务器可以建立多个socket 连接,可以同时存在多个socket 接口实例。
短连接
短连接指的是每次Socket通信时都需要建立一个新的连接,Socket通信结束后立即关闭连接。
例如:HTTP 协议,这是一个无状态协议,浏览器每次与服务器通信时都会进行一次HTTP 请求,在浏览器得到服务器返回响应数据后连接就会中断。
短连接适用于数据量小、传输间隔时间较长的场景,像HTTP 这种。
长连接
长连接指的是客户端和服务器之间的Socket连接一旦建立,在一定时间内保持连接状态,可以进行多次数据传输。
建立连接的流程大概为 连接 -> 数据传输 -> 连接保持(心跳) -> 数据传输 -> ... -> 连接关闭
。
长连接只需要在第一次Socket通信时建立连接,之后的数据传输不需要重新建立连接,直到连接超时或显式关闭。适用于数据量大、传输频繁的场景,例如即时通讯、在线游戏等。
长连接为了保持连接会一直占有资源,可能会导致资源浪费,尤其是在客户端数量较少的情况下。所以在使用长连接时,我们需要注意心跳机制和超时设置,以避免无效连接占用资源。
长连接与短链接选择
长连接通常用于需要频繁通信的应用场景,特别是点对点的通信。
由于 TCP 连接的建立需要经过三次握手过程,这会消耗一定的时间。如果每次操作都需要重新建立连接,将显著影响处理速度。
因此,在长连接模式下,一旦连接建立,就会保持连接状态,以便后续操作可以直接发送数据,无需重复建立连接的过程。
例如,在数据库连接中使用长连接可以避免频繁通信导致的 socket 错误,并且可以避免socket 连接频繁建立对资源的浪费。
对于 WEB 服务, HTTP 1.0 协议通常使用短连接,这时候长连接就可能会增加服务器的资源消耗。
对于 WEB 网站而言,可能需要处理成千上万甚至上亿的客户端连接,如果都需要保持长连接,对服务器而言资源负担太大,而短连接用完就释放更加节省服务器的资源。
但是,随着 HTTP 协议的发展,从 HTTP/1.1 到 HTTP/2 和 HTTP/3,HTTP协议已经开始支持长连接。长连接还是短连接选择,具体还是得视情况而定,看需要侧重哪一方面的资源试用情况。