长连接:

tcp长链接和短链接 Java实现 tcp短链接和长连接_长连接

  1. 介绍
    指在一个TCP连接上可以连续发送多个数据包。在TCP连接保持期间,如果没有数据包发送,需双方发送探测包以维持此连接,一般需要自己做在线维持(不发送RST包和四次挥手)。
  2. 过程:

连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信)。 这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态;

  1. 应用场景:
    数据库,各种组件的连接等…
    长连接多用于操作频繁(读写),点对点的通讯,且连接数不能太多的场景。因为频繁建立tcp连接,是对资源的浪费,服务器的请求处理速度也会更低。
  2. 优点:
    长连接可以省去较多的TCP建立和关闭的操作(三次握手/四次挥手),减少资源浪费,节约连接时间。对于频繁请求资源的客户来说,更适用长连接。
  3. 缺点:
    client与server间的连接如果一直不关闭,会存在一个问题:随着客户端连接越来越多,server早晚有扛不住的时候,这时server端需要采取一些策略:
  • 如关闭一些长时间没有产生读写事件的连接,这样能淘汰一些导致server端服务受损的恶意连接
  • 如果条件再允许就以客户端机器为粒度,限制每个客户端的最大长连接数,这样能避免某个客户端占据大量后端服务连接
  1. 问题:

(1) HTTP首部定义Connection: keep-alive后,客户端、服务端怎么知道本次传输结束呢?
在长连接中一般是没有条件能判断读写何时结束,又因为tcp首部中没有直接表示数据包长度的字段,所以要获取tcp数据包长度,可通过ip首部及tcp首部来间接的获取:TCP数据包长度 = IP首部的数据包长度 - IP首部长度(20字节 )- TCP包首部长度(20字节 ),最后根据这个长度去读取相应长度的报文。

静态页面通过Content-Length提前告知对方数据传输大小。

(2) 客户端是长连接还是短连接?

推荐长连接。若业务并发量大,为性能考虑,可以开启『连接池』功能。(连接池:由于一些数据库创建和销毁连接的开销很大,或者相对于所执行的具体数据操作,连接所耗的资源过多,此时就需要添加连接池改善性能。它是一些网络代理服务或者应用服务器实现的特性,这个连接池被所有连接的客户端共享使用,连接池可以加速连接,也可以减少数据库连接,降低数据库服务器的负载)。

  1. 补充:
  • 在http中,设置header的Connection为keep-alive就算是长连接了,但是要服务器和客户端两边都设置才有效。(如果客户端的请求头中的connection为close,则表示客户端需要关掉长连接)
  • 日常用的基本上都是HTTP1.1协议(默认长连接,也就是默认Connection的值就是keep-alive)
  • 长连接并不是永久连接的。如果一段时间内(具体的时间长短,是可以在header当中keepalive_timeout进行设置的,也就是超时时间),超时的话这个长连接就会被断开。

短连接:

tcp长链接和短链接 Java实现 tcp短链接和长连接_客户端_02

  1. 介绍:
    通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接(管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段);
  2. 过程:

连接 → 数据传输 → 关闭连接

  1. 应用场景:
    WEB网站的http服务一般都用短链接(http1.0默认为短连接,而http1.1之后默认为长连接,keep-alive 带时间,操作次数限制的长连接),因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源(也就是正常情况下,每个用户不会频繁发送请求,没必要长时间占用一条连接或端口)
  2. 优点:
    短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段
  3. 缺点:
    如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽,消耗服务端的资源