HTTP --tcp和keep-alive

news2024/7/6 18:19:48

TCP

TCP连接

tcp/ip是全球计算机以及网络设备都在使用的一种常见的分组交换网络分层协议集,客户端可以打开一条tcp/ip连接,连接到可能运行在世界各地的服务器应用程序,一旦连接建立起来了,在客户端和服务器的计算机之间交换的报文就永远不会丢失,受损或者失序。

TCP的可靠数据管道

HTTP连接实际上就是TCP连接以及使用规则,TCP连接是互联网上的可靠连接。
TCP为HTTP提供了一条比较靠谱的比特传输管道,从TCP连接一段填入字节会从另一端以原有的顺序,正确的表达出来。
在这里插入图片描述

TCP会按序,无差错的承载HTTP数据。

TCP流是分段的,由IP分组传送

TCP的数据是通过名为IP分组或者IP数据报的小数据块来发送的,安全版本就是在HTTP和TCP之间插入了一个TLS或者SSL密码加密层
HTTP要传送一个报文的时候,会以流的形式讲报文数据的内容通过一条打开的tcp连接按照时序传输。tcp收到数据流之后,会将数据流砍成叫做段的小数据块,所有的这些工作都是由tcp ip软件来处理的。程序员不会参与。
每个tcp段都是由ip分组承载,从一个ip地址发送到另一个ip地址的,每个ip分组包括

  • 一个ip分组首部
  • 一个TCP段首部
  • 一个TCP数据块
    ip首部包含了源和目的ip地址,长度和其他一些标记。tcp段的首部包含了tcp端口号,tcp控制标记,用于将数据排序和完整性检查的一些数字值。

保持tcp连接持续不断的运行

在任意时间计算机都可以由几条tcp连接处于被打开状态,tcp是通过端口号来保持所有这些连接持续不断的运行
tcp连接是通过4个值来识别的<源ip地址, 源端口号, 目的ip地址, 目的端口号>
两条不同的tcp连接不能拥有4个完全相同的地址组件值。但是不同的部分组件可以有相同的值。
在这里插入图片描述

用tcp套接字编程

在这里插入图片描述

套接字api允许用户创建tcp的端口数据结构,将这些端点与远程服务器的tcp端点进行连接,对数据流进行读写。
tcp的api隐藏了所有网络协议的握手细节,以及tcp数据流和ip分组的分段和重装细节
在这里插入图片描述

一旦建立了连接,客户端就会发送HTTP请求,服务器就会读取请求,一旦服务器获取了整条报文请求,就会对请求进行处理,执行所请求的动作,并将数据写回客户端,客户端读取数据,并对响应的数据进行处理

对tcp性能的考虑

HTTP紧挨着TCP,位于上层,所以HTTP事务的性能很大程序取决于底层tcp通道的性能。

HTTP事务的时延

在这里插入图片描述

建立TCP连接,以及传输请求和响应报文的时间相比,事务时间可能是很短的。除非客户端和服务器超载,或者正在处理复杂的动态资源。狗则http就是由tcp网络时延构成的。
HTTP事务的时延由以下几种原因

  1. 客户端首先需要根据URI确定出web服务器的ip地址和端口号,如果没有对URI中的主机名进行访问,通过DNS解析系统会将URI的主机名转换为一个ip地址,这个可能需要花费数10s的时间。
  2. 接下来,客户端会向服务器发送一条tcp连接请求,并等待服务器回送一个请求接受应答,每条tcp连接都会有连接建立时延,最多只有一二秒钟,但是如果是数百个HTTP事务的话,会叠加上去。
  3. 一旦建立起来了连接,客户端就会通过新建立的tcp管道来发送http请求,数据到达的时候,web服务器就会从tcp连接中读取报文,对请求进行处理。
  4. web服务器回送回HTTP响应,这个也需要花费时间。

性能聚焦的区域

  1. tcp连接建立握手
  2. tcp慢启动拥塞控制
  3. 数据聚集的Nagle算法
  4. 用于捎带确认的tcp延迟确认算法
  5. TIME_WAIT时延和端口耗尽

tcp连接的握手时延

