HTTP连接管理
TCP 连接
- 查询目标IP地址和端口号
- 发起TCP连接
- 浏览器发送请求报文
- 浏览器接收响应报文
- 浏览器断开TCP连接
上述的这些操作被称为一次 HTTP 事务。
HTTP over TCP over IP
TCP 连接的四个值
- 源IP
- 源端口
- 目标IP
- 目标端口
这四个值定义了一个TCP连接。
在浏览器中的一次http请求中,会产生一次TCP连接。
TCP 的连接优化
并行连接
同一个页面可以并行上百个请求,受限于客户端的带宽,一般不会超过6个。同时也要考虑服务器的并发数。
一般认为,并行连接,不太能优化连接,反而会增加连接的开销。
持久化连接
取决于浏览器多次请求同一个站点访问。HTTP/1.1 允许HTTP设备在事务处理之后,仍保持TCP连接状态。为下次的相同连接做准备。下一次的HTTP请求中会复用这个TCP连接。
需要注意的是,持久化连接持续的时间是需要控制的,不能在没有连接时,还在做持久化连接。这样会影响性能。
- 持久以及并行连接
一般认为,并行连接,不太能优化连接,反而会增加连接的开销。
持久化连接是可以优化性能的。
keep-alive 规范
HTTP/1.0 中的持久化连接
早期的HTTP协议(HTTP/1.0)中,实现了connection keepalive,将一条连接保持再打开状态。
server 对当前请求进行响应且在响应头中添加 Connection: keep-alive
,这个响应头告诉客户端,当前连接可以保持打开状态。而没有这个首部的话,客户端会在之后关闭连接。
Keep-Alive 的选项
keep-alive 可以有多种行为,这个是通过选项控制的。
1 | Connection: keep-alive |
- timeout: 服务器在发送完响应后,保持连接打开的时间。
- max: 服务器允许的最大请求数量。
HTTP/1.1 中的持久化连接
HTTP/1.1 取消了keep-alive 的支持。采用了 持久连接(persistent connection)。HTTP/1.1在默认情况下是支持的。
当发送 Connection close
代表着当前连接关闭。
管道化连接
HTTP/1.1 允许在持久化的基础上可选的使用管道。这代表着,如果要使用管道必须要在持久化的基础上。