http长连接的一些点

  1. http短连接,一般是服务器端主动关闭连接(历史原因 https://www.zhihu.com/question/24338653
  2. http 请求header头中通过Connection: 头字段来指定是否需要keep-alive。 其中http1.0和http1.1关于Connection头又有不同点
    1. http1.0不支持keepalive,所以发送头为Connection默认为closed(Connection: close)。 即告诉服务器发送完请求后服务器就主动断开连接(所以服务器会出现timewait)。 需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive
    2. http1.1 默认的Connection头就是keep-alive(即Connection: keep-alive),除非显式指定Connection: close。但具体是否建立长连接还要看服务器那边是否支持keep-alive,如果nginx(或apache)将keepalive关闭,则建立的还是短连接,服务器发送完请求后就关闭连接了。如果建立了长连接了,则具体应该有哪方主动关闭连接需要看情况(见4)
  3. Connection头具体值
    1. 请求:
      1. close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。
      2. keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。
    2. 响应:
      1. close(连接已经关闭)。
      2. keep-alive(连接保持着,在等待本次连接的后续请求)。
      3. Keep-Alive: timeout。这个值能够让一些浏览器主动关闭连接,这样服务器就不必要去关闭连接了。(见4)
  4. http 响应response头中的Connection字段的keepalive属性
    响应头Keep-Alive: timeout。这个值能够让一些浏览器主动关闭连接,这样服务器就不必要去关闭连接了
  5. 注意不同浏览器怎么处理“keep-alive”头
    1. MSIE和Opera忽略掉"Keep-Alive: timeout=<N>" header.
    2. MSIE保持连接大约60-65秒,然后发送TCP RST
    3. Opera永久保持长连接
    4. Mozilla keeps the connection alive for N plus about 1-10 seconds.
    5. Konqueror保持长连接N秒
  6. Http keepalive 和tcp keepalive的区别
    http keep-alive与tcp keep-alive,不是同一回事,意图不一样。http keep-alive是为了让tcp活得更久一点,以便在同一个连接上传送多个http,提高socket的效率。而tcp keep-alive是TCP的一种检测TCP连接状况的保鲜机制。tcp keep-alive保鲜定时器,支持三个系统内核配置参数: 
    /proc/sys/net/ipv4/tcp_keepalive_time
    /proc/sys/net/ipv4/tcp_keepalive_intvl
    /proc/sys/net/ipv4/tcp_keepalive_probes

    keepalive是TCP保鲜定时器,当网络两端建立了TCP连接之后,闲置idle(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务器内核就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。如果没有收到对方的回答(ack包),则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对对方的ack,如果一直没有收到对方的ack,一共会尝试 tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。如果尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP连接。TCP连接默认闲置时间是2小时,一般设置为30分钟足够了。

    也就是说,仅当nginx的keepalive_timeout值设置高于tcp_keepalive_time,并且距此tcp连接传输的最后一个http响应,经过了tcp_keepalive_time时间之后,操作系统才会发送侦测包来决定是否要丢弃这个TCP连接。一般不会出现这种情况,除非你需要这样做。
 
posted @ 2016-08-24 15:04  黑暗遊侠  阅读(3443)  评论(0编辑  收藏  举报