前面我们主要是聊了一下http的状态码以及请求方式,主要是在怎么用上?那么我们后续接着去深入HTTP底层去探究一下底层的一些奥秘

既然你了解了这么多有关于HTTP的知识,那请你说一说HTTP的请求过程以及原理!知道了原理,有没有想过用多线程的方式来下载文件?以及如何选择一段文件来进行下载的操作!

接着就是谈一下你对于HTTP报文结构的了解,响应报文和请求报文一样吗?

HTTP 请求的过程与原理?

HTTP 是基于 TCP/IP 协议的应用层协议,它使用 TCP 作为传输层协议,通过建立 TCP 连接来传输数据。

HTTP 遵循标准的客户端-服务器模型,客户端打开连接发出请求,然后等待服务器返回的响应。

首先是需要指出HTTP是应用层的协议,TCP/IP是传输层的协议,然后传输数据的方式是通过TCP建立的连接!

接着是需要知道谁和谁之间进行通信,客户端与服务器之间!请求方式就是,客户端发送一个请求(你点击了一个界面/链接),就会发送一个请求到达服务器!服务器根据你的请求来进行响应的过程!

  • 在浏览器输入 URL 后,浏览器首先会通过 DNS 解析获取到服务器的 IP 地址,然后与服务器建立 TCP 连接。

  • TCP 连接建立后,浏览器会向服务器发送 HTTP 请求。

  • 服务器收到请求后,会根据请求的信息处理请求。

  • 处理完请求后,服务器会返回一个 HTTP 响应给浏览器。

  • 浏览器收到响应后,会根据响应的信息渲染页面。然后,浏览器和服务器断开 TCP 连接。

这个过程我们前面前面聊过的,如果想了解DNS解析过程的小伙伴可以看看前两期的内容哈!

在知道了HTTP是什么之后[应用层协议],怎么传输的之后[基于传输层协议TCP/IP],你就需要知道到底是怎么获取到服务器的IP地址的,怎么建立TCP链接的这一系列的过程!

大家脑子里面大概要有这么一个过程:

DNS解析->IP地址->建立连接TCP/IP->客户端发送请求->服务器响应请求【这个过程中客户端一直等待服务器的响应结果!】

客户端发送一个请求到服务器,服务器处理请求并返回一个响应。这个过程是同步的,也就是说,客户端在发送请求后必须等待服务器的响应。在等待响应的过程中,客户端不会发送其他请求!

那你提到了客户端会一直等待服务器的响应,那么你有没有想过用多线程的方式来下载一个文件呢

这就需要用到HTTP请求头当中的Range字段来进行处理了!

采用的是分片下载的方式,首先,通过 HEAD 请求获取文件的总大小。然后根据文件大小和线程数,将文件进行切割。每个线程负责下载一个特定范围的数据

需要知道当前的这个文件是多大?5MB,10MB?需要知道这些数据

然后是根据这个大小,和当前多线程的线程的具体梳理来进行数据的切割操作!将文件进行切割!每个线程下载它对应的负责的那一部分文件就可以了!

那怎么去设置线程下载的那一部分文件了,就需要用到下面的RANGE字段了!range字段是保留在HTTP请求头里面的!

可以通过设置 HTTP 请求头的 Range 字段指定下载的字节区间。例如,Range: bytes=0-1023 表示下载文件的前 1024 字节。

最后启动多线程下载。

那我如果只要下载数据的前十个字节呢?

只需要设置 Range 字段为 Range: bytes=0-9 即可。

好的我知道HTTP的请求过程以及原理了,那你可不可以讲一讲HTTP的报文结构呢

HTTP 的报文结构分为:请求报文和响应报文。两者在结构上很相似,都包含了起始行、头部和消息正文。

既然你说有请求报文和响应报文,那你说一说HTTP请求报文的结构?

请求报文由请求行、请求头部、空行和消息正文组成。

①、请求行包括请求方法、请求 URL 和 HTTP 协议的版本。例如:GET /index.html HTTP/1.1

②、请求头部包含请求的附加信息,如客户端想要接收的内容类型、浏览器类型等。例如:

  • Host: www.javabetter.cn,表示请求的主机名(域名)

  • Accept: text/html,表示客户端可以接收的媒体类型

  • User-Agent: Mozilla/5.0,表示客户端的浏览器类型

  • Range:用于指定请求内容的范围,如断点续传时表示请求的字节范围。

③、请求头部和消息正文之间有一个空行,表示请求头部结束。

④、消息正文是可选的,如 POST 请求中的表单数据;GET 请求中没有消息正文。

首先至少要知道的就是不要少了请求行!包括了请求的方法,对应的URL的路径和HTTP协议的版本等一系列的信息!

接着是你要知道它附加的头部里面包含了哪些信息! 域名[告诉我要访问哪个网址],响应的类型[你需要返回什么样的文件],客户端浏览器[浏览器的类型是什么]

空行嘛,空一行,代表请求头部就上面的信息

消息正文里面的消息是可选的:比如你是post,你是要去修改表中的数据的,那么你的需要修改的数据就可以放到正文里面去!你如果是get,你本身只是去获取数据,就不需要放数据了!

emmmmm,再说一下HTTP响应报文的结构?

①、状态行

包括 HTTP 协议的版本、状态码(如 200、404)和状态消息(如 OK、NotFound)。例如:HTTP/1.0 200 OK

②、响应头部

包含响应的附加信息,如服务器类型、内容类型、内容长度等。也是键值对,例如:

  • Content-Type: text/plain,表示响应的内容类型

  • Content-Length: 137582,表示响应的内容长度

  • Expires: Thu, 05 Dec 1997 16:00:00 GMT,表示资源的过期时间

  • Last-Modified: Wed, 5 August 1996 15:55:28 GMT,表示资源的最后修改时间

  • Server: Apache 0.84,表示服务器类型

③、空行

表示响应头部结束。

④、消息正文(可选)

响应的具体内容,如 HTML 页面。不是所有的响应都有消息正文,如 204 No Content 状态码的响应。

其实这个部分是和请求的格式是差不多的!

最主要的区别还是在状态行和请求行的区别!状态行里面主要就是响应码,HTTP版本,状态信息

响应头部,包含了响应的附加信息,响应的内容类型,响应的是一个什么样的数据啊,资源什么时候过期等等

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