php 长连接心跳_客户端发送TCP心跳,服务器需要回吗?

TCP长连接在提高效率的同时引入了心跳机制,以应对NAT设备连接状态表老化的问题。心跳机制虽然能维持连接,但在大规模连接下可能会增加服务器性能开销。若服务器不回应心跳,客户端体验会下降;反之,服务器处理心跳和回复会消耗资源。连续未收到心跳回复会导致TCP连接重置。即使使用TLS,TCP报文头(包括心跳报文)仍可能被伪造,影响连接安全性。
摘要由CSDN通过智能技术生成
802a71bb3c6fec84eabedde4f1c8cdbf.png

问题描述

如果服务端不回心跳,客户端体验会比较差!如果回的话,单机在上百万或者千万的连接下,性能影响有多大?答案是肯定的!

没有听过单机可以支持几百万、千万的连接数的,对CPU资源的影响肯定有一些,毕竟要处理心跳以及回复心跳。

至于影响程度要看心跳的频率与连接数。如果答案就写到这,跟没写有什么区别?

也许有的读者会觉得,一句话就可以说完的问题,为何要写一篇文章?

我想说的是,在千千万万个问题选中它,说明它非常重要,以至于必须写一篇文章。

为何要有TCP Keepalive?

最早的http交易是这样的:

三次握手建立TCP连接HTTP Request/ Response 完成交易四次挥手关闭TCP连接。

TCP短连接

这是典型的TCP短连接,TCP连接的生存周期只持续了0点几、或几秒不等。

如果用户点击页面的链接,又要重复以上http交易过程。

为了打开一个新的页面,会有建立连接、关闭连接的时间开销,这些等待时间不是每个用户都可以忍受的。

8425286b6954f33cadd0805ac6ddcada.png

TCP长连接

如果每次http交易完成时,TCP不关闭,而是保持连接状态。那么下次http交易时,依然可以使用这个TCP,效率无疑是高效的。

这个很简单,只需要应用程序提前通知TCP,自己将使用长连接即可。

长连接带来的挑战

在客户端与服务器之间,可能有一个或多个NAT设备,这些NAT设备动态维护着客户端与服务器之间的连接状态。

连接状态表,有一个老化回收机制,一段时间没有流量经过时,将会被删除。如果客户端与服务器有流量经过,会不断刷新这个定时器,从而让状态表一直赖在内存里,为流量转发服务。

假设由于没有流量穿梭,状态表消失了。当流量再次到达时,由于没有状态表,流量会被丢弃,并触发双方再次建立全新的TCP连接,并完成交易。

本来想快的,结果没快成,反而更慢了。

痛定思痛,协议设计者发明了“心跳机制”,为了周期性刷新赖在NAT设备的内存状态表,让他们一直活着。

这样,用户每打开一个新的页面,立马就可以直奔主题,完成http交易流程。

任何事物都有正反面,当给用户提供实时响应交易,必须承担“心跳机制”带来的CPU开销。

另外需要指出的是,如果连续几次没有收到对方的心跳回复,将会重置TCP连接。

由于TCP没有自身报文完整性保护措施,所以TCP的报文非常容易伪造,这其中自然包括心跳报文、ACK报文、Reset报文。

有读者会问,如何采用TLS来保护http交易,那TCP心跳报文可以伪造吗?

当然可以伪造!因为TLS的安全防护并没有覆盖TCP报文头部分。

62609783ba5174e343169ff9f914eda7.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值