HTTP协议学习笔记---HTTP持久连接和如何正确地关闭HTTP连接

Http持久连接、非持久连接和pipeline连接 基本概念  持久连接:使用同一个TCP连接发送和接受 多个 http请求/应答;   非持久连接:一个TCP连接只能发送和接受 一个 http请求/应答;持久连接的两种类型keep-alive机制(http1.0) keep-alive握手过程如下: HTTP/1.0+支持keep-alive连接,但默认并未激活。客户端通过发送一个包含Connection: Keep-Aliv 阅读详情

HTTP协议学习笔记---HTTP持久连接和如何正确地关闭HTTP连接

一,持久连接

什么是持久连接?对于HTTP协议而言,它是基于请求响应模型,Client向Server发请求时,先建立一条HTTP连接,Server给Client响应数据后,连接关闭。

当Client发送下一个请求时,需要重新再建立HTTP连接,这种方式就是:一个请求响应需要占用一条HTTP连接。而持久连接就是:只需要建立一条连接,然后在这条连接上 传输多个请求和响应。

与持久连接相关的字段

HTTP1.0中有一个Connection首部字段,它是一个逐跳首部字段。Connection:Keep-Alive,表示希望将此条连接作为持久连接。

HTTP1.1中,建立的HTTP请求默认是持久连接的。当Client确定不再需要向Server发送数据时,它可以关闭连接,即在发送首部中添加Connection:Closed字段。

 

二,如何提高HTTP请求的处理速度

①并行连接

Client一次向Server请求建立多个HTTP连接,每个HTTP连接上发一个请求,这样就可以并行地发多个请求获取响应数据。

比如,访问某个web页面,它上面有4幅图片,这些图片存储在不同的服务器上。那可以同时向服务器发4个HTTP请求去获取这四幅图片,而不是串行地依次发HTTP请求先获得第一幅图片,然后再发第二个HTTP请求获得第二幅图片....

并行连接,显然增加了服务器端的压力,要求服务器能够承载大量的HTTP请求。

 

②持久连接

持久连接的一个最大的好处是:大大减少了连接的建立以及关闭时延。

HTTP连接是建立在TCP协议之上的,建立一条TCP连接需要三次握手,TCP连接关闭时需要四次挥手。这些都是需要时间的。

而在第一点中提到:持久连接就是:只需要建立一条连接,然后在这条连接上 传输多个请求和响应。那么,就不需要频繁地建立连接,当前也就消除了连接建立以及关闭的时延了。

如图:多个请求响应在一条连接内完成了。但是,这里也看出一个“缺点”,请求响应是顺序执行的。只有在请求1的响应收到之后,才会发送请求2,这就是持久连接与管道化连接不同的地方。

 

③管道化连接

什么是管道化连接?

 

显然,管道化连接是需要持久连接支持的。管道化连接是在持久连接的基础上,以“流水线”的方式发送请求:不需要等到请求1的响应到达Client,就可以发送请求2....

 

HTTP连接如何正确地关闭?

HTTP连接的关闭需要注意这两个问题:HTTP连接是双向的;HTTP请求的幂等性。

连接是双向的

TCP连接是双向的,TCP连接的发送端和接收端都分别有:发送缓冲区和接收缓冲区,它们对应着输出信道和输入信道。

在JAVA中,JDK类库  java.net.Socket 类的 close()方法会关闭整个TCP连接,即输入信道和输出信道都被关闭了。

另外,Socket类还提供了两个方法:shutdownInput() 和 shutdownOutput(),前者用来关闭输入信道,后者用来关闭输出信道。

若只关闭其中TCP连接中的一条信道,则称之为半关闭。

一般而言,关闭连接的输出信道总是安全的。当你确定 以后都没有数据要发送到对方时,你可以把你的输出信道关闭了。

关闭输入信道有风险,可能会导致:连接被对端重置。

