标签:keep 服务器端 时间 bsp 注意 服务端 活动 计算机 登录
上面2个图是tcp三次握手和4次握手
三次握手,第一次,服务端知道自己接受数据没问题,第二次,客户端知道自己自己发送数据和接受数据没问题,第三次服务端知道自己发送数据没问题。
然后,数据开始发送。
4次握手,第一次客户端发送一个fin,表示自己数据发完了,服务端收到后,若是数据没有发送完,就发送一个ack,表示,已经收到你的请求,但是服务端数据没有发送完,
继续发送数据,等到数据发送完了,就发送一个fin,客户端收到后就发送一个ack,表示确认收到,服务端就可以关闭连接了。但是客户端还是要等一个周期时间,如果客户端发送
ack丢失了,服务端没有收到就会继续发送fin,直到收到信息后,才关闭,而客户端在一定周期内没有收到信号也关闭。
注意:为何是结束是4次握手?
数据可能没有发送完。如果都是同时发送完了,那么也是3次握手,3次握手是由于没有数据传送
注意到每一次连接都要消耗3次握手和4次握手,
故有了tcp长连接和短连接,http的长连接和短连接实际上就是tcp的,
短连接:就是一次简单的tcp连接,数据发送完直接关闭。连接→数据传输→关闭连接
长连接:就是在一次连接内多次发送数据包,中间若是没有数据那么靠心跳保活协议维护, 连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接
tcp保活协议:
个人计算机用户使用TCP/IP协议通过Telnet登录一台主机,这是能够说明需要使用存活定时器的一个常用例子。如果某个用户在使用结束时只是关掉了电源,而没有注销(log off),
那么他就留下了一个半打开(half-open)的连接。如果客户端消失,留给了服务器端半打开的连接,并且服务器又在等待客户端的数据,那么等待将永远持续下去。存活特征的
目的就是在服务器端检测这种半打开连接。
keepalive工作原理:
若在一个给定连接上,两小时之内无任何活动,服务器便向客户端发送一个探测段。(我们将在下面的例子中看到探测段的样子。)客户端主机必须是下列四种状态之一:
1) 客户端主机依旧活跃(up)运行,并且从服务器可到达。从客户端TCP的正常响应,服务器知道对方仍然活跃。服务器的TCP为接下来的两小时复位存活定时器,如果在这两
个小时到期之前,连接上发生应用程序的通信,则定时器重新为往下的两小时复位,并且接着交换数据。
2) 客户端已经崩溃,或者已经关闭(down),或者正在重启过程中。在这两种情况下,它的TCP都不会响应。服务器没有收到对其发出探测的响应,并且在75秒之后超时。服务器将总共发送10个这样的探测,每个探测75秒。如果没有收到一个响应,它就认为客户端主机已经关闭并终止连接。
3) 客户端曾经崩溃,但已经重启。这种情况下,服务器将会收到对其存活探测的响应,但该响应是一个复位,从而引起服务器对连接的终止。
4) 客户端主机活跃运行,但从服务器不可到达。这与状态2类似,因为TCP无法区别它们两个。它所能表明的仅是未收到对其探测的回复。
服务器不必担心客户端主机被关闭然后重启的情况(这里指的是操作员执行的正常关闭,而不是主机的崩溃)。当系统被操作员关闭时,所有的应用程序进程(也就是客户端进程)都将被终止,
客户端TCP会在连接上发送一个FIN。收到这个FIN后,服务器TCP向服务器进程报告一个文件结束,以允许服务器检测这种状态。
标签:keep 服务器端 时间 bsp 注意 服务端 活动 计算机 登录
原文地址:http://www.cnblogs.com/donghang/p/7742044.html