如果建立一条新的tcp连接,甚至是发送任意的数据之前,tcp软件会交换一系列的ip分组,对连接的有关参数会进行沟通,如果连接只是用来传输少量的数据,这些交换过程就会降低http的性能

建立tcp的几个步骤

  1. 建立tcp连接时,客户端需要向服务器发送一个小的tcp分组,这个分组中有设置syn标记,表明是一个连接请求
  2. 如果服务器接受了请求,就会对参数进行计算,并向客户端返回一个分组,这个分组中的syn和ack都被置位,说明连接已成功
  3. 客户端向服务器回送一条确认信息,通知它连接已成功建立
    小的HTTP事务可能会在TCP建立上花费50%

延迟确认

每个tcp段都会有一个小的序列号和数据完整性校验和,每个段的接收者受到完整的段的时候,会像发送者会送小的确认分组,如果发送者没有再指定的窗口时间内受到确认的信息,发送者就会认为分组被损坏和损毁,重新发送数据。
延迟算法为了增强确认报文找到通向传输数据分组的可能性。延迟确认算法会在一个特定的窗口时间中将输出确认存放在缓存区中,以寻找能够捎带它的输出数据分组,如果在这个时间段内没有输出分组,就将确认信息放在单独的分组中去。如果没有输出分组,就会将确认信息放在单独的分组中传送。
HTTP具有双峰特征的请求——应答行为,降低了捎带信息的可能,延迟确认算法会引入相当大的时延。

tcp慢启动

tcp会随着时间提高传输的速度。用于防止因特网的突然过载和拥塞。
如果HTTP事务由大量的数据要发送,不能一次将所有的分组都发送出去,发送一个分组,等待确认,就可以发送两个分组,每个分组必须被确认。

Nagle算法和TCP_NODELAY

如果tcp发送了大量含有少量数据的分组,网络的性能就会严重的下降。 发送大量单字节分组的行为称为“发送端傻窗口综合症”。这种行为效率很低、违反社会道德,而且可能会影响其他的因特网流量
Nagle算法鼓励发送全尺寸的段,只有当所有其他分组都被确认之后,才会允许发送非全尺寸的分组。如果其他分组仍然在传输过程中,就将那部分数据缓存起来。只有当挂起分组被确认,或者缓存中积累了足够发送一个全尺寸分组的数据时,才会将缓存的数据发送出去
缺点: 1. 小的HTTP报文可能无法填满一个分组,可能会因为等待那些永远不会到来的额外数据而产生时延
TCP_NODELAY:http应用在自己的栈中设计参数,禁用这个算法,提高性能。但是要确保在tcp中写入大块的数据

TIME_WAIT累积和端口耗尽

当某个TCP端点关闭TCP连接时,会在内存中维护一个小的控制块,用来记录最近所关闭连接的IP地址和端口号,这类信息维持2MSL时间。
TIME_WAIT状态通常会持续2倍的最大报文段生存时间(2MSL),以确保在这段时间内不会创建具有相同地址和端口号的新连接。
当系统中存在大量的短连接时,每个连接在关闭后都会进入TIME_WAIT状态,导致TIME_WAIT状态的数量迅速增加。由于每个TCP连接都需要一个唯一的端口号,而端口资源是有限的,因此大量的TIME_WAIT状态可能会导致端口资源耗尽,从而影响新的连接的建立。

HTTP连接的处理

connection首部

http允许在客户端和最终的源服务器之间存在一串http中间实体,在某些情况下,http的connection首部字段中有一个由都好分割的连接标签列表,这些列表为连接指定了一些不会传播到其他连接中的选项。

  • HTTP首部字段名
  • 任意标签值,用于描述此连接的非标准的选项
  • close: 表示关闭这个持久连接。
    如果连接中包含了一个http首部字段的名称,那么这个首部字段中就包含了一些和连接有关的信息。
    在这里插入图片描述

http引用程序受到一条带有connection首部的报文的时候,接收端会解析发送端请求的所有选项。然后汇集报文转发给下一条的地址之前,删除connection首部和connnection中列出的所有首部。

串行事务处理时延

在这里插入图片描述

并行连接

并行连接可能会提高页面的加载速度

