在此专栏《Java核心面试宝典》记录我们备战梦想的
【day 17】
!
今天我来和大家讲解一下HTTP协议中有关持久层连接和非持久层连接的几道常见面试题。
一、“持久连接(Keep-Alive)和非持久连接(非Keep-Alive)的区别,他们对服务性能有影响吗?”
在最早期的HTTP/1.0
中,**浏览器每次发起HTTP请求都要与服务器建立一个TCP连接,服务器完成请求处理之后就会立即断开这个TCP连接,**因此服务器并不会跟踪每一个用户,同时也不会记录之前的请求信息。然而创建和关闭连接是需要消耗大量的资源和时间的,为了减少资源的消耗,缩短响应的时间,就需要重用连接。
所以在之后的HTTP/1.1
版本中就默认使用持久连接
,而在之前的版本中默认使用的是非持久连接,
对于非Keep-Alive来说, 对于每一个浏览器请求,我们必须为每一个请求的对象建立和维护一个全新的连接,同时对于每一个这样的连接,客户机和服务器都要分配TCP的缓冲区和变量,这就给服务器带来了严重的负担,因为一台web服务器可能服务数以百计的客户机请求,如果每一次请求对要不断的断开和重新建立连接,那么将会对服务器资源造成巨大的损失!
而在Keep-Alive方式下, 服务器响应后保持该TCP连接打开,这样在同一台客户机和服务器之间进行的后续请求和响应报文就都可以通过这个TCP连接传输,甚至位于同一台服务器的多个web页面在向同一个客户机发送时,可以在单个持久的TCP连接上进行。
我们可以通过下面这张图来表示Keep-Alive和非Keep-Alive连接。
但是对于Keep-Alive就没有缺点了吗?并不是的!
二、追问:如何避免持久连接时系统资源被无效占用?
当我们长时间保持TCP连接时容易造成系统资源被无效占用, 若对Keep-Alive模式配置不当,这样将可以会造成比非Keep-Alive方式更大的损失。因此我们需要正确的设置Keep-Alive timeout
参数,当TCP连接传送玩最后一个HTTP响应后,该连接会保持Keep-Alive_timeout
秒,之后断开并关闭这个连接!这样就会很好的避免系统资源被长时间无效的占用。
三、追问:那么如果使用了旧版本的HTTP,如何维持持久连接呢?
如果想要在旧版本的HTTP协议上维持持久连接,则需要指定connection
的首部字段为Keep-Alive
,来告诉对方这个请求完成后不要关闭,下一次还要使用这个连接进行通信。
四、HTTP长连接和短连接的使用场景是什么?
长连接: 长连接多用于操作频繁
,点对点的通讯
,而且客户端连接数目较少
的情况。如即时通讯、网络游戏等。
总结
蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。
经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
细答案,希望能帮助到大家。
[外链图片转存中…(img-Lxgr008z-1714155841283)]