比如,在 服务器刚好把输入信道关闭时,客户端向服务器发起了请求,那此时客户端就会收到一条“连接被重置”的报文。在这种情况下,客户端的操作系统就会把客户端中的接收缓冲区里面的数据都清空。如果,此时客户端的应用程序还未来得及从接收缓冲区中取走数据,那么以前发送请求获得的数据也都被清空了!

 

因此, 正确的关闭HTTP连接的方式是:(以Client的视角来描述)

Client先关闭自己的输出信道(Client不能把自己的输入信道关闭了)。

然后Client周期性地轮询自己的输入信道的状态(比如,读取数据时,是不是 已经读到的 流的结尾了),如果读到了 流的结束标识符,那意味着Server发过来的数据都已经收到了。

 

总之,对于HTTP连接的双方而言,当不再需要传输数据时,双方都先把自己的输出信道关闭了,然后读取输入信道中的流,如果读到了末尾(比如流结束符返回-1),那么就可以正常关闭HTTP连接了。

 

参考资料:

《HTTP权威指南》第四章

《图解HTTP》

标签:  HTTP

华为云Stack交付实战:从工勘到上线的全流程拆解 本文详细拆解华为云Stack交付全流程,从项目启动、工勘、LLD设计到硬件部署和软件安装,提供实战技巧与避坑指南。重点解析华为云Stack交付流程中的关键环节,如标准化工具使用、规范化文档管理和流程化协作,帮助团队高效完成从工勘到上线的复杂项目交付。 阅读详情

相关推荐

Conda报错急救指南:遇到Malformed version string ‘~‘怎么办?(附最新解决方案)

本文深度解析Conda报错`Malformed version string '~'`的根源与解决方案。该错误通常由版本字符串解析异常或Conda版本过旧引起。文章提供了从清理缓存、针对性升级到环境重建的完整修复流程,并强调了升级Conda至最新版本是解决此类`CondaValueError`问题的根本方法,帮助开发者高效恢复工作环境。

weixin_28835789的博客 646

Windows pid为4的进程占用80端口的解决办法

首先使用管理员模式打开CMD C:\Windows\system32>netstat -aon|findstr "80" TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4 会发现80端口被占用 使用teskkill C:\Windows\system32>taskkill /pid 4 -t -f错误: 无法终止 PID 120 (属于 PID 4 子进程)的进程。原因: 拒绝访问。错误: 无...

weixin_45140844的博客 4065

Simscape Multiboby学习笔记1——跟着官网学Multibody

文章目录一. 引言二. Simscape Multibody自学之路三. 本教程的目录 一. 引言 最近在倒腾Matlab的动力学仿真,起因是看到有人推荐Matlab的multbody模块,一经了解之下简直惊为天人。作为一名Matlab的小粉,看到这么好用的模块简直不要太开心,之前用simulink搭飞行器的仿真模型,虽然能够仿真看到六自由度位移,毕竟不能可视化,还是很不够直观,而且simulink仿真(以及更费力的脚本文件仿真)需要精确建模,模型不精确计算也是天差地别。而Multibody在具备其他动力学

qq_30267617的博客 8241

XAMPP安装运行Apache时80端口占用报错解决方法

NT kernel & System 占用占用80端口 1、自己安装xampp完启动Apache 和MySQL时报错信息如下: Port 80 in use by “Unable to open process” with PID 4! Apache WILL NOT start without the configured ports free! You need to uninstal...

Cindy 1681

LangChain学习及应用(超详细)

Model I/O 部分是与语言模型进行交互的核心组件,包括输入提示(Prompt Template)、调用模型(Model)、输出解析(Output Parser)。简单来说,就是输入、处理、输出这三个步骤。LLM 因其具有海量参数,需要花费相当的物力与时间成本进行预训练和微调,同时商用 LLM 还需要进行各种安全测试与风险评估等。因此 LLM 会存在知识滞后的问题。在专有领域,LLM 无法学习到所有的专业知识细节,因此在面向专业领域知识的提问时,无法给出可靠准确的回答。

weixin_39764056的博客 4235

从硅片到时钟:揭秘SiTime MEMS谐振子的精密制造之旅

