首页 > 其他分享 >Http的演进

Http的演进

时间:2023-12-10 15:00:59浏览次数:19  
标签:Http 请求 分块 版本 客户端 连接 演进

Http的演进

Http在1.1版本之前具有无状态的特点,每次请求都需要通过TCP三次握手四次挥手与服务器重新建立连接。比如某个客户端在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户请求,所以每次需要重新响应请求、耗费不必要的时间和流量。为了节省资源消耗,Http也进行了发展和演进,通过持久连接的方法来进行连接复用。

Http的1.0版本

​ 第一个版本的Http是Http0.9,组成极其简单,只允许客户端发送Get这一种请求,且不支持请求头。由于没有协议头,因此Http0.9协议只支持一种内容,即纯文本。不过网页依然支持用html语言格式化,同时无法插入图片。

​ http的第二个版本为1.0版本,也是第一个在通信中指定版本号的Http版本,至今依然被广泛采用。相对于Http0.9版本,Http1.0版本增加了如下主要特性:

​ (1) 请求与响应支持头部字段

(2) 响应对象以一个响应状态行开始。

(3) 响应对象不只限于超文本。

(4) 开始支持客户端通过Post方法向web服务器提交数据,支持GET、Head、Post方法

(5) 支持长连接,但默认使用短连接,缓存机制,以及身份认证。

(6) 请求行必须在尾部添加协议版本字段(Http1.0),必须包含头部消息。

​ http请求访问的资源不再局限上一个版本的Html格式,可以根据Content-Type设置访问的格式;同时也开始支持Cache。当客户端在规定时间内访问同一URL资源时,直接访问Cache即可。

http请求访问的资源不再局限上一个版本的Html格式,可以根据Content-Type设置访问的格式;同时也开始支持Cache。当客户端在规定时间内访问同一URL资源时,直接访问Cache即可。

MIME类型的每个值包括一级类型和二级类型,之间用斜杠分隔。除了预定义的类型,厂商也可以自定义类型,例如下面是一个自定义类型的例子:

application/vnd.debian.binary-package

上面的自定义MIME类型表明发送的是Debian系统的二进制数据包。

MIME类型值还可以在尾部使用分号、添加参数,下面是一个添加参数的例子:

Content-type: text/html;charset=utf-8

上面的类型值表面Http报文中的报文中的内容是文本网页数据,并且文本编码为utf-8

客户端在发送请求时可以使用Accept头部字段声明自己可以接受哪些数据格式。下面是一个Accept的例子:

