Http keep-alive 与Tcp keep-alive

前两天面试遇到一个问题:如果让你对一个项目通信协议进行选择的话,你会选择Http还是Tcp(当时问的是套接字,其实套接字还有UDP啦,我好像也没去讲)协议?感觉当时脑子转的不太灵活。而且以为Http keep-alive与Tcp keep-alive是差不多的,所以根本没去讲两者之间的keep-alive。每次面试回答问题都有点着急,所以思考不够。实际上两者是不同的,下面分别介绍一下。

首先Http是建立在Tcp协议的基础上的,Tcp是传输层的协议,Http是应用层协议。Http底层也是通过Tcp传输的。

HTTP keep-alive

Http是一个”请求-响应”协议,它的keep-alive主要是为了让多个http请求共享一个Tcp连接,以避免每个Http又新建一个Tcp连接。每个Http服务器默认的keep-alive时间可能是不一样的。

TCP keep-alive

Tcp的keep-alive是Tcp协议的一种保鲜装置,当Tcp请求响应结束后,经过tcp_keep-alive_time时间后,服务器会发出监测包去看看改Tcp连接是否还是继续连接的,是否已经出现了网络问题,是否客户端崩溃了等等问题。如果发现出现了问题,那么服务端就会去关闭连接,把这个Tcp连接关闭。

关于TCP心跳

在目前这两年的移动互联网火热的环境下,推送应用的非常多。推送实现的就是通过TCP长连接实现的,因为移动网络很多时候都会不稳定,另外NAT过一段时间就会刷新,所以而要如何保证客户端和服务器端连接就成了一个问题。TCP心跳包就是客户端监测连接的,它先发送一个心跳包到服务器,服务器再Ask,通过这种方式判断是否目前的长连接是否可用,如果断了,则通知上层应用,并关闭连接,另外发送心跳包也是避免一段时间都没有通信,NAT超时,NAT表被刷新,导致连接失效。

HTTP与TCP keep-alive联系

直接介绍一个场景就可能更容易明白了。客户端发送了一个Http请求,服务器响应后,判断这个Http是否是keep-alive的,如果不是则关闭连接。如果是keep-alive,则等待keep-alive time后再关闭,如果这期间再收到一个http 请求,则继续等待最后一个请求的keep-alive time时间,直到keep-alive time时间内没有收到请求,则关闭。

上面是HTTP keep-alive的,而TCP是它下一层的协议,本身TCP是长连接的,除非主动关闭。HTTP的keep-alive time一般是15ms, 30ms之类的,如果是超过了HTTP的keep-alive time时间,则HTTP会关闭TCP连接。本身TCP是不会关闭连接的,TCP的keep alive是TCP的保鲜装置,在keep alive timeout 后服务端发送一个监测包来判断连接是否仍保持着,如果还是可连接,则继续保持,它不会主动关闭连接的。而心跳包是为了防止NAT超时。

杂记

对于问题要多问为什么,要去细细探究,注意细节。了解与理解是不同的,另外也需要在遇到问题的时候,充分利用自己的知识分析问题,心态要好。找个时间看一下HttpUrlConnection跟okHttp的源码。


加强表述

TCP Keep-alive是一种机制,用于检测并恢复网络连接中存在的故障情况。当两个系统之间的网络连接长时间没有数据交换,TCP协议可能会认为该连接已断开,并关闭连接以防资源浪费。然而,在某些情况下,如Web服务器、长连接应用等,连接应该保持开放状态而不仅仅是因为无活动就关闭。 ### TCP Keep-alive的工作原理 TCP Keep-alive通过发送空的数据包来检查连接的状态。发送间隔由`TIME_WAIT`定时器控制,默认设置下这个间隔大约为7200秒(两小时)。如果在这个时间周期内接收端没有接收到任何来自对端的数据包,那么接收端会自动向源端发送一个ICMP消息,提示对方其连接已经超时。同时,接收端将更新其本地的超时计数器,准备在未来的时间周期再次尝试连通。 ### 实现TCP Keep-alive的方式 #### 服务器端: 对于服务器端,通常不需要显式配置TCP Keep-alive,因为在Linux和其他Unix系统上默认已经启用了此功能。但为了确保TCP Keep-alive能正常工作,可以调整相关的设置,例如增加`TIME_WAIT`超时时间或者更改接收数据的等待时间。 #### 客户端: 客户端需要更直接地与服务器协商开启TCP Keep-alive。这通常在建立连接的握手过程中进行,可以通过HTTP请求头或者其他特定于应用层的消息来实现。例如,在HTTP协议中,可以使用特定的HTTP版本或者自定义头部信息来触发Keep-alive机制。 ### 应用场景 TCP Keep-alive特别适用于需要长时间保持连接的应用,比如Web服务、文件传输协议(FTP)、远程桌面协议(RDP)以及其他任何依赖于持续连接的应用程序。它有助于提高系统的整体可用性和用户体验,避免因偶然的网络波动导致的意外断开连接。 ### 相关问题: 1. **TCP Keep-alive的配置方法是什么?** - 对于服务器,可以在运行时通过命令行参数或者配置文件来调整`TIME_WAIT`超时时间; - 对于客户端,需要根据使用的应用程序或协议文档来了解如何启用或配置TCP Keep-alive。 2. **TCP Keep-alive在哪些情况下可能导致问题?** - 过短的`TIME_WAIT`超时时间可能会导致频繁的连接尝试; - 过长的超时时间则可能影响资源占用以及系统的响应速度。 3. **是否所有的网络环境下都适合使用TCP Keep-alive?** - 不一定。在高带宽、低延迟环境中,TCP Keep-alive可能是有益的;但在流量密集型网络或者对网络资源非常敏感的情况下,过多的Keep-alive操作可能会带来额外的网络负担。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值