简述HTTP请求过程

HTTP(HyperText Transfer Protocol)超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是一个简单的请求-响应协议,是客户端和服务端之间请求和应答的标准,它通常运行在 TCP(传输控制协议)之上,由统一资源标识符(Uniform Resource Identifiers,URI 包含 URL 和 URN )来标识。

HTTP 通过使用浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。HTTP是万维网的数据通信的基础。

以下是一个 HTTP 请求的完整过程:

0、URL匹配和DNS解析
之前在简述 URL 中说过,当我们在浏览器中输入一段 URL 的时候,会通过一系列规则,匹配到相应的唯一资源,比如说:http://mu-mu.cn/example/index.html,则是告诉浏览器,我们需要通过http协议,在mu-mu.cn这个服务端,在默认的80端口下,在/example目录下,请求index.html这个资源。

不过其实大家都不认mu-mu.cn这个域名,认的都是mu-mu.cn对应的IP地址,就像我知道你叫张三,但是能表明你身份的不是张三这个名字,而是你的身份证号码一样,域名的出现只是为了方便人们记忆和使用,但要让计算机识别,还需要通过DNS将域名解析到相应的IP地址。

1、建立TCP连接:三次握手
HTTP是应用层协议,他的工作还需要数据层协议的支持,最常与它搭配的就是TCP协议(应用层、数据层是OSI七层模型中的,以后有机会会说到的)。TCP协议称为数据传输协议,是可靠传输,面向连接的,并且面向字节流的。
面向连接:通信之前先建立连接,确保双方在线。
可靠传输:在网络正常的情况下,数据不会丢失。
面向字节流:传输灵活,但是TCP的传输存在粘包问题,没有明显的数据约定。
在正式发送请求之前,需要先建立TCP连接。建立TCP连接的过程简单地来说就是客户端和服务端之间发送三次消息来确保连接的建立,这个过程称为三次握手

2、发送请求
TCP连接建立完毕之后,客户端就可以向服务端发送请求报文来请求资源了。请求报文分为请求行、请求头、空行和请求体,服务端通过请求行和请求头中的内容获取客户端的信息,通过请求体中的内容获取客户端传过来的数据。

3、响应应答
在接收到客户端发来的请求报文并且确认完毕之后,服务端会向客户端发送响应报文。响应报文由状态行、响应头、空行和响应体组成,服务端通过状态行和响应头告诉客户端请求的状态和如何对数据处理等信息,真正的数据则在响应体中传输给客户端。

关于请求报文和响应报文,我之前也简单地说到过。https://mu-mu.cn/blog/index.php/2020/07/29/1645/

4、断开TCP连接
当请求完成后,还需断开TCP连接。断开的过程简单地说就算客户端和服务端之间发送四次信息来确保连接的断开,所以称为四次挥手。

以上就是一个HTTP请求的简单过程了,接来下再说一说HTTP请求的特性。

一、单向请求
HTTP请求是单向的,是只能由客户端发起请求,由服务端响应的请求-响应模式。(如果你需要双向请求,可以用socket)

二、基于TCP协议
HTTP是应用层协议,所以其数据传输部分是基于TCP协议实现的。

三、无状态
HTTP请求是无状态的,即没有记忆功能,不能获取之前请求或响应的内容。起初这种简单的模式,能够加快处理速度,保证协议的稳定,但是随着应用的发展,这种无状态的模式会使我们的业务实现变得麻烦,比如说需要保存用户的登录状态,就得专门使用数据库来实现。于是乎,为了实现状态的保持,引入了Cookie技术来管理状态。

四、无连接
HTTP协议不能保存连接状态,每次连接只处理一个请求,用完即断,从而达到节约传输时间、提高并发性。在TCP连接断开之后,客户端和服务端就像陌生人一样,下次再发送请求,就得重新建立连接了。有时候,当我们需要发送一段频繁的请求时,这种无连接的状态反而会耗费更多的请求时间(因为建立和断开连接本身也需要时间),于是乎,HTTP1.1中提出了持久连接的概念,可以在请求头中设置Connection: keep-alive来实现。

至此,HTTP协议完整的请求过程和特性就简单地介绍完了,继续学习吧!

发表评论

邮箱地址不会被公开。 必填项已用*标注