包含嵌入对象的组合页面能够克服单挑连接的空载时间和带宽限制,加载速度也会有所提高。如果单挑链接没有充分利用客户端的带宽,可以利用带宽分配来装载其他对象。
在这里插入图片描述

并行连接不一定更快

如果并行加载多个对象,每个对象都会竞争有限的带宽,每个对象都会以慢的速度比例加载。

持久连接

站点局部性: Web客户端倾向于对同一站点(或服务器)进行连续的、多次的访问
HTTP/1.1允许设备在事务处理结束后将tcp连接保持在打开状态,以便为未来的http请求重用现存的连接。这种tcp连接叫做:持久连接。非持久连接会在每个事务结束之后关闭。持久连接会在不同事务之间保持打开状态。

持久以及并行连接

每个事务打开或者关闭一条新的连接,会消耗时间和带宽。由于tcp的慢启动,每个新的连接的性能会有所降低。可以打开的并行连接数量是有限的。

Keep-Alive操作

HTTP/1.0 keep-alive连接的客户端可以包含connection: Keep-Alive首部请求保持一条连接在打开状态。
在这里插入图片描述

Keep-Alive选项

timeout: 估计了服务器希望将连接保持此连接的活跃时间
max:估计了服务器希望多少个事务保持此连接的活跃状态。
Keep-Alive:首部还可以支持任意未经处理的属性。
Keep-Alive首部是可选的,只有在提供connection: Keep-Alive之后才可以使用。

Keep-Alive连接的限制和规则

代理和网关必须执行Connection首部的规则,代理和网关在报文发出去或者是将其高速缓存之前,删除connection首部中命名的所有首部字段以及connection首部自身。

Keep-Alive和哑代理

客户端正在与一台web服务器对话,客户端可以发送要给connection: Keep-Alive首部来告知服务器保持连接的活跃状态,如果支持keep-alive,就返回要给Connection:Keep-Alive首部

  1. Connection首部和盲中继
  2. 代理和逐跳首部
插入Proxy-Connection

浏览器会向代理发送非标准的Proxy-Connection拓展首部,如果代理是盲中继,会将无意义的Proxy-Connection首部转发给web服务器,服务器会忽略此首部,不会带来任何问题,如果代理是比较聪明的代理,就会用一个Connection首部取代无意义的Proxy-Connection首部,然后将其发送给服务器。
但是现在网络总不可见的代理的情况变得越来越多,这些代理例如防火墙,拦截缓存。或者是反向代理服务器的加速带,这些设备对于浏览器是不可见的,所以浏览器不会将他们发送proxy-Connection首部
在这里插入图片描述

在这里插入图片描述

HTTP/1.1 持久连接

HTTP/1.1逐渐停止了对于Keep-alive连接的支持,用一种名为持久连接的改进型取代了他,持久连接的目的和keep-alive连接的目的是一样的,但是工作机制更加优秀。
HTTP/1.1持久连接在默认情况下是激活的,除非特别指明,否则假定所有的丽娜姐都是持久的,在事务处理结束之后将其关闭,http/1.1应用程序必须在报文中显示添加一个Connection: close首部,这是和之前的HTTP协议版本很重要的区别,在以前的版本中,keep-alive连接要么是可选的,要么就是不支持
http/1.1客户端假定在收到响应的时候,除非响应中包含了connection:close首部,不然http/1.1连接就会维持在打开状态,但是客户端和服务器任然可以随时关闭空闲的连接,不发送connection:close并不意味着服务器将永远保持在连接打开状态。

持久连接的限制和规则

