当前位置: 首页 > Linux

tcp长连接和短连接

时间:2023-04-07 00:16:15 Linux

长连接和短连接使用TCP协议,客户端和服务端之间会建立一个虚拟通道,这个虚拟通道指的是连接,建议这个连接需要3次握手,需要4次握手才能断开这个连接。可见我们建立这个连接是有代价的。这个成本就是效率成本。简单来说,就是时间成本。包),然后就可以发送数据了。发送后需要挥手4次(来回4个数据包)断开连接。二、CPU资源开销,三次握手和四次握手以及发送数据都是从网卡发送和接收,从操作的角度看其他设备,如防火墙,路由器等系统内核,如果我们是一个高并发的系统,大量的数据包要经过这样一个过程,会消耗大量的CPU。第三,每个socket都需要消耗系统缓存。比如系统提供了一些设置socket缓存的接口,如:/proc/sys/net/ipv4/tcp_rmem/proc/sys/net/ipv4/tcp_wmem/proc/sys在/net/ipv4/tcp_memkeepalive机制之后TCP连接建立了,这个连接能一直保持下去吗?答案是不。操作系统在实现TCP协议时做了限制。这个限制可以参考配置:cat/proc/sys/net/ipv4/tcp_keepalive_timecat/proc/sys/net/ipv4/tcp_keepalive_intvlcat/proc/sys/net/ipv4/tcp_keepalive_probes我们看到tcp_keepalive_time的默认值是7200s,这是2小时。这个值的意思是如果TCP连接发送最后一个ACK包,如果超过2小时没有数据交换,那么连接就会断开。那么我们如何才能维持这种联系呢?其实这就是TCP的keepalive机制。哦,说法不严,TCP协议并没有规定这个,但是很多操作系统内核在实现TCP协议的时候都加入了这个keepalive机制,所以这个功能默认是关闭的。那么这个keepalive机制到底是什么呢?即如果TCP之间没有数据交换,在tcp_keepalive_time(7200s,2h)之后,服务器向客户端发送一个探测包。如果对方有响应,说明连接还活着,否则继续每隔tcp_keepalive_intvl(默认75s)发送一个探测包给对方。如果连续tcp_keepalive_probes(默认为9)次都没有收到对端的回复,则认为连接关闭。默认情况下不启用Tcpkeepalive。如果要使用KeepAlive,需要在你的应用中设置SO_KEEPALIVE才能生效。当然,我们可以提前修改这些默认值,如下:在Linux中,我们可以修改/etc/sysctl.conf的全局配置:net.ipv4.tcp_keepalive_time=7200net.ipv4.tcp_keepalive_intvl=75net.ipv4。tcp_keepalive_probes=9添加上面的配置后,输入sysctl-p使其生效,可以使用sysctl-a|grepkeepalive命令查看当前默认配置tcpkeepalive可以通过设置TCP选项来设置,设置方法如下:#includeintsetsockopt(intsocket,intlevel,intoption_name,constvoid*option_value,socklen_toption_len);我们可以通过在需要开启keepalive的socket上调用setsockopt函数来开启socket上的keepalive。第一个参数是要设置的socket第二个参数是SOL_SOCKET第三个参数必须是SO_KEEPALIVE第四个参数必须是布尔整数值,0表示关闭,1表示打开最后一个参数是第四个参数值的大小。例子:intkeepalive=1;setsockopt(incomingsock,SOL_SOCKET,SO_KEEPALIVE,(void*)(&keepalive),(socklen_t)sizeof(keepalive));intkeepalive_time=30;setsockopt(incomingsock,IPPROTO_TCP,TCP_KEEPIDLE,(void*)(&keepalive_time),(socklen_t)sizeof(keepalive_time));intkeepalive_intvl=3;setsockopt(incomingsock,IPPROTO_TCP,TCP_KEEPINTVL,(void*)(&keepalive_intvl),(socklen_t)sizeof(keepalive_intvl));intkeepalive_probesetsingcomets=opt(,IPPROTO_TCP,TCP_KEEPCNT,(void*)(&keepalive_probes),(socklen_t)sizeof(keepalive_probes));设置SO_KEEPALIVE选项开启KEEPALIVE,然后通过TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT参数设置keepalive时间、间隔、keepalive次数。