zoukankan      html  css  js  c++  java
  • 【网络123】HTTP连接

    背景:项目遇到http连接中断问题,经调试

    参考:https://www.cnblogs.com/shoren/p/http-connection.html

    HTTP短连接(非持久连接)是指,客户端和服务端进行一次HTTP请求/响应之后,就关闭连接。所以,下一次的HTTP请求/响应操作就需要重新建立连接。
    HTTP长连接(持久连接)是指,客户端和服务端建立一次连接之后,可以在这条连接上进行多次请求/响应操作。持久连接可以设置过期时间,也可以不设置。

    以HTTP1.1协议为例子:

    设置HTTP短连接

    在首部字段中设置Connection:close,则在一次请求/响应之后,就会关闭连接。

    设置HTTP长连接,有过期时间

    在首部字段中设置Connection:keep-alive 和Keep-Alive: timeout=60,表明连接建立之后,空闲时间超过60秒之后,就会失效。如果在空闲第58秒时,再次使用此连接,则连接仍然有效,使用完之后,重新计数,空闲60秒之后过期。

    设置HTTP长连接,无过期时间

    在首部字段中只设置Connection:keep-alive,表明连接永久有效。

    然而,问题来了。在请求头中设置Connection:keep-alive,为什么连接空闲一段时间之后,还是断开了呢?

    这是因为http连接保持时间是由服务端的消息头connection字段和keep-alive字段定的HTTP操作是请求/响应成对出现的,即先有客户端发出请求,后有服务端处理请求。所以,一次HTTP操作的终点操作在服务端上,关闭也是由服务端发起的。

    区别:补充

    • TCP长短连接
      在网上搜资料的时候,看到很多“HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接”。 HTTP和TCP是不同两层的东西,它们怎么会是一样的呢?HTTP是请求/响应模式的,就是说我们发一个请求一定要有一个回应。最直观的就是,浏览器上发请求,得不到响应就会一直转圈圈。 而TCP并不是一定要有响应。大家以前使用socket模拟一个IM聊天,A跟B打完招呼,完全可以不用等待B的回应,就自己关掉连接的。

    • TCP keep-alive
      另外还有HTTP协议的keep-alive和TCP的keep-alive含义是有差别的。HTTP的keep-alive是为了维持连接,以便复用连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高http服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。但是,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。

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

  • 相关阅读:
    easyui combo自动高度(下拉框空白问题)
    log4net
    asp.net mvc 生成条形码
    Kubernetes 初探
    美国最顶级的投资机构在关注什么
    Ansible--01
    第一章 进入java的世界
    正则表达式
    zabbix接口调用注意事项--Python
    Docker+K8S实践
  • 原文地址:https://www.cnblogs.com/cathygx/p/13553927.html
Copyright © 2011-2022 走看看