在HTTP/1,0时期,每次HTTP请求都会创建一个新的TCP连接,请求完成之后这个TCP连接就会关闭。这种通信模式的效率不高,所以在HTTP/1.1中,引用了HTTP长连接的概念,使用长连接的HTTP协议,会在响应头加入Connection:keep-alive。这样当浏览器完成一次请求后,浏览器和服务器之间的TCP连接不会关闭,再次访问这个服务器上的网页时,浏览器会继续使用这一条已经建立的连接,也就是说两个请求可能共用一个TCP连接。
HTTP的特点是无状态的,多个请求之间是没有关系的,这是不是矛盾了?
HTTP的无状态是指不同请求间协议内容无相关性,即本次请求与上次请求没有内容的依赖关系,本次响应也只针对本次请求的数据,至于服务器应用程序为用户保存的状态是属于应用层,与协议是无关的。
keep-alive表示tcp的连接可以复用,指的是利用已有的传输通道进行http协议内容的传输,省去创建/关闭连接的开销达到提升性能的效果。应用程序其实一般不关心这次HTTP请求的TCP传输细节,只关心HTTP协议的内容,因此只有复用TCP连接时做好必要的数据重置,是不算有状态的。
通俗的来讲:
http1.0:买一个信封只能传送一个来回的信。
http1.1:keep-alive买一个信封可以重复使用,但前提是得等到服务端把这个信封送回来。