HTTP --tcp和keep-alive

2024-06-04 05:04
文章标签 http tcp keep alive

本文主要是介绍HTTP --tcp和keep-alive,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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
HTTP/1.1 持久连接
持久连接的限制和规则

这篇关于HTTP --tcp和keep-alive的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029128

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

构建高性能WEB之HTTP首部优化

0x00 前言 在讨论浏览器优化之前,首先我们先分析下从客户端发起一个HTTP请求到用户接收到响应之间,都发生了什么?知己知彼,才能百战不殆。这也是作为一个WEB开发者,为什么一定要深入学习TCP/IP等网络知识。 0x01 到底发生什么了? 当用户发起一个HTTP请求时,首先客户端将与服务端之间建立TCP连接,成功建立连接后,服务端将对请求进行处理,并对客户端做出响应,响应内容一般包括响应

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Java http请求示例

使用HttpURLConnection public static String httpGet(String host) {HttpURLConnection connection = null;try {URL url = new URL(host);connection = (HttpURLConnection) url.openConnection();connection.setReq