c++ socket 连接超时_Web性能优化之-HTTP长连接
前言:
当我们使用浏览器访问一个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长连接相关推荐
- MySQL性能优化知识:长连接、短连接、连接池
当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信.客户端必须使用数据库连接来发送命令和接收应答.数据.通过提供给客户端数据库的驱动指定连接字符串后,客户端就可以和数据库建立连接了. ...
- plsql保持长连接_知乎千万级高性能长连接网关是如何搭建的
作者:@faceair @安江泽原文:https://zhuanlan.zhihu.com/p/66807833 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如 ...
- bootstrap外不引用连接_网络编程Netty IoT百万长连接优化,万字长文精讲
IoT是什么 The Internet of things的简称IoT,即是物联网的意思 IoT推送系统的设计 比如说,像一些智能设备,需要通过APP或者微信中的小程序等,给设备发送一条指令,让这个设 ...
- 连接超时_记一次网络请求连接超时的事故
点击上方蓝色字关注我们~前言 从HTTP请求超时.重试机制.操作系统网络等层面剖析了事故的原因,最终解决业务问题. 这里先抛两个问题: 1)你遭遇过由于网络连接或请求超时造成的生产事故吗? 2)你知道 ...
- 【错误记录】GitHub 提交代码失败、获取代码失败、连接超时、权限错误、ping 请求连接超时 ( 查找域名对应 IP | 设置 host 文件 )
文章目录 一. 报错信息 二. 解决方案 ( 查找域名 ) 三. 解决方案 ( 测试 IP 地址 ) 四. 解决方案 ( 配置 hosts ) 网上有很多类似的解决方案 , 给出了一个 hosts 配 ...
- java模拟连接超时_Java:使用Toxiproxy模拟各种连接问题
java模拟连接超时 用Toxiproxy和Java的HttpURLConnection模拟各种连接问题,以查看产生了什么样的错误:连接超时vs.读取超时vs.连接被拒绝-. 结果: 系统:openj ...
- 英雄联盟手游内测服务器维护,《英雄联盟手游》内测测试服连接超时解决方法 LOL手游国服连接超时如何解决...
LOL手游国服连接超时怎么办?怎么解决?LOL手游现已开启了超然测试咯,不少玩家已经下载好游戏准备体验了,但是进入游戏却一直出现连接超时的情况呢,如何才能解决呢,这个情况遇到确实很麻烦呀,下面就给大家 ...
- finalshell连接超时怎么解决_电脑无线网络连接不上怎么回事 电脑连不上无线网络的解决方法...
现在是一个网络多元化的时代,基本上家家户户都有电脑,用电脑就需要网络,今天我们要说的是无线网络,近日很多网络用户出现电脑连不上无限网络,又不知道如何处理,大家可以看看下面的电脑教程,帮你搞定无线网络连 ...
- php mysql长连接聊天室_PHP之探索MySQL 长连接、连接池
PHP连接MysqL的方式,用的多的是MysqL扩展.MysqLi扩展.pdo_MysqL扩展,是官方提供的.PHP的运行机制是页面执行完会释放所有该PHP进程中的所有资源的,如果有多个并发访问本地的 ...
最新文章
- C++中类型转换函数:将当前类的类型转换为其它类型
- 【系统分析与设计】UML类图绘制方法(真の能看懂~!)
- XML Json
- javascript--弹出对话框 四种对话框 获得用户输入值 .
- ARP、Tracert、Route 与 NBTStat命令详解
- 牛客网-数据结构笔试题目(八)-离子能力跃迁问题求解
- 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
- 索尼PS5或9月9日开启预订:售价挺香,钱包捂好
- python shell 继承 环境变量_Python subprocess shell 丢失环境变量 | 学步园
- C语言函数多个返回值
- 如何让ul的符号隐藏_HTML+CSS之如何找BUG
- Java 集合系列09之 Map架构
- 5.Entity Framework Core 5.0 查询数据
- IOMMU简述-上篇
- java 支持 超大上G , 多附件上传
- JUC并发编程学习笔记
- 帝国cms php循环,帝国cms 灵动标签 循环嵌套
- 树选择排序(Tree Selection Sorting)介绍
- Nginx正向代理和反向代理配置
- hdmi口不接显示器,teamviewer连接黑屏
热门文章
- 常见的浏览器兼容问题
- [老男孩笔记系列]-之linux定时任务crontab命令详解
- TxQueryRunner-JDBC小工具
- 2016百度之星 - 初赛(Astar Round2B)解题报告
- [转载]hadoop集群默认配置和常用配置
- java.lang.IllegalArgumentException和org.apache.catalina.LifecycleException
- 关于redo(二)插入更新数据时的效率比较
- Cannot change version of project facet Dynamic Web Module to 2.5 问题的解决方法
- 指定用户 启动 进入 docker容器
- cve-2018-2628 Weblogic反序列化漏洞实现反弹shell