Hello,你好呀,我是灰小猿 !一个超会写bug的程序猿! 用坚持缔造技术、用指尖敲动未来! 和很多小伙伴们一样,我也是一名奔波在Java道路上的“创造者 ”。也想靠技术来改未来,改变世界!因为我们坚信每一次敲动键盘都能让生活变得更智能、世界变得更有趣 ! 在此专栏《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长连接和短连接的使用场景是什么?
长连接: 长连接多用于操作频繁 ,点对点的通讯 ,而且客户端连接数目较少 的情况。如即时通讯、网络游戏等。
短连接: 用户数目较多 的web网站通常使用短连接,例如京东、淘宝这样的大型网站一般客户端数量达到千万级甚至上亿,若使用长连接势必会造成大量的资源被无效占用,所以一般使用短连接,请求处理完成即关闭!
今日总结
今天的文章主要和大家讲解了HTTP协议的持久连接和非持久连接的区别和使用,我们需要了解持久连接和非持久连接的特点 ,两者之间如何转换 。使用场景 等。
如果小伙伴们有遇到其他相关的面试题,欢迎在评论区留言提出,我会把大家提出的总结到文章内, 欢迎小伙伴们一起评论区打卡学习!小伙伴们可也在左方加我好友一起探讨学习!
我是 灰小猿 ,我们下期见!
|