在持久连接的使用中有如下的限制

  1. 发送了connection:close请求首部之后,客户端无法在那条连接上发送更多的请求
  2. 如果客户端不想再连接上发送其他请求,就应该再最后一条请求中发送connection:close
  3. 只有当连接上所有的报文都有正确的,自定义的报文长度的时候,也就是说实体主体部分的长度和响应的connection-length一直。或者是使用分块传输编码方式编码-连接才能够持久保持
  4. http/1.1的代理必须能够分别管理与客户端和服务器的持久连接-每个持久连接都适用于一跳传输。
  5. http/1.1代理服务器不应该与HTTP/1.0客户端建立持久连接,除非他们了解客户端的处理能力
  6. 尽管服务器不应该试图再传输保卫呢的过程中关闭连接,而且关闭连接之前至少应该响应一条请求,但是不管connection首部取了什么值,http/1.1设备都可以在任意时刻关闭连接。
  7. http/1.1应用程序必须能够用异步的关闭中恢复出来,只要不存在可能累计起来的副作用,客户端都应该重试这个请求。
  8. 除非重复发起的请求会产生副作用,否则在客户端收到整条响应之前关闭连接,客户端就必须重新发起请求
  9. 一个用户客户端对任何服务或者代理最多只能维护两条持久连接,防止服务器过载,代理需要更多到服务器的连接来支持并发用户的同行,所以如果有n个用户试图访问服务器的话,代理需要维持an跳到任意服务器或父代理的连接。

管道连接

http/1.1允许在持久连接上可选的使用请求管道,这个是相对于keep-alive连接的性能优化,在响应到达之前,可以将多条请求放入队列,当第一条请求通过网络发送到服务器的时候,第二条第三条可以开始发送了,在高时延的网络条件下,这样可以做到降低网络的环回时间,提高性能

对管到化连接的限制
  1. 如果http客户端无法确认连接是持久的,就不应该使用管道
  2. 必须按照与请求相同的顺序回送HTTP响应,HTTP报文中没有序列号标签,因此如果收到的响应失序了,就没有半分和请求匹配起来了
  3. HTTP客户端必须做好连接会在任意时刻关闭的设备,还要准备好重发所有未完成的管道化请求,如果客户端打开了一条持久连接,并立即发送了10跳请求,服务器可能在只处理了5跳请求后关闭连接,剩下的五跳请求会失败,客户端必须能够应对这些过早关闭的情况,并重新发送这些请求
  4. HTTP客户端不应该用管道化的方式发送回产生副作用的请求,出错的时候,管道化会阻塞客户端了解服务器执行的是一系列管道化的请求中的拿一些,由于无法重试post这样的非幂等请求,所以出错的时候,就存在某些方法永远不会执行的风险。
    在这里插入图片描述

关闭连接的奥秘

HTTP应用程序可能在金国任意一段时间后,关闭持久连接,但是服务器永远都无法去饿顶在关闭空闲连接的那一刻,在线路的那一头有没有数据要发送,如果出现这种情况,客户端就会在写入半截请求报文的时候发现出现了连接错误

Content-Lenght以及截尾操作

客户端或者代理收到一条随链接关闭而结束的HTTP响应而且实际传输的实体长度与content-length不匹配,接收端就应该被之一长度的正确性
如果接收端是个缓存代理,接收端就不应该缓存这条响应,已降低今后潜在的错误报文混合起来的可能,代理因该将有问题的报文原封不动的转发出去,而不应该试图去矫正content-length,维护语义的透明性

连接关闭容限,重试以及幂等性

就算是在非错误的情况下,连接也可以在任意时刻关闭,http应用程序要做好正确处理非预期关闭的准备,如果在客户端执行事务的过程中,传输连接关闭了,那么除非事务处理会带来一些副作用,否则客户端就应该重新打开连接,并重试一次。
如果一个事务,不管执行一次或者多次,得到的结果都是相同的,那么这个事务就是幂等的,客户端不应该以管道化的方式发送非幂等请求,否则传输连接的过早终止就会造成不确定的后果,要发送一些费米等请求,就需要等待来自前一条请求的响应状态

正常关闭连接
完全关闭和半关闭

应用程序可以关闭tcp输入和输出信道中的任意一个,或者将两者都关闭。套接字调用close接口会将tcp连接的输入和输出信道都关闭,这称为完全关闭,调用shutdown接口单独关闭输入或者输出信道,称为半关闭

TCP关闭以及重置错误

简单的http应用程序可以只使用完全关闭,但是当应用程序开始和很多其他类型的http客户端,服务器以及代理进行对话并且使用管道话持久连接的时候,使用半关闭来方式对等实体收到非预期的写入错误就变得很重要,关闭连接的输出信道总是很安全的,连接另一端的对等实体会在起缓冲区中读出所有的数据之后收到一条通知,说明流结束了,这样对面就会知道即将关闭。

