背景
今天与同学聊天说到了人到35岁之后应该有自己的独特的技术特长。说完之后我就意识到现在就必须坚持写博客学习技术了。
其中我们谈到了一个话题就是分布式框架dubbo,其中涉及到一个知识点就是长连接和短连接。
在这里我会从以下几个角度来阐述长连接相关的知识。
1.长连接产生的背景。
2.什么时候用长连接。
3.长连接在社会中的运用实例。
4.附:一些补充的知识。
产生背景
以前http 1.0 是无状态的,无状态的意思就是网页上有个链接你点击两下,第一次点击与第二次点击获取的网页是没有联系的。所以我们每次向服务器发起请求都会从新创建一个连接,且每次创建连接后只做一次数据传输就断开。 TCP 3次握手建立连接和4次握手释放连接都很消耗资源,所以长连接就应运而生。在http 1.1 报文头中设置Connection:keep-alive就可以使用长连接。
长连接怎么通信的
长连接就是一次请求发过去之后连接不断,它的交互模式为。
建立连接 -> 发送数据1,发送数据2 ...... 发送数据 -> 断开连接
而短连接的方式为:
建立连接 -> 发送数据1 -> 断开连接。
建立连接 -> 发送数据2 -> 断开连接。
即短连接每个连接只做一次数据传输,而长连接建立连接后可以进行多次数据传输。
在tcp连接和释放协议中,短连接一般是有客户端主动断开连接。
而对于长连接来说来接是一直保持的,如果已经不用的客户端长连接一直连着会消耗很多资源,比如线程池和数据库连接池连接数都有 一个最大值,如果连接不能释放那么达到最大值后其他连接就无法建立,就无法响应客户端的请求。所以长连接中服务器会隔一段时间发送10次心跳报文,如果服务器没有收到一次响应则认为客户端关闭或不可达相应的会把长连接关闭。
什么时候用长连接
前面提到短连接不能对连接复用每次传输要新建立请求,所以不适合操作频繁的客户端。而长连接中如果大量连接一直保值着会消耗很多的资源,长连接适合量小频繁的操作,比如数据库连接池、socket通信就是使用的长连接。
你如果在服务器中执行命令“netstat -ant | grep 1521” 会一些连接,这些就是oracle数据库的连接。
而对于web应用由于有成千上万个请求,所以这是不方便使用长连接的。
长连接在实践中的运用
写这篇文章是由于讨论dubbo话题引起的,所以这里对dubbo中的长连接进行一些描述。
在dubbo中消费者和生产者是通过单一的长连接维护的,因为客户端是不停的往服务器发送数据。
如果客户端是高并发的应用,这就是客户端的多线程往单一长连接发送数据场景。这样的话服务器需要知道这个数据是哪个线程发过来的,以便通知对应的线程。
这个解决办法就是在报文头加id,当服务器返回是会把id带过去,这样线程只接收自己认识的id响应报文。
其形式如下:
thread1 id = 1
客户端 发送数据 thread2 id = 2 ---单一长连接---> server
thread3 id = 3
thread1 只接收 id=1的响应
客户端 接收数据 thread1 只接收 id=2的响应
thread1 只接收 id=3的响应
附:
通讯协议说明
说到网络通信有必要把通信协议在这里说明一下,让大家知道网络上的报文如何传输的。
在网络通信协议模型分为4层:从底到上依次是物理层、网络互连层、传输层、应用层。
其中网络互连层使用ip协议解决路由和寻址问题,即一个报文从北京出发如何经过路由器交换机到达目的地上海的过程。
传输层主要保证报文从北京发出正确无误按顺序的在上海被接收到(保证不丢包顺序不乱等等)。
因为连接的建立和释放是通过tcp完成的,我们说的http长连接实际上就是tcp长连接。
写完之后的感受
自己先想明白整个逻辑,然后一篇文章只描述其中一个点就可以了。但是一定 要是自己的推导思路。