https://www.cnblogs.com/gotodsp/p/6366163.html
https://www.cnblogs.com/onlysun/p/4520553.html
https://www.cnblogs.com/lancidie/p/4524562.html
HTTP的长连接和短连接本质上是TCP长连接和短连接。
当网络通信时采用TCP协议时,在真正的读写操作之前
,server与client之间必须建立一个连接
,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手
的,而释放则需要4次挥手
,所以说每个连接的建立都是需要资源消耗和时间消耗
的。
1 长连接:
所谓长连接,指在一个TCP连接上可以连续发送多个数据包
,在TCP连接保持期间
,如果没有数据包发送
,需要双方发检测包以维持此连接
,一般需要自己做在线维持(不发生RST包和四次挥手)。
长连接没有条件能够判断读写什么时候结束
,所以必须要加报文头的长度
。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。
TCP连接→数据包传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接
(一个TCP连接通道有多个读写通信
);
TCP保活功能
:保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接
,而服务器又在等待来自客户端的数据,则服务器将永远等待客户端的数据,保活功能就是试图在服务器端检测到这种半开放的连接。
如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段
,客户主机必须处于以下4个状态之一:
- 客户主机依然
正常运行,并从服务器可达
。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。 - 客户主机
已经崩溃,并且关闭或者正在重新启动
。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测
,每个间隔75秒
。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接
。 - 客户主机
崩溃并已经重新启动
。服务器将收到一个对其保活探测的响应,这个响应是一个复位
,使得服务器终止这个连接
。 - 客户机
正常运行,但是服务器不可达
,这种情况与2类似
,TCP能发现的就是没有收到探查的响应。
2 短连接
短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接(管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段)。
连接→数据传输→关闭连接→连接→数据传输→关闭连接~~~
;
3 长连接和短连接的优点、缺点、适用场景
长连接
优点
:
可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。
缺点
:
- 服务器端有很多TCP连接时,会降低服务器的性能。
- 需要管理所有的TCP连接,检测是否是无用的连接(长时间没有读写事件),并进行关闭等操作。
解决方案
:
如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度
,限制每个客户端的最大长连接数
,这样可以完全避免某个蛋疼的客户端连累后端服务。
适用场景
:
长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况
。
例如:数据库的连接用长连接
, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
短连接
优点
:
对于服务器来说管理较为简单
,存在的连接都是有用的连接,不需要额外的控制手段。
缺点
:
但如果客户请求频繁,将在TCP的建立和关闭操作上
浪费较多时间和带宽。
适用场景
:
短连接用于并发量大,且每个用户无需频繁向服务器发数据包。
而像WEB网站的http服务一般都用短链接
。因为长连接对于服务端来说会耗费一定的资源像,WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源。
4 HTTP协议与TCP/IP协议的关系
HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由
和寻址问题
,TCP协议主要解决如何在IP层之上可靠地传递数据包
,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。
5 如何理解HTTP协议是无状态的
HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力
,服务器不知道客户端是什么状态
。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的
协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。