前言:

当我们使用浏览器访问一个Web站点的时候,我们的电脑会和Web服务器建立一条HTTP的连接,那么在这个连接层面是否可以进行性能优化呢?下面我们要讲解的就是HTTP的长连接和短连接的相关知识。

HTTP连接和TCP连接

在OSI七层模型中,HTTP是应用层的协议,你很容易能得到这样的总结:HTTP长连接和短连接本质上指的是TCP的长连接和短连接,如果你感到惊讶,那么需要重新复习下数据的封装和解封装。

长连接

首先,我们先从长连接开始,因为从HTTP/1.1开始,默认使用长连接。而且主流浏览器和Web服务器默认情况下都使用的是HTTP/1.1。也就是说现在我们使用的浏览器再发起HTTP请求的时候默认会在请求头部告诉Web服务器,我要使用长连接。下面是我访问https://www.unixhot.com/浏览器发送的HTTP请求头信息,可以看到Connection: keep-alive。

本例中Web服务器是Nginx,默认开启了长连接,在http的配置段内设置了:

keepalive_timeout 60;

意思就是开启Nginx的长连接,超时时间为60秒。下面是Web服务器的响应:

在长连接的情况下,当一个网页打开后,客户端和服务器之间传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的资源,会继续使用这条已经建立的连接。

如果在长连接的情况下,你查看服务器的TCP连接可以看到一个TCP的socket,状态是ESTABLISHED。

[root@test conf]#netstat -na | grep  192.168.99.159:80tcp        0     0 192.168.99.159:80       192.168.99.50:24584     ESTABLISHED

还记得我设置的超时时间吗?keepalive_timeout 60;等过了60秒之后,再次查看这个socket的状态,你会发现已经转变为TIME_WAIT,而且在Linux系统中这个状态会持续60秒,在这期间这个Socket是不会被释放。也就是用户访问我们的服务器发起的一个HTTP请求,在Web服务器端会占用一个Socket的连接,加上TCP建立连接的时间要120多秒。

[root@test conf]#netstat -na | grep  192.168.99.159:80tcp        0     0 192.168.99.159:80      192.168.99.50:24584    TIME_WAIT

那么如果在大并发的Web服务器中,长连接会造成什么后果呢?有兴趣的读者,一定要试一试。

短连接

在HTTP/1.0中,默认使用的是短连接。浏览器和服务器每进行一次HTTP操作就建立一次连接,然后请求结束就直接中断连接。试想一下,我们一个普通页面如果有近百个Web资源(JavaScript、CSS、图片),那么浏览器每请求一次资源都会新建一个HTTP会话,而且我们也知道本质上就是每次会创建一个TCP连接,那么每次都要经历TCP的三次握手和四次挥手。

在HTTP短连接的状态下,浏览器和我们的Web服务器重复的进行下面的操作:

建立连接–>数据传输–>关闭连接

至少目前来看HTTP短连接显然是影响性能的,现在我把运行Nginx的Web服务器的长连接关闭,再来进行一次测试:

keepalive_timeout  0;#keepalive_timeout  60;

和我们预想的一样,在TCP层面的Socket并没有长期的处于ESTABLISHED状态。

[root@test conf]#netstat -na | grep  192.168.99.159:80tcp        0     0 192.168.99.159:80      192.168.99.50:26056     TIME_WAIT

HTTP长连接的优点

我们使用了HTTP长连接后,可以省去很多TCP建立和关闭的步骤,节省了时间。而且因为服务器同时打开的连接减少了,可以降低网络阻塞,提高了资源请求的速度,因为后续请求无需再建立连接,减少了三次握手。例如在静态资源服务器中,一个页面往往有很多静态资源如图片、css、js等,那么在Web服务器上开启长连接,可以提高页面的打开速度。

HTTP长连接的缺点

长连接真的就一定好吗?还记得我们前面测试的结果,长连接的状态下,一个Socket的存在时间是建立连接时间+ keepalive_timeout时间+ TIME_WAIT时间。那么如果在高并发的场景下,我们的Web服务器要同时保持大量的Socket连接,那么肯定是占用系统的资源。那么这个时候就要根据实际的情况来修改keepalive_timeout的值,直到一个合理的范围,那么这个需要根据自己的业务特点进行调整。

该如何抉择?

答案是:取决于Web应用的特点和具体需要。这是答案可能让很多人不太满意,但是事实便是如此。不过我可以给出一个生产实践的经验,那就是在大多数应用中应该是开启长连接,然后通过相关的测试,来确定长连接的超时时间,而不是使用网上文档写的某个时间。优化web,首先减少宽带传输,降低程序超时时间,提高访问效率。

