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的源码。


加强表述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值