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连接(管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段);过程如下:

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

原文地址:https://www.cnblogs.com/sly123/p/9574805.html

时间: 2024-07-29 19:40:02

TCP 长连接、短连接和保活机制的相关文章

长连接&短连接分析

转自:http://www.cnblogs.com/heyonggang/p/3660600.html 1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的 经典的三次握手示意图: 经典的四次握手关闭图: 2. TCP短连接 我们模拟一下TCP短连接的情况,client向

http 长连接 & 短连接

1.意义 同一个TCP连接来发送和接收多个HTTP请求/应答,而不是为每一个新的请求/应答打开新的连接的方法. 2.优 较少的CPU和内存的使用 允许请求和应答的HTTP pipelining 降低网络阻塞 减少了后续请求的延迟(无需再进行握手) 报告错误无需关闭TCP连接 3.缺 空闲的连接需要过段时间后才能被断开,可能影响整体性能(比如那些单次访问次数多的web 服务) http 长连接 & 短连接

[Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)

通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更加稳定.茁壮~ 作为一个可能会和非常多Client进行通讯交互的Server.首先要保证的就是整个Server执行状态的稳定性,因此在和Client建立连接通讯的时候,确保连接的及时断开非常重要,否则一旦和多个client建立不关闭的长连接,对于server资源的占用是非常可怕的.因此,我们须要针对

HTTP的长、短连接介绍

一.长连接简介及使用 HTTP长连接:HTTP persistent connection ,也有翻译为持久连接,在HTTP1.1规定默认保持长连接,数据传输完成了保持TCP连接不断开(不会再发RST包.不会再进行四次握手),等待在同域名下继续用这个通道传输数据(与之相反的就是短连接). HTTP首部的Connection: Keep-alive是HTTP1.0浏览器和服务器的实验性扩展,当前的HTTP1.1 RFC2616文档没有对它做说明,因为它所需要的功能已经默认开启,无须带着它.但是实践

长连接短连接长短连接争长短

其实还是这个老问题: 记一次文件下载丢包填坑之旅 http://www.cnblogs.com/syjkfind/p/5281677.html 即使现在只有haproxy-nginx-磁盘文件 比较少的转发,但文件特别大,还是偶有文件不完整的问题. 从现象上看,浏览器响应是200没问题,curl命令的日志显示是 curl: (18) transfer closed with 204800 bytes remaining to read 字面上理解就是连接已关闭.查相关资料并没有任何有关的答案,说

Socket 长连接 短连接 心跳 JAVA SOCKET编程

简单解释就是: 短连接:建立连接,发送数据包,关闭连接 长连接:建立连接,发送数据包,发送心跳包,发送数据包,发送心跳包,发送心跳包...... 所以又频繁的数据收发的话,短连接会频繁创建TCP连接,而对于长连接,则始终用的是同一个TCP连接 package com.tree.demo.socket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.n

长链接短连接、长轮询短轮询

https://www.cnblogs.com/gotodsp/p/6366163.html https://blog.csdn.net/LEE1996JUN/article/details/79702848 原文地址:https://www.cnblogs.com/yishenweilv/p/11366634.html

TCP/IP系列——长连接与短连接的区别

1 什么是长连接和短连接 三次握手和四次挥手 TCP区别于UDP最重要的特点是TCP必须建立在可靠的连接之上,连接的建立和释放就是握手和挥手的过程. 三次握手为连接的建立过程,握手失败则连接建立失败. 四次挥手为连接的完整释放过程,也会发生某个消息丢失或者超时的情况,有一方主动发送FIN消息即表示连接即将释放. 注:SYN.ACK.FIN消息具有哪些含义,以及连接的状态,请参考<TCP/IP详解 卷1>第18章. 长连接 长连接,也叫持久连接,在TCP层握手成功后,不立即断开连接,并在此连接的

小tips:TCP的三次握手、长连接、 短连接、 SPDY 协议

当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的. TCP的三次握手 三次握手建立连接: 第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包

HTTP长连接和短连接(转)

1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致.TCP有可靠,面向连接的特点. 2. 如何理解HTTP协议是无状态的 HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态.也就是说,打开一个服