本文深入解析了SiTime MEMS谐振子的精密制造工艺,从硅晶圆的提纯到DRIE深硅刻蚀,再到真空封装技术,揭示了其如何克服传统石英晶振的局限。通过对比测试数据,展示了MEMS谐振子在精度、可靠性和生产效率上的显著优势,特别是在5G基站和汽车电子等领域的应用潜力。

weixin_42522953的博客 401

requests 超时关闭_如何终止在C#中的HttpWebRequest连接?它不工作,即使设置超时或readwritetimeout...

I want to terminate a httpwebrequest when it takes too long time in connection.Here is just a simaple code that I wrote:HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);request.Timeout ...

weixin_39746282的博客 566

博途S7-1200与昆仑通态MCGS纯仿真联调实战指南

本文详细介绍了博途S7-1200与昆仑通态MCGS纯仿真联调的实战指南,包括环境搭建、配置步骤、通信桥接及故障排除。通过TIA Portal和MCGS Pro搭建的仿真环境,可实现80%以上的基础功能验证,适用于工业自动化学习和开发,大幅降低硬件投入成本。

weixin_26834815的博客 439

HTTP协议学习笔记四

HTTP请求响应是一条一条顺序执行的 并行连接: Client一次向Server请求建立多个HTTP连接,每个HTTP连接上发一个请求,这样就可以并行地发多个请求获取响应数据。 比如,访问某个web页面,它上面有4幅图片,这些图片存储在不同的服务器上。那可以同时向服务器发4个HTTP请求去获取这四幅图片,而不是串行地依次发HTTP请求先获得第一幅图片,然后再发第二个HTTP请求获

Benjaminevil的博客 393

YOLOv12改进策略【损失函数篇】| 替换Powerful-IoU(PIoU),增强对中等质量锚框的关注力,引导锚框更直接、高效地回归

本文针对现有基于IoU的损失函数在目标检测任务中存在的问题,提出了利用Powerful-IoU(PIoU)及其升级版PIoU v2改进YOLOv12的损失函数,以提高模型精度。文章详细介绍了PIoU和PIoU v2的结构原理,并提供了在YOLOv12中实现这些损失函数的具体步骤和代码修改方法。

Limiiiing的博客 931

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

本文介绍了如何将C#游戏开发中的代码从单个.cs文件拆分到多个.cs文件中,以提升代码的可维护性和可读性。文章演示了在Visual Studio中创建Hero类和ShowInfo类的具体步骤:通过右键项目名添加新建类,将原有代码分别剪切到对应的类文件中,并自动生成命名空间。拆分后需要在Program.cs中通过"using"指令引用这些类,最后通过运行测试验证功能正常。这种模块化代码组织方式能有效解决单一文件代码过长、结构混乱的问题。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1136

HTTP非持久连接和持久连接详解

10.1.5 HTTP非持久连接和持久连接 https://blog.youkuaiyun.com/dac55300424/article/details/22671399 HTTP既可以使用非持久连接(nonpersistent connection),也可以使用持久连接(persistent connection)。HTTP/1.0使用非持久连接,HTTP/1.1默认使用持久连接。 1.非持久连接 让我...

weixin_41438466的博客 4583

使用abagen工具箱获取基于脑区的基因表达矩阵

脑区模板定义了您感兴趣的脑区的空间位置。abagen提供了一些预定义的脑区模板,您可以选择使用,也可以使用自定义的脑区模板。它提供了一种简便的方式来获取基于脑区的基因表达矩阵。abagen需要使用Allen脑图谱数据来获取基因表达矩阵。您可以使用abagen内置的下载功能来获取这些数据。这就是使用abagen工具箱获取基于脑区的基因表达矩阵的详细步骤。通过按照上述步骤操作,您可以轻松获取并使用Allen脑图谱数据中的基因表达信息。一旦您加载了脑区模板,您可以使用abagen来获取基于脑区的基因表达矩阵。

web_bug407的博客 1326