Accept: */*

上面的Accept头部字段表明客户端声明自己可以接受来自服务端的任何格式的数据。

由于文本数据发送的时候往往可以通过压缩大大节省带宽,因此Http1.0版本协议可以支持把数据压缩后发送,其报文Content-Encoding头部用于说明数据的压缩格式。

http的1.1版本

Http1.1版本引入了许多关键技术:持久连接、管道机制、分块传输编码、字节范围请求等。

持久连接:即下层的TCP连接默认不关闭,可以被多个请求复用。

管道机制:在同一个tcp连接里允许多个请求同时发送,但是服务器还是按照顺序依次处理。(类似于前端同时发送两个请求给后端)

http1.1新增了put、patch、options、delete等多种请求方法。

http1.1版本客户端请求的头部信息新增了host字段,用来指定服务器的域名,还加了一个新的状态码100.(比如404之类的)

分块传输编码:该机制允许服务端将数据分成多个部分发送到客户端。普通的服务器响应会将响应数据的长度通过Content-Length字段告诉客户端。它主要是用Transfer-Encoding字段

Transfer-Encoding:chunked

每个分块包含十六进制的长度值和数据,其中长度值独占一行。长度不包括分块长度和(\r\n)的长度,也不包括分块数据后面结尾(\r\n)的长度。

最后一个分块的长度值必须为0,对应的分块数据没有内容,表示所有的body数据传输完成。

Http的2.0版本

它是一个二进制协议,传输效率明显提高,但是这样需要客户端和服务端都要引入新的二进制编码和解码的机制。

Protobuf,各位可以去了解一下。

好了,感兴趣的话,可以看看宝宝之前的博客吗0.0

参考文献:java高并发核心编程 Nio、netty、redis、zookeeper 作者:尼恩

标签:Http,请求,分块,版本,客户端,连接,演进
From: https://www.cnblogs.com/nanshaws/p/17892589.html

相关文章

  • Netty内置的http报文解码流程
    netty解码netty通过内置处理器HttpRequestDecoder和HttpObjectAggregator对Http请求报文进行解码之后,Netty会将Http请求封装成一个FullHttpRequest实例,然后发送给下一站。Netty内置的与Http请求报文相对应的类大致有如下几个:(1)FullHttpRequest:包含整个Http请求的信息,包含对Htt......
  • Apache HTTP Server 的安装与配置
    一、概要1.环境(1)RockyLinux9.3二、安装与配置1.安装(1)安装sudodnfinstallhttpd-y(2)服务sudosystemctlstarthttpdsudosystemctlenablehttpdsystemctlstatushttpd(3)防火墙sudofirewall-cmd--add-service={http,https}--permanentsudo......
  • 前端歌谣-第四拾九课-node之http模块之fs模块
    前言我是歌谣微信公众号关注前端小歌谣一起学习前端知识今天继续给大家讲解node中fs模块的讲解创建文件constfs=require("fs")fs.mkdir("./geyao",(err)=>{console.log(err)if(err&&err.code==="EEXIST"){console.log("目录已经存在")}})运行结果重命......
  • 前端歌谣-第四拾捌课-node之http模块之event模块
    前言我是歌谣微信公众号关注前端小歌谣一起学习前端知识今天继续给大家讲解node中event的讲解案例constEventEmitter=require("events")constevent=newEventEmitter()event.on("play",()=>{console.log("事件触发了")})event.emit("play")运行结果案例1varhttp=r......
  • 认识HTTP协议与apache
    万维网:(www)并非计算机网络,而是一个大型的数据库,可以实现网页与网页之间的跳转url:资源定位符描述了一个资源在服务器上的具体位置http:超文本传输协议图片视频小程序http:HyperTextTransferProtocol应用层协议,默认端口:80/tcp可以使用http协议的软件apachenginx......
  • 深入探究 Python 异步编程:利用 asyncio 和 aiohttp 构建高效并发应用
    在现代编程中,异步编程已成为处理高并发和IO密集型任务的重要方式。Python提供了强大的异步编程支持,包括asyncio库和aiohttp等框架。本文将深入探讨异步编程的概念,以及在Python中如何利用异步框架来实现高效的并发编程。1.异步编程概念异步编程允许程序在等待IO操作完成时......
  • 如何在 Angular 应用中发起 HTTP 302 redirect
    代码如下:import{RESPONSE}from'@nguniversal/express-engine/tokens'import{Response}from'express'...constructor(protected@Optional()@Inject(RESPONSE)serverResponse:Response){}...//forexample:this.serverResponse?.status......
  • HTTP 302 Redirect 解释与举例
    HTTP302Redirect解释与举例HTTP302Redirect是指HTTP协议中的一种重定向状态码,用于指示请求的资源被临时移动到其他位置。这种状态码告诉客户端发起新的请求,新的请求将指向重定向后的位置。在Web开发中,302重定向常用于实现页面跳转、URL重定向以及处理用户身份验证等场景。......
  • LWIP官方httpd使用之GET
    前言httpd的移植可以参考上篇文章LWIP官方DEMO使用之httpd服务-USTHzhanglu-博客园(cnblogs.com)此博文为学习笔记,仅介绍如何使用官方demo,无更深入分析。此博文介绍了如何通过GET返回各种数据。关键词:LWIP,HTTP,HTTPD,GET|LWIP版本|lwip-STABLE-2_2_0_RC1|GET......
  • httpclient跳过SSL证书验证的写法
    最近在请求https接口的时候,发生了异常:sun.security.validator.ValidatorException:PKIXpathbuildingfailed:sun.security.provider.certpath.SuncertPathBuilderException:unabletofindvalidcertificationpathtorequestedtarget无法找到到请求目标的有效证书路......