长连接是客户和服务器建立连接后不断开,持续用这个连接通信,持续过程中一般需要连接侦测,客户探测服务,或者服务心跳告知客户,应用层的保活机制。短连接是通信一次后就关闭连接。长短连接是一种通信约定,需要双方一起遵守。比如在长连接时,两端都不close,客户端/服务端协议保活;短连接时两端都要主动或被动close,以完成四路释放。
ps:如果恶意客户端就是不close怎么办?
例如服务器主动关闭,进入FIN_WAIT_1状态,这时客户端有三种情况:
① 如果客户端机器崩溃导致没有ACK响应,重传一定次数后直接回收连接。
② 如果客户端进程崩溃,客户端回送RST分节,服务器端收到RST分节后直接回收连接
③ 如果客户端正常,则客户端回送ACK,服务器进入FIN_WAIT_2状态,等待客户端close,如果服务器执行了close全关闭,而客户端一直不发送FIN,则服务器等待10分75秒将进入CLOSED状态,连接被完全释放,此后客户端再close将收到RST响应。
最好的解决方案是服务器端设置SO_LINGER,当服务器执行close时就直接回收连接,发送RST分节给客户端。
什么情况下发送RST分节(复位报文段)
收到RST的连接将被系统回收,再次读写套接字端口则触发信号SIGPIPE,默认操作是终止进程。
① 客户端请求一个未监听的服务器端口,则服务器返回RST分节
② 主动异常终止一个连接。(不用4路握手释放),设置SO_LINGER选项
③ 检测半打开连接,当连接一端的主机崩溃并重启后,如果另一端发送数据,以RST响应。
④ 当监听套接字关闭时,对监听已完成队列中的连接的对端都发送RST
什么是半连接和半关闭?
半连接是指已经建立好的连接的一端已经关闭或异常终止,而另一端却不知道(依然显示连接ESTABLISHED)的状况;半关闭是指已建立连接的一端执行半关闭,终止某个方向的数据传送,这时连接处于半关闭状态(主动关闭端FIN_WAIT_2,另一端CLOSE_WAIT)。
阅读(2369) | 评论(0) | 转发(1) |