面试题:每发送一个http请求就要建立一个tcp连接吗(非持久连接/持久连接)

文章目录一、非持久连接和持久连接二、TCP 连接中多个 HTTP 请求可以并行发送吗?三、一个TCP连接可以发送多少个HTTP请求问题? 一、非持久连接和持久连接 非持久连接:HTTP/1.0 中 的首部字段Connection 默认值为 close,即每次请求都会重新建立和断开 TCP 连接。 持久连接:HTTP/1.1 中 的首部字段 Connection 默认值为 keep-alive ,连接可以复用,只要发送端、接收端都没有提出断开连接,则保持tcp连接状态。 http1.1中,所有的连接默认为

森明帮大于黑虎帮的博客 7824

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HTTP长连接、短连接、持久连接

为保持和HTTP/1.0的兼容性, 包含报文体的HTTP/1.1请求必须包含合法的Content-Length头域,除非明确知道服务端是HTTP/1.1兼容的.如果请求包含消息体, 而没有Content-Length域,那么如果服务端无法确定消息长度时,它会返回400(无效请求),或者坚持获取合法Content-Length 而返回411(要求包含长度).持久连接对关闭TCP连接的行为提供信号量机制支持。同样的,HTTP/1.1客户端可以期望连接是持久的,除非如前所述收到表示连接关闭的应答。

xinyuerr的博客 982

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

持久性连接和非持久性连接

持久性连接和非持久性连接 文章目录持久性连接和非持久性连接非持久性连接round-trip time(RTT)往返时间三次握手(three-way handshake)持久性连接的HTTP 下面依然研究client-server体系结构的网络应用 当网络应用的客户端和服务器端建立在TCP之上的时候,应用开发者需要做出一个决定: 是每个请求/响应对应该被发送通过一个单独的TCP连接吗?------非...

Chenglin(Ben) Yu's Miracle 3046

HTTP首部——分块传输和持久连接

前言: 最近写了几篇博客,讲解了几个HTTP首部,感觉自己对于知识的理解还行。现在让我们来了解以下分块传输和持久连接的概念吧。本来,我是不准备写关于持久连接的部分的,因为我都是使用socket模拟的短连接,基本用不上持久连接。但是当我使用分块传输的时候,它有一个特点。因为不适用分块连接的话,默认是有一个Content-Length首部的,但是使用了分块传输的话,就没有这个首部了。这样我的程序就很难终止了(但是也是有方法的)。所以,索性就一起都写入博客了! 分块传输 分块编码是属于传输编码这个范围的,不过我也

qq_40734247的博客 6285

HTTP协议详解---持久连接与非持久连接

 最近写作完HTTP协议一节,略做总结:非持久连接是在http/1.0中定义,而对于http/1.1中默认的是持久连接(带流水线),以下是详细描述:非持久连接”的概念  某网页由最基本的 HTML 和10个JPEG 图像构成,10个JPEG 图像文件存放在同一台服务器中。设这个网页的URL为www.server.com/somepath/index.html。如果用户请求该网页并采用“非持久连接”...

五谷杂粮 3386

HTTP协议:持久连接、非持久连接

一、HTTP持久连接、非持久连接1.1 定义    1. 非持久连接:每个连接处理一个请求-响应事务。    2. 持久连接:每个连接可以处理多个请求-响应事务。        持久连接情况下,服务器发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。      3. HTTP/1.0 使用非持久连接。     HTTP/1.1 默认使用持久连接。1.2 ...

neninee的博客 2万+

HTTP长连接,短链接,持久连接的区别

什么是Http长连接 长连接定义: client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于P2P点对点的通信。 长连接的操作步骤是:建立连接——数据传输...(保持连接)...数据传输——关闭连接长连接适用场景: 监控系统:后台硬件热插拔、LED、温度、电压发生变化; 即时通信系统:其它用户登录、发送信息; 即时报价...

有没有兴趣和我一起去拯救地球啊 2422
上一篇: 为什么会需要消息队列(MQ)?
下一篇: HTTP权威指南:1.5报文
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值