首页 > 其他分享 >HTTP协议介绍&各个版本功能差异对比

HTTP协议介绍&各个版本功能差异对比

时间:2024-10-09 21:49:26浏览次数:10  
标签:HTTP 请求 TCP 连接 版本 服务器 对比 客户端

http协议简介

        HTTP 全称超文本传输协议(HyperText Transfer Protocol),是一种广泛用于互联网中浏览器与服务器之间的应用层传输协议。简单来说,浏览器向服务器发送 HTTP 请求,服务器向浏览器返回 HTTP 响应,两者之间通过这种方式进行“交流”,来使得我们的浏览器可以正常从服务器端获取数据,并展示在用户的电脑屏幕上。

http协议各个版本功能差异(如何优化)

HTTP 0.9
        HTTP协议的最初版本,功能简陋,仅支持请求方式GET,并且仅能请求访问HTML格式的资源。

HTTP 1.0
        增加了请求方式POST和HEAD;请求行必须在尾部添加协议版本字段(http/1.0),每次通信都必须包括头信息(HTTP header),用来描述一些元数据。不再局限于0.9版本的HTML格式,根据Content-Type可以支持多种数据格式,即MIME多用途互联网邮件扩展,例如text/html、image/jpeg等;同时也开始支持cache,就是当客户端在规定时间内访问统一网站,直接访问cache即可。其他的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。但是1.0版本的工作方式是每次TCP连接只能发送一个请求(默认短链接),当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接,就是不支持keep-alive。

长连接和短链接

        短连接:客户端和服务端进行收发数据的时候才进行连接,一次收发消息后就进行断开。优点:管理起来比较简单,存在的连接都是有用的连接

        长连接:双方建立连接,一次读写之后不会主动断开。优点:省去了TCP连接和关闭的时间,节省了时间,频繁请求的用户适合长连接,缺点是如果有人恶意攻击,产生大量的长连接,会使服务器受损。所以可以关闭一些长时间不用的连接,以及限制客户端的最大连接数

        TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。所以,HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。

        为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段。Connection: keep-alive

HTTP 1.1
        1.1 版的最大变化,就是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。解决了1.0版本的keepalive问题,一个TCP连接可以允许多个HTTP请求;客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。
        加入了管道机制,在同一个TCP连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率;举例来说,客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求。管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。
新增了请求方式PUT、PATCH、OPTIONS、DELETE等。
        客户端请求的头信息新增了Host字段,用来指定服务器的域名。在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。

Content-Length 字段

        一个TCP连接现在可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的。这就是Content-length字段的作用,声明本次回应的数据长度。

Content-Length: 3495

        上面代码告诉浏览器,本次回应的长度是3495个字节,后面的字节就属于下一个回应了。

        在1.0版中,Content-Length字段不是必需的,因为浏览器发现服务器关闭了TCP连接,就表明收到的数据包已经全了。

        虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务端是按队列顺序处理请求的,服务器只有处理完一个回应,才会进行下一个回应。假如前面的请求处理时间很长,后面就会有许多请求排队等着,这样就造成了“队头阻塞”的问题;同时HTTP是无状态的连接,因此每次请求都需要添加重复的字段,降低了带宽的利用率。

HTTP 2.0
        为了解决1.1版本利用率不高的问题,提出了HTTP/2.0版本。增加双工模式,即不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求,解决了队头堵塞的问题(HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级);HTTP请求和响应中,状态行和请求/响应头都是些信息字段,并没有真正的数据,因此在2.0版本中将所有的信息字段建立一张表,为表中的每个字段建立索引,客户端和服务端共同使用这个表,他们之间就以索引号来表示信息字段,这样就避免了1.0旧版本的重复繁琐的字段,并以压缩的方式传输,提高利用率。

另外也增加服务器推送的功能,即不经请求服务端主动向客户端发送数据。

多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息

当前主流的协议版本还是HTTP/1.1版本。

