在nginx中,对于http1.0与http1.1是支持长连接的

我们知道,http请求是基于TCP协议之上的,那么,当客户端在发起请求前,需要先与服务端建立TCP连接,而每一次的TCP连接是需要三次握手来确定的,如果客户端与服务端之间网络差一点,这三次交互消费的时间会比较多,而且三次交互也会带来网络流量。当然,当连接断开后,也会有四次的交互,当然对用户体验来说就不重要了。而http请求是请求应答式的,如果我们能知道每个请求头与响应体的长度,那么我们是可以在一个连接上面执行多个请求的,这就是所谓的长连接,但前提条件是我们先得确定请求头与响应体的长度。对于请求来说,如果当前请求需要有body,如POST请求,那么nginx就需要客户端在请求头中指定content-length来表明body的大小,否则返回400错误。也就是说,请求体的长度是确定的,那么响应体的长度呢?先来看看http协议中关于响应body长度的确定:

  1. 对于http1.0协议来说,如果响应头中有content-length头,则以content-length的长度就可以知道body的长度了,客户端在接收body时,就可以依照这个长度来接收数据,接收完后,就表示这个请求完成了。而如果没有content-length头,则客户端会一直接收数据,直到服务端主动断开连接,才表示body接收完了。
  2. 而对于http1.1协议来说,如果响应头中的Transfer-encoding为chunked传输,则表示body是流式输出,body会被分成多个块,每块的开始会标识出当前块的长度,此时,body不需要通过长度来指定。如果是非chunked传输,而且有content-length,则按照content-length来接收数据。否则,如果是非chunked,并且没有content-length,则客户端接收数据,直到服务端主动断开连接。

从上面,我们可以看到,除了http1.0不带content-length以及http1.1非chunked不带content-length外,body的长度是可知的。此时,当服务端在输出完body之后,会可以考虑使用长连接。能否使用长连接,也是有条件限制的。如果客户端的请求头中的connection为close,则表示客户端需要关掉长连接,如果为keep-alive,则客户端需要打开长连接,如果客户端的请求中没有connection这个头,那么根据协议,如果是http1.0,则默认为close,如果是http1.1,则默认为keep-alive。如果结果为keepalive,那么,nginx在输出完响应体后,会设置当前连接的keepalive属性,然后等待客户端下一次请求。当然,nginx不可能一直等待下去,如果客户端一直不发数据过来,岂不是一直占用这个连接?所以当nginx设置了keepalive等待下一次的请求时,同时也会设置一个最大等待时间,这个时间是通过选项keepalive_timeout来配置的,如果配置为0,则表示关掉keepalive,此时,http版本无论是1.1还是1.0,客户端的connection不管是close还是keepalive,都会强制为close。

如果服务端最后的决定是keepalive打开,那么在响应的http头里面,也会包含有connection头域,其值是”Keep-Alive”,否则就是”Close”。如果connection值为close,那么在nginx响应完数据后,会主动关掉连接。所以,对于请求量比较大的nginx来说,关掉keepalive最后会产生比较多的time-wait状态的socket。一般来说,当客户端的一次访问,需要多次访问同一个server时,打开keepalive的优势非常大,比如图片服务器,通常一个网页会包含很多个图片。打开keepalive也会大量减少time-wait的数量。

摘取自     Nginx开发从入门到精通

