什么是长连接和短连接
短连接 就是客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会复用同一个 TCP 通道,直到客户端心跳检测失败或服务器连接超时。
短连接过程如下:
- 发起请求连接->传输数据->关闭连接
长连接过程如下:
- 发起请求连接->传输数据->保持连接 -> 传输数据-> ... ->关闭连接。
简而言之,若没有数据传输也要保持TCP连接,就是长连接,反之就是短连接。
为什么要引入keep-alive?
在早期的HTTP/1.0中,每次http请求都要创建一个连接,而创建连接的过程需要消耗资源和时间,为了减少资源消耗,缩短响应时间,就需要重用连接。在后来的HTTP/1.0中以及HTTP/1.1中,引入了重用连接的机制,就是在http请求头中加入Connection: keep-alive来告诉对方这个请求响应完成后不要关闭,下一次咱们还用这个请求继续交流。协议规定HTTP/1.0如果想要保持长连接,需要在请求头中加上Connection: keep-alive。
什么是kepp-alive?
Keep-Alive 是一个通用消息头,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。
备注: 需要将 The Connection 首部的值设置为 "keep-alive" 这个首部才有意义。同时需要注意的是,在 HTTP/2 协议中, Connection 和 Keep-Alive 是被忽略的;在其中采用其他机制来进行连接管理。
keep-alive的优点:
• 较少的CPU和内存的使用(由于同时打开的连接的减少了)
• 允许请求和应答的HTTP管线化
• 降低拥塞控制 (TCP连接减少了)
• 减少了后续请求的延迟(无需再进行握手)
• 报告错误无需关闭TCP连
http管线化
HTTP管线化(英语:HTTP pipelining)是将多个HTTP请求(request)整批提交的技术,而在发送过程中不需先等待伺服端的回应。
请求结果管线化使得 HTML 网页加载时间动态提升,特别是在具体有高延迟的连接环境下。
管线化机制须透过永久连线(persistent connection)完成,并且只有 GET 和 HEAD 等要求可以进行管线化,非幂等的方法,例如POST将不会被管线化。连续的 GET 和 HEAD 请求总可以管线化的。一个连续的幂等请求,如 GET,HEAD,PUT,DELETE,是否可以被管线化取决于一连串请求是否依赖于其他的。此外,初次创建连线时也不应启动管线机制,因为对方(服务器)不一定支持 HTTP/1.1 版本的协议。
HTTP 管线化同时依赖于客户端和服务器的支持。遵守 HTTP/1.1 的服务器支持管线化。这并不是意味着服务器需要提供管线化的回复,而只是要求在收到管线化的请求时候不会失败。