多路复用:对于 HTTP/1.x,即使开启了长连接,请求的发送也是串行发送的,在带宽足够的情况下,对带宽的利用率不够,HTTP/2.0 采用了多路复用的方式,可以并行发送多个请求,提高对带宽的利用率。

/**********************************************名词解释************************************************/
二进制协议

        HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。二进制协议的一个好处是,可以定义额外的帧。HTTP/2 定义了近十种帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦,二进制解析则方便得多。

多工
        HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"。举例来说,在一个TCP连接里面,服务器同时收到了A请求和B请求,于是先回应A请求,结果发现处理过程非常耗时,于是就发送A请求已经处理好的部分, 接着回应B请求,完成后,再发送A请求剩下的部分。
 

数据流
        因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。数据流发送到一半的时候,客户端和服务器都可以发送信号(RST_STREAM帧),取消这个数据流。1.1版取消数据流的唯一方法,就是关闭TCP连接。这就是说,HTTP/2 可以取消某一次请求,同时保证TCP连接还打开着,可以被其他请求使用。
客户端还可以指定数据流的优先级。优先级越高,服务器就会越早回应。
 

头信息压缩
        HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如Cookie和User Agent,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。
HTTP/2 对这一点做了优化,引入了头信息压缩机制(header compression)。一方面,头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。


服务器推送
        HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。意思是说,当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期到客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。

/**********************************************名词解释************************************************/

HTTP 3.0
那么HTTP2.0虽然性能已经不错了,还有什么不足吗?

建立连接时间长(本质上是TCP的问题)
队头阻塞问题
移动互联网领域表现不佳(弱网环境)


熟悉HTTP2.0协议的同学应该知道,这些缺点基本都是由于TCP协议引起的,水能载舟亦能覆舟.

TCP队头阻塞
        TCP数据包是有序传输,中间一个数据包丢失,会等待该数据包重传,造成后面的数据包的阻塞。

        想从TCP上进行改造升级绝非易事,但是UDP虽然没有TCP为了保证可靠连接而引发的问题,但是UDP本身不可靠,又不能直接用。

QUIC协议和HTTP3.0
        QUIC其实是Quick UDP Internet Connections的缩写,直译为快速UDP互联网连接。

        HTTP3.0又称为HTTP Over QUIC,其弃用TCP协议,改为使用基于UDP协议的QUIC协议来实现。

QUIC协议详解
        HTTP3.0既然选择了QUIC协议,也就意味着HTTP3.0基本继承了HTTP2.0的强大功能,并且进一步解决了HTTP2.0存在的一些问题,同时必然引入了新的问题。

队头阻塞问题:

        队头阻塞问题可能存在于HTTP层和TCP层,在HTTP1.x时两个层次都存在该问题。

        HTTP2.0协议的多路复用机制解决了HTTP层的队头阻塞问题,但是在TCP层仍然存在队头阻塞问题。
        TCP协议在收到数据包之后,这部分数据可能是乱序到达的,但是TCP必须将所有数据收集排序整合后给上层使用,如果其中某个包丢失了,就必须等待重传,从而出现某个丢包数据阻塞整个连接的数据使用。
        QUIC协议是基于UDP协议实现的,在一条链接上可以有多个流,流与流之间是互不影响的,当一个流出现丢包影响范围非常小,从而解决队头阻塞问题。
如何用UDP协议来实现TCP协议的主要功能:

        QUIC协议就回答了这个问题:QUIC协议是基于UDP来实现的,它将TCP的重要功能都进行了实现和优化,QUIC协议的核心思想是将TCP协议在内核实现的诸如可靠传输、流量控制、拥塞控制等功能转移到用户态来实现,同时在加密传输方向的尝试也推动了TLS1.3的发展。

标签:HTTP,请求,TCP,连接,版本,服务器,对比,客户端
From: https://blog.csdn.net/John_ToStr/article/details/142797263

