TCP 长连接、短连接和保活机制

当server和client进行TCP通信时,发送数据之前,需要先建立连接。数据发送完毕时,需要选择是否断开。这里就需要先认识下TCP的三次握手和四次分手机制。

3次握手时   第一次握手:client端向server端发送连接请求信息:SYN=1,seq=x,

                    第二次握手:server端回复:ACK=x+1的确认信息。

                    第三次握手:server端向client端发送连接请求信息:SYN=1,seq=y,

                    第四次握手:client端回复:ACK=y+1的确认信息。

因为连接之前,没有别的数据在发送,所以第二次和第三次握手可以合并一起发送。即:

                    第一次握手:client端向server端发送连接请求信息:SYN=1,seq=x,

                    第二次握手:server端向client端发送回复和连接请求信息:ACK=x+1,SYN=1,seq=y,

                    第三次握手:client端回复:ACK=y+1的确认信息。

四次分手     第一次分手:client端向server端发送断开连接请求信息:FIN=1,seq=x+2

                    第二次分手:server端回复:ACK=x+3的确认断开连接信息。

                    第三次分手:server端向client端发送断开连接请求信息:FIN=1,seq=y+1,

                    第四次分手:client端回复:ACK=y+2的确认断开连接信息。

为什么这里第二次和第三次分手不能合并一起呢?因为client向server端发送信息完毕时,会发送断开连接请求,server会回复确认断开连接回复,但此时server端可能还在向client发送数据,所以不能同时发送断开连接请求,只有当server端向client发送数据完毕时,才能向client端发送断开连接请求。

言归正传,说一下我理解的长连接和短连接。

长连接:在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手)即:Keepalive(存活定时器)功能。过程如下:

连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信);

默认的Keepalive超时需要7,200,000 milliseconds,即2小时,探测次数为5次。

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

  1. 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
  2. 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
  3. 客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
  4. 客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。

短连接

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

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

猜你喜欢

转载自www.cnblogs.com/sly123/p/9574805.html