20170908_TCP的短连接和长连接

来源:互联网 发布:christopher bu知乎 编辑:程序博客网 时间:2024/06/08 15:14

20170908_TCP的短连接和长连接

转自:http://www.cnblogs.com/onlysun/p/4520553.html

1、当网络通信时采用TCP协议时,在真正的读写数据操作之前,server 与 client 之间必须事先建立好一个连接

当读写操作完成后,双方不再需要这个连接的时候,它们便可以释放这个连接。

连接的建立是需要三次握手的,而释放则是需要四次挥手,所以说,每个TCP连接的建立和释放都是需要资源消耗和时间消耗的。

 2、三次握手四次挥手的示意图:

        

 

3、长连接:

(1)所谓长连接,就是指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,则需要双方主机互相发送 检测包 以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手)。     

(2)长连接的形式:

建立连接——→数据交互——→保持连接( 心跳 )——→数据交互——→保持连接( 心跳 )——→……——→关闭连接。

(一个TCP连接通道可以进行多个读写通信); 
(3)这就要求长连接的双方在没有数据通信的时候,需要定时发送数据包( 心跳包 )来维持事先建立好的这种连接状态

(4)TCP保活功能

保活功能主要为服务器端提供,当服务器和客户端长时间没有数据通信的时候,服务器端希望知道客户端是否是崩溃了。

即,如果客户端主机没有经历与服务器端的正常的四次挥手而自己无故消失,则会使得服务器端保留一个半开放的连接(这个TCP连接没有被完全释放掉,还占有相应的资源),而与此同时,服务器端又会继续等待来自客户端的数据,则服务器端将会永远等待这个客户端的数据。而保活功能,就是试图在服务器端检测这种半开放的连接。

如果一个给定的连接在两小时内没有任何的动作,则服务器端就向客户端发送一个探测报文段

客户端必须处于以下4个状态之一:

1)客户端依然正常运行,并服务器可达。

客户端的TCP响应正常,而服务器端也知道对方是正常的,服务器端在两小时后将保活定时器复位

2)客户端已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客端户的TCP都没有响应。

服务器端将不能收到对探测报文段的响应,并在 75秒 后超时。服务器总共发送 10个 这样的探测包,每个间隔75秒。如果服务器端没有收到一个响应,那么它就会认为客户端已经关闭、并且自己也终止这个TCP连接

3)客户端崩溃并且已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位RST,使得服务器终止这个连接。

4)客户端正常运行,但是服务器不可达,这种情况与 2 类似,TCP能发现的就是没有收到探查的响应。

4、短连接:

(1)短连接的定义是指,通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。

这样的话,TCP连接管理起来比较简单存在的连接都是有用的连接,不需要额外的控制手段。

(2)短连接的形式是:    建立连接——→数据交互——→关闭连接。

 

5、应用场景:

1)长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况。

每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接、再操作的话,那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。

例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

2)而像WEB网站的http服务一般都用短链接(http1.0只支持短连接,1.1keep alive 带时间、操作次数限制的长连接)

因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好;

3)长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头

读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。




原创粉丝点击