相关文章

  • Qt中的http
    来自GTP在Qt中,使用QNetworkAccessManager、QNetworkRequest和QNetworkReply类来进行HTTP请求。以下是使用Qt进行HTTP操作的基本步骤和示例代码。引入必要的头文件cpp#include<QCoreApplication>#include<QNetworkAccessManager>#include<QNetworkRequest>......
  • 【网络】初识https协议加密过程
    初识https协议加密过程为什么不用http而要使用https常见的加密方式对称加密非对称加密数据摘要&&数据指纹https的工作过程探究方案一:只使用对称加密方案二:只使用非对称加密方案三:双方都使用对称加密方案四:非对称加密+对称加密中间人攻击如何确认密钥是否被修改理解数......
  • Kali Linux 各版本开启ssh 服务
    KaliLinux各版本开启ssh服务2019版kaliLinuxSSH链接办法修改kali关于SSH服务默认配置并重启SSH服务,步骤如下:打开sshd_config文件leafpad/etc/ssh/sshd_config或者vi/etc/ssh/sshd_config将PasswordAuthenticationyes该行前面的#去掉将#PermitRootLoginw......
  • Mac 系统终端和vscode终端的pnpm版本和路径不一致问题,而且vscode终端的pnpm没法升级
    系统终端whichpnpm路径是/Users/zhanglinfeng/.nvm/versions/node/v16.19.1/bin/pnpm vscode终端 whichpnpm 路径是/usr/local/bin/pnpm 为了跟系统的一致,需要修改.zshrc文件新的#AddRVMtoPATHforscripting.MakesurethisisthelastPATHvariablec......
  • Git进行版本控制操作流程
    目录一、初始化仓库操作流程 二、添加到缓存区三、提交到版本库四、推送至远程仓库生成SSH密钥将本地库中内容推送至已经创建好的远程库推送推送错误第一种:五、克隆克隆整个项目拉去最新代码六、分支1.初始化仓库或克隆远端仓库2.检查当前分支3.修改代码......
  • HTTP 协议
    HTTP协议是接口测试中最常见的协议,是用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。客户端向服务端发送HTTP请求,服务端则会在响应中返回所请求的数据。在测试过程中,常常需要校验请求和响应结果,所以了解HTTP协议,对于接口测试来说,是重中......
  • pandas常用数据格式IO性能对比
    前言本文对pandas支持的一些数据格式进行IO(读写)的性能测试,大数据时代以数据为基础,经常会遇到操作大量数据的情景,数据的IO性能尤为重要,本文对常见的数据格式csv、feather、hdf5、jay、parquet、pickle性能进行对比。csvCSV(Comma-SeparatedValues)是一种用于存储表格数据的......
  • 8、使用search-guard加固安全为https访问
    使用search-guard加固安全为https访问1、ES安装search-guard安装1、在linux上下载介质。下载后无需解压。wgethttps://releases.floragunn.com/search-guard-6/6.8.3-25.5/search-guard-6-6.8.3-25.5.zip2、停止ES运行。3、使用ES已有的插件工具,安装命令如下。会自动在ES......
  • 自定义tomcat的服务器名称和版本号
    要修改Tomcat的服务器名称和版本号,你需要编辑Tomcat的server.xml配置文件。这个文件通常位于Tomcat安装目录的conf文件夹下。打开server.xml文件。找到以下部分:<Connectorport="8080"protocol="HTTP/1.1"connectionTimeout="20000"redirect......
  • Win11安装哪个版本好?
    Windows11年度大更新24H2已经正式发布,由于版本特别多,有一些同学不知道安装哪个版本,此前在文章中零散的介绍过每一个版本的区别,经常有小伙伴留言问这些版本的区别,今天把他们汇总到一起,并结合最新发布的一些版本进行介绍它们的区别与联系。下图是我用网盘分享的ISO下载,可以看到版本......