关于keep-alive这个东西,是否要开放,对性能究竟有何影响,目前大家估计也都是从经验方面来设置的,没有从理论层面的讨论,今天我来挖个坑,希望大家踊跃往里跳。
简单整理一下问题要点:
1,keep-alive的工作原理是什么,能解决什么问题?
2,web server设置了keep-alive,是否需要下级协议盏的支持才起作用?例如是否要启用tcp/ip的keep alive机制?
3,web server设置了keep-alive,是否要客户端浏览器有相应支持?是否要客户端协议盏的支持?如果要得话,我们通常使用的各种系统以及各种浏览器支持的情况怎样?
4,keep-alive会带来性能提升吗?具体体现在什么方面?例如可承载高并发访问?或者是可提升传输性能?再或者可减轻服务器压力?在低访问量和高访问量情况下有何区别?
就我个人的理解来看,keep-alive是利用了tcp的双向全双工连接特性,在web-server端可以不断开连接,来接受客户端更多的请求,应该是能够改善连接时间,不过似乎在连接非常多的情况下会大大加重服务器负担,需要tcp/ip协议盏支持,并且不同客户端之间有不同的设定,具体细节还不详。
楼上的文章受教了,简单说就是从http协议的情况来看,默认1.0是关闭的,需要在http头加入Connection: Keep-Alive才能发起keep-alive的连接,而http1.1协议默认启用keep-alive,如果加入Connection: close 则就强制关闭。
目前大部分浏览器都是用http1.1协议,也就是说默认都会发起keep-alive的连接请求了,所以是否能完成一个完整的keep-alive连接就看服务器设置情况。
我推测服务器返回的http头应该包含关于keep-alive的信息,回去抓包正是一下。
楼上的文章说我在网上找到的,事实上服务器确实会返回关于keep-alive的消息。最简单的方法,不需要任何额外的软件,你可以打开迅雷,随便下载一个文件,然后查看任务详情里面,他就有http请求和回应的header信息,从这个里面可以清楚的看到客户端在header设置了keep-alive,而服务器返回时也有这个header字段。
不过我刚开始还在担心一个问题,他是怎么保持连接的呢?既然说到http是无状态的,那server根本就不知道这个连接建立多久了,如果数据已经传送完毕,那客户端应该不会继续想server请求了吧?既然没有数据交互,也没有状态信息,那怎么保持甚至是结束这个连接呢?至少我在网上看到的答案是这个连接是不能保持很久的,一般最多空闲两分钟而已。这么来看还是可以接受的。
另外一个问题是,网上关于这方面的资料好像很少,至少中文的是这样,百度googlge不到。但是实际上《计算机网络--自顶向下方法与internet特色》这本书是讲得很清楚的。在中译本P60或原版P89就有十分详细生动的解释,这里没有时间把他写上来了。当然,书中的一个不足是没有在那里提到这个持久连接是在header中设置connection字段来实现的,当然了,这也是因为那个时候书上还没有讲到http header的结构。
有话要说