HTTP请求全过程解析【个人八股】
HTTP请求过程基于TCP/IP协议,客户端通过DNS解析获取服务器IP后建立TCP连接,发送HTTP请求并等待服务器响应。请求报文包含请求行、头部和可选正文,响应报文包含状态行、头部和可选正文。多线程下载可利用HTTP头部的Range字段实现分片传输。整个过程遵循客户端-服务器模型,包括建立连接、请求-响应、断开连接三个阶段。

前面我们主要是聊了一下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版本,状态信息
响应头部,包含了响应的附加信息,响应的内容类型,响应的是一个什么样的数据啊,资源什么时候过期等等
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)