Nginx中的长连接相关推荐

  1. Nginx中保持长连接的配置

    哎,老转载王了,原博客地址:https://www.cnblogs.com/kevingrace/p/9364404.html 在Nginx中,对于http1.0与http1.1是支持长连接的.htt ...

  2. 解决k8s中的长连接负载均衡问题

    目录 长连接与短连接: 简介 使用步骤 适用场景 当k8s遇上长连接: 问题描述 解决方案 长连接与短连接: 简介 长连接是指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数 ...

  3. Nginx优化之长连接/https/负载均衡

    关于keepalive 有时我们需要用到nginx的 反向代理 (比如:跨域),此时需要"长连接"!其注意事项有两点: 从client到nginx的连接是长连接 从nginx到se ...

  4. HTTP协议中的长连接和短连接(keep-alive状态)

    什么是长连接 长连接还是短连接 相比于短连接,长连接更节省资源.如果每发送一条消息就要创建链路.发起握手认证.关闭链路释放资源,会损耗大量的系统资源.长连接只在首次创建时或者链路断连重连才创建链路,链 ...

  5. app中的长连接与实现方式

    http://mrpeak.cn/blog/http2/   --- 原文 http2.0的好处不仅仅是multiplexing,请求压缩,优先级控制,server push等等都是亮点.  解决连接 ...

  6. 安卓中socket长连接和websocket长连接的实现

    现在一款成熟的app一般都会具备长连接推送功能,那么我们要想项目具备长连接的功能现在又两种选择的方案,一种基于原生tcp协议的socket长连接,另外一种基于ws协议的websocket的长连接,今天 ...

  7. nginx 代理tcp长连接短连接配置

    nginx使用ngx_stream_core_module模块代理tcp长连接短连接,可以增强服务器的容灾能力 下面是一个配置信息,自己也方便记录一下

  8. HTTP请求头中的长连接和短连接详解

    目录 顺子 长连接的作用 长连接的体现 TCP长连接流程 TCP短连接流程 长连接的使用场景 短连接的使用场景 如何判断长连接和短连接 Transfer-Encoding 顺子 项目中,发现一个问题, ...

  9. tcp协议中的长连接和短连接服务器,谈谈HTTP协议中的短轮询、长轮询、长连接和短链接...

    undefined 在之前总结 WebSocket 的时候就已经提到过短长轮询了~~今天看公众号文章,又把长短连接引进来一起分析.感觉这种总结很棒,那么我们一起看看呗 长短连接 听说长短连接的话,应该 ...

最新文章

  1. 重磅直播|GDR-Net:基于几何信息指导的单目6D物体姿态估计算法(CVPR2021作者开讲啦)...
  2. Solid Converter PDF
  3. 计算机中心防雷电安全措施,防雷电有哪些安全措施
  4. git连接jenkins_开普勒云平台:如何配置gitlab与Jenkins
  5. 绝对布局优势_前瞻布局+尖端科技+雄厚资金 恒大解锁造车的“正确姿势”
  6. mysql孤立锁_SQL Server解决孤立用户浅析
  7. LeetCode:螺旋矩阵【54】
  8. HTML5和Web前端有什么区别?具备HTML5技能的人薪资多少?
  9. c语言程序设计 高等教育,[高等教育]c语言程序设计.doc
  10. 鸿蒙升级后能恢复安卓吗,升级了鸿蒙系统怎么卸载鸿蒙系统?升级了鸿蒙还能用安卓吗?...
  11. Spark SQL 之开窗函数
  12. 关于磁碟机及Javqhc病毒
  13. 计算机网络中可使用的数据通信方式,计算机网络中的数据通信交换技术分析
  14. 计算机外存是ram硬盘还是,都是存储器,但RAM、ROM、闪存、硬盘怎么分?
  15. Ceph PG 归置组状态
  16. grub无法正常启动的解决方法
  17. fastadmin-addons使用
  18. 如何解决Win11系统显示你的账户已被停用
  19. 计算机专业自我简介50字,简历自我评价50字
  20. http://www.189qq.cn/soft?54563.htm

热门文章

  1. 基于微信小程序的自驾游拼团平台的设计与实现源码
  2. 它的出现将统一所有浏览器存储 API ?!
  3. Matlab制作GUI
  4. 用这个酷炫数据地图,老板口中别人家的可视化大屏你也能搞定
  5. vue3—elementPlus如何单独修改页面中的下拉框样式
  6. matlab调制解调开题报告,基于MATLB的数字调制与解调设计与仿真开题报告.doc
  7. DDA直线插补算法原理与实现(matlab)
  8. 雅可比矩阵 和 海森矩阵
  9. Morn UI 学习总结
  10. Android热更新技术的研究与实现Sophix