正常关闭

HTTP规范建议,当客户端或者服务器突然要关闭一条连接的时候,应该正常的关闭传输连接,但是并没有说明要如何去做。
总之,实现正常的关闭的应用程序首先关闭他们的输出信道,然后邓艾另一端的对等实体关闭它的输出信道,当两端都高速对方不会再发出任何数据之后,连接就会被完全关闭,而不会有重置的风险
想要正常关闭连接的应用程序应该先半关闭其输出信道,然后周期性的检查输入信道的状态,如果再一定的时间区间内对端没有关闭输入信道,应用程序可以强制关闭连接,以节省资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1798323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 资源 之 风格化地形纹理(Stylized Terrain Textures)免费领取

风格化地形纹理&#xff1a;Stylized Terrain Textures 前言资源包内容领取兑换码 前言 亲爱的 Unity 游戏开发者们&#xff0c;我们自豪地为大家推荐最新的每周免费资源&#xff1a;风格化地形纹理&#xff01;这些令人惊叹的纹理将为你的游戏世界带来独特而引人入胜的视觉体…

Ambari集成Apache Kyuubi实践

目前还有很多公司基于HDP来构建自己的大数据平台&#xff0c;随着Apache Kyuubi的持续热度&#xff0c;如何基于原有的HDP产品来集成Apache Kyuubi&#xff0c;很多人都迫切的需求。集成Apache Kyuubi到HDP中&#xff0c;主要涉及Ambari的二次开发。本文详细叙述了集成Apache K…

老师怎么发期末成绩?

期末成绩发放&#xff0c;可是每个学期的重头戏&#xff0c;老师们&#xff0c;你们怎样安全、高效的传达成绩&#xff1f;别急&#xff0c;今天就来聊聊这个问题。 先来个小调查&#xff1a;各位老师们都是怎么发成绩的&#xff1f;是传统的纸质成绩单&#xff0c;还是电子邮件…

IngsollRang伺服拧紧轴控制器维修故障排查

【IngsollRang控制器故障排查】 在开始维修之前&#xff0c;请确保拧紧机已关闭并断开电源。然后&#xff0c;按照以下步骤进行故障排查&#xff1a; 1. 检查电源连接&#xff1a;确保拧紧机的电源线牢固连接&#xff0c;且电源插座正常工作。 2. 检查保险丝&#xff1a;如果电…

SmartEDA赋能学校教育:电子设计学习新篇章,让梦想触手可及!

在数字化时代&#xff0c;电子设计已成为科技创新的重要驱动力。然而&#xff0c;对于许多初学者和在校学生来说&#xff0c;电子设计的学习过程往往充满了挑战和困惑。幸运的是&#xff0c;随着SmartEDA的出现&#xff0c;这一局面正在发生深刻改变。SmartEDA不仅简化了电子设…

期末成绩怎么单独发给家长

想知道如何让成绩查询变得简单又安全吗&#xff1f;跟着我&#xff0c;带你发现一个让家长和老师都省心的神器&#xff01; 传统的成绩发布方式&#xff0c;一张张成绩单&#xff0c;一封封邮件&#xff0c;或是一条条短信&#xff0c;这些方法虽然有效&#xff0c;但效率不高&…

如何利用51建模网,在跨境独立站内实现商品3D模型嵌入展示?

跨境电商卖家如何在自己的独立站上嵌入商品3D模型&#xff1f;利用51建模网的Web3D展示技术和内嵌功能&#xff0c;即可实现商品3D模型嵌入&#xff0c;全方位的720立体交互展示&#xff0c;为消费者带来沉浸式的购物体验&#xff0c;显著提升消费者的参与度和网页访问时长。 具…

随到随学|2024泰迪智能科技暑期在线项目/集训营

在数字化转型的浪潮中&#xff0c;大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前&#xff0c;全球各行各业都在积极推进数字化转型&#xff0c;不仅为经济增长注入新活力&#xff0c;也对人才市场结构产生了深刻影响&#xff0c;尤其是对数字化人才…