c++ socket 连接超时_Web性能优化之-HTTP长连接相关推荐

  1. MySQL性能优化知识:长连接、短连接、连接池

    当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信.客户端必须使用数据库连接来发送命令和接收应答.数据.通过提供给客户端数据库的驱动指定连接字符串后,客户端就可以和数据库建立连接了. ...

  2. plsql保持长连接_知乎千万级高性能长连接网关是如何搭建的

    作者:@faceair @安江泽原文:https://zhuanlan.zhihu.com/p/66807833 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如 ...

  3. bootstrap外不引用连接_网络编程Netty IoT百万长连接优化,万字长文精讲

    IoT是什么 The Internet of things的简称IoT,即是物联网的意思 IoT推送系统的设计 比如说,像一些智能设备,需要通过APP或者微信中的小程序等,给设备发送一条指令,让这个设 ...

  4. 连接超时_记一次网络请求连接超时的事故

    点击上方蓝色字关注我们~前言 从HTTP请求超时.重试机制.操作系统网络等层面剖析了事故的原因,最终解决业务问题. 这里先抛两个问题: 1)你遭遇过由于网络连接或请求超时造成的生产事故吗? 2)你知道 ...

  5. 【错误记录】GitHub 提交代码失败、获取代码失败、连接超时、权限错误、ping 请求连接超时 ( 查找域名对应 IP | 设置 host 文件 )

    文章目录 一. 报错信息 二. 解决方案 ( 查找域名 ) 三. 解决方案 ( 测试 IP 地址 ) 四. 解决方案 ( 配置 hosts ) 网上有很多类似的解决方案 , 给出了一个 hosts 配 ...

  6. java模拟连接超时_Java:使用Toxiproxy模拟各种连接问题

    java模拟连接超时 用Toxiproxy和Java的HttpURLConnection模拟各种连接问题,以查看产生了什么样的错误:连接超时vs.读取超时vs.连接被拒绝-. 结果: 系统:openj ...

  7. 英雄联盟手游内测服务器维护,《英雄联盟手游》内测测试服连接超时解决方法 LOL手游国服连接超时如何解决...

    LOL手游国服连接超时怎么办?怎么解决?LOL手游现已开启了超然测试咯,不少玩家已经下载好游戏准备体验了,但是进入游戏却一直出现连接超时的情况呢,如何才能解决呢,这个情况遇到确实很麻烦呀,下面就给大家 ...

  8. finalshell连接超时怎么解决_电脑无线网络连接不上怎么回事 电脑连不上无线网络的解决方法...

    现在是一个网络多元化的时代,基本上家家户户都有电脑,用电脑就需要网络,今天我们要说的是无线网络,近日很多网络用户出现电脑连不上无限网络,又不知道如何处理,大家可以看看下面的电脑教程,帮你搞定无线网络连 ...

  9. php mysql长连接聊天室_PHP之探索MySQL 长连接、连接池

    PHP连接MysqL的方式,用的多的是MysqL扩展.MysqLi扩展.pdo_MysqL扩展,是官方提供的.PHP的运行机制是页面执行完会释放所有该PHP进程中的所有资源的,如果有多个并发访问本地的 ...

最新文章

  1. C++中类型转换函数:将当前类的类型转换为其它类型
  2. 【系统分析与设计】UML类图绘制方法(真の能看懂~!)
  3. XML Json
  4. javascript--弹出对话框 四种对话框 获得用户输入值 .
  5. ARP、Tracert、Route 与 NBTStat命令详解
  6. 牛客网-数据结构笔试题目(八)-离子能力跃迁问题求解
  7. 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
  8. 索尼PS5或9月9日开启预订:售价挺香,钱包捂好
  9. python shell 继承 环境变量_Python subprocess shell 丢失环境变量 | 学步园
  10. C语言函数多个返回值
  11. 如何让ul的符号隐藏_HTML+CSS之如何找BUG
  12. Java 集合系列09之 Map架构
  13. 5.Entity Framework Core 5.0 查询数据
  14. IOMMU简述-上篇
  15. java 支持 超大上G , 多附件上传
  16. JUC并发编程学习笔记
  17. 帝国cms php循环,帝国cms 灵动标签 循环嵌套
  18. 树选择排序(Tree Selection Sorting)介绍
  19. Nginx正向代理和反向代理配置
  20. hdmi口不接显示器,teamviewer连接黑屏

热门文章

  1. 常见的浏览器兼容问题
  2. [老男孩笔记系列]-之linux定时任务crontab命令详解
  3. TxQueryRunner-JDBC小工具
  4. 2016百度之星 - 初赛(Astar Round2B)解题报告
  5. [转载]hadoop集群默认配置和常用配置
  6. java.lang.IllegalArgumentException和org.apache.catalina.LifecycleException
  7. 关于redo(二)插入更新数据时的效率比较
  8. Cannot change version of project facet Dynamic Web Module to 2.5 问题的解决方法
  9. 指定用户 启动 进入 docker容器
  10. cve-2018-2628 Weblogic反序列化漏洞实现反弹shell