TCP keepalive 和 http keep-alive 以及心跳保活
HTTP的长连接和短连接本质上是TCP长连接和短连接。短连接短连接,顾名思义,与长连接的区别就是,客户端收到服务端的响应后,立刻发送FIN消息,主动释放连接。也有服务端主动断连的情况,凡是在一次消息交互(发请求-收响应)之后立刻断开连接的情况都称为短连接。长连接/http keep-alive也叫持久连接,即一个TCP连接服务多次请求,在TCP层握手成功后,不立即断开连接,并在此连接的基础上进行多次消息(包括心跳)交互,直至连接的任意一方(客户端OR服务端)主动断开连接,此过程称为一次完整的长连接。在HTTP/1.0中得到了初步的支持,客户端在请求header中携带Connection:Keep-Alive,即是在向服务端请求持久连接。如果服务端接受持久连接,则会在响应header中同样携带Connection: Keep-Alive,这样客户端便会继续使用同一个TCP连接发送接下来的若干请求。(Keep-Alive的默认参数是[timout=5, max=100],即一个TCP连接可以服务至多5秒内的100次请求)HTTP/1.1开始,即使请求header中没有携带Connection: Keep-Alive,传输也会默认以持久连接的方式进行,只有加入"Connection: close "后,才关闭。http keepalive是客户端浏览器与服务端httpd守护进程协作的结果。TCP中的KeepAliveTCP协议的实现中,提供了KeepAlive报文,用来探测连接的对端是否存活。在应用交互的过程中,可能存在以下几种情况:客户端或服务器意外断电,死机,崩溃,重启;中间网络已经中断,而客户端与服务器并不知道;利用保活探测功能,可以探知这种对端的意外情况,从而保证在意外发生时,可以释放半打开的TCP连接。TCP保活报文交互过程如下:因此,KeepAlive并不适用于检测双方存活的场景,这种场景还得依赖于应用层的心跳。应用层心跳也具备着更大的灵活性,可以控制检测时机,间隔和处理流程,甚至可以在心跳包上附带额外信息。应用层心跳是检测连接有效性以及判断双方是否存活的有效方式。但是心跳过于频繁会带来耗电和耗流量的弊病,心跳频率过低则会影响连接检测的实时性。业内关于心跳时间的设置和优化,主要基于如下几个因素:理想的情况下,客户端应当以略小于NAT超时时间的间隔来发送心跳包。根据微信团队测试的一些数据,一些常用网络的NAT超时时间如下表所示:TCP的KeepAlive机制意图在于保活、心跳,检测连接错误如何快速区分当前连接使用的是长连接还是短连接1、凡是在一次完整的消息交互(发请求-收响应)之后,立刻断开连接(有一方发送FIN消息)的情况都称为短连接;2、长连接的一个明显特征是会有心跳消息(也有没有心跳的情况),且一般心跳间隔都在30S或者1MIN左右,用wireshark抓包可以看到有规律的心跳消息交互(可能会存在毫秒级别的误差)。什么时候用长连接,短连接?1、需要频繁交互的场景使用长连接,如即时通信工具(微信/QQ,QQ也有UDP),相反则使用短连接,比如普通的web网站,只有当浏览器发起请求时才会建立连接,服务器返回相应后,连接立即断开。2、维持长连接会有一定的系统开销,用户量少不容易看出系统瓶颈,一旦用户量上去了,就很有可能把服务器资源(内存/CPU/网卡)耗尽,所以使用需谨慎。keep-alive与TIME_WAIT使用http keep-alvie,可以减少服务端TIME_WAIT数量(因为由服务端httpd守护进程主动关闭连接)。道理很简单,相较而言,启用keep-alive,建立的tcp连接更少了,自然要被关闭的tcp连接也相应更少了。短连接和长链接 图:参考: https://caofengbin.github.io/2018/03/16/dhcp-and-nat/#4-%E5%BD%B1%E5%93%8D%E5%BF%83%E8%B7%B3%E9%A2%91%E7%8E%87%E7%9A%84%E5%85%B3%E9%94%AE%E5%9B%A0%E7%B4%A0https://blog.csdn.net/hengyunabc/article/details/44310193http://wingjay.com/2018/12/05/android-arch-long-link/https://www.levicc.com/2018/06/30/yi-dong-duan-wang-luo-you-hua/能被我参考的都很优秀,哈哈

TCP是长久连接吗?
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答 TCP的三次握手SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。TCP三次握手的过程如下:客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。 三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
TCP不是持久性链接

C#的TCP连接,怎样保持客户端和服务器端一直连接着?
只要不执行Socket.Shutdown(),Socket.Close().就会一直连着。当然有时候网络不稳定,可能会失去连接,这时候你使用握手协议,始终监控连接即可。具体做法可以google一下。
服务器一直监听就行了啊
写个后台线程一直监听即可。

C# 如何保持TCP长久连接?
TCP连接默认就是长久连接,你说的这种情况我遇到过,因为一开始没问题,后来在没有改动程序的情况下不能保持长久连接了,……最后确定是网络服务商的问题,联系网络服务商后他们给把问题解决了,当时用的移动的网络,移动公司说是为了提高安全性,公司做了一些调整,所以导致TCP无法保持长期连接。我当时是用了其它公司的网络测试后发现这个问题的。

什么是 TCP 连接
世界上绝大部分的 HTTP 通信都是通过 TCP/IP 承载的,TCP/IP 是全球计算机和网络设备都在使用的一种常用的分组交换网络分层协议集。客户端应用程序可以打开一条 TCP/IP 连接,连接到世界上可能运行的任何一个服务器应用程序上。一旦连接建立起来,在不断网的情况下,客户端与服务器之间交换的报文就永远不会丢失、受损或者失序。

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/299660.html。