【优化过往代码】关于vue自定义事件的运用

【优化过往代码】关于vue自定义事件的运用 需求说明过往代码优化思路优化后代码&#xff08;Vue2&#xff09;遇到问题记录 Vue2官方自定义指令说明文档 Vue3官方自定义指令说明文档 需求说明 进入某些页面需要加载一些外部资源&#xff0c;并在资源加载完后进行一些处理&…

建构信任基石:揭秘Web3的去中心化信任体系

在传统的互联网时代&#xff0c;信任往往建立在中心化的机构和第三方平台之上&#xff0c;而这种中心化的信任体系往往面临着数据泄露、信息滥用等问题。然而&#xff0c;随着区块链技术的发展&#xff0c;Web3时代正在向我们展示一种全新的信任体系&#xff0c;即去中心化的信…

C++基础一:代码编译和运行时的调用堆栈

目录 运行时进程的虚拟地址划分 函数调用堆栈 程序编译链接原理 运行时进程的虚拟地址划分 每一个进程的用户空间是私有的&#xff0c;内核空间是共享的 函数调用堆栈 程序编译链接原理

短剧小程序剧场短剧APP定制开发付费短剧之如何搭建?

在构建小剧场短剧影视小程序的过程中&#xff0c;遵循明确的步骤并注意到关键的细节至关重要。 步骤一&#xff1a;寻找适合的源码 1、考虑源码的授权方式&#xff1a;选择开源或商业授权的源码时&#xff0c;要仔细阅读其授权协议&#xff0c;确保它允许你进行修改和商业化利…

《数据结构》

简答题 一、设散列函数H(key)=key MOD 11,用线性探测再散列法解决冲突。对关键字序列{ 13,28,72,5,16,18,7,11,24 }在地址空间为0-10的散列区中建散列表,画出此表,并求等概率情况下查找成功时的平均查找长度。 散列函数为 H(key)=key MOD 11,将关键字序列 {13,28,…

python ---使用python操作mysql ---> pymysql

本章内容: 1:能够完成从MySQL中读取出数据; [重点] 查询: execute()、fetchall() 2:能够将数据写入MySQL数据库。 [重点] 插入数据: execute() sql insert into xxx [掌握]pymysql模块的安装 目标&#xff1a;了解如何安装pymysql模块&#xff1f; 当要使用Python和M…

白嫖游戏指南,Epic喜加一:《漫威暗夜之子》

前言 Epic喜加一&#xff1a;《漫威暗夜之子》《漫威暗夜之子》简介&#xff1a; 前言 接下来有时间会分享一些游戏相关可以白嫖的资源&#xff0c;包括游戏本体、游戏素材资源等等。 有需要的小伙伴可以关注这个专栏&#xff0c;不定期更新哦&#xff01; 专栏&#xff1a;…

C++基础三:类和对象的细节原理

类和对象以及this指针&#xff1a; 概念 面向对象四大特性&#xff1a;抽象&#xff1a;抽象是一种将对象的共同特征提取出来并定义成一个通用模板的过程。类的抽象是指将一个类的共同属性和行为抽象出来&#xff0c;定义一个通用的类模板&#xff0c;而不关注具体的实现细节…

HBuilder中能否使用机器学习

HBuilder中能否使用机器学习? HBuilder是一款由腾讯公司开发的前端开发工具,主要用于快速构建和管理HTML5应用。HBuilder本身是一个专注于Web开发的集成开发环境(IDE),它提供了代码编辑、预览、调试等功能,并且集成了Espresso等移动应用测试框架。HBuilder的核心功能是针…

鸿蒙开发:从入门到实战!

一&#xff0c;默认模版中是容器Row或者Column中添加一个Text文本&#xff0c;我们可以尝试一下修改它的内容和样式&#xff0c;对UI语法有一个初体验&#xff1a; // 文本内容 Text("沉默的闪客") // 字体大小 .fontSize(50) //背…

docker 拉取镜像报错: error pulling image configuration:(kafka)

一、问题描述 docker 拉取镜像报错: error pulling image configuration:&#xff08;kafka&#xff09; ERROR: error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/a6/a692873757c06a38279b61…