写点什么

一文带你了解什么是 HTTP 协议

发布于: 3 小时前
一文带你了解什么是HTTP协议

前言

网络是由若干节点和连接这些节点的链路构成,然后网络与网络之间所串连成的庞大网络叫做互联网,而我们今天要讲的 HTTP(HyperText Transfer Protocol 超文本传输协议)是互联网上应用最为广泛的一种网络协议,它是由万维网协会(World Wide Web Consortium)制定发布。

一、简介

HTTP 协议一共有五大特点:

1.支持客户/服务器模式。2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。3.灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type(Content-Type 是 HTTP 包中用来表示内容类型的标识)加以标记。4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。5.无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息(Cookie 和 Session 孕育而生)。

二、TCP/IP 协议

HTTP 是一个基于 TCP/IP 协议簇来传递数据,包含四层模型。


从上图我们可以清晰的看到 HTTP 使用的传输层协议为 TCP 协议,而网络层使用的是 IP 协议(当然还使用了很多其他协议),所以说 HTTP 是一个基于 TCP/IP 协议簇来传递数据。那 TCP/IP 协议簇大致是如何工作的,我们再来看看下图:


我们可以看到在数据发送端是一层一层封装数据,数据接收端一层一层拆封,最后应用层获得数据。

三、建立 TCP 连接

我们知道了 TCP/IP 协议簇大致的工作原理之后,我们来看看 HTTP 是如何建立连接的。

1.TCP 包头信息前面咱们讲过 HTTP 是一个基于 TCP/IP 协议簇来传递数据,所以这 HTTP 建立连接也就是建立 TCP 连接,TCP 如何建立连接,一起来看看 TCP 包信息结构吧。


TCP 报文包=TCP 头信息+TCP 数据体,而在 TCP 头信息中包含了 6 种控制位(上图红色框中),这六种标志位就代表着 TCP 连接的状态:1.URG:紧急数据(urgent data)—-这是一条紧急信息 2.ACK:确认已收到 3.PSH:提示接收端应用程序应该立即从 tcp 接收缓冲区中读走数据 4.RST:表示要求对方重新建立连接 5.SYN:表示请求建立一个连接 6.FIN:表示通知对方本端要关闭连接了

2.建立连接过程了解了 TCP 包头信息之后,我们就可以正式看看 TCP 建立连接的三次握手了。


三次握手讲解:

1.客户端发送位码为 syn=1,随机产生 seq number=1234567 的数据包到服务器,服务器由 SYN=1 知道客户端要求建立联机(客户端:我要连接你)2.服务器收到请求后要确认联机信息,向 A 发送 ack number=(客户端的 seq+1),syn=1,ack=1,随机产生 seq=7654321 的包(服务器:好的,你来连吧)3.客户端收到后检查 ack number 是否正确,即第一次发送的 seq number+1,以及位码 ack 是否为 1,若正确,客户端会再发送 ack number=(服务器的 seq+1),ack=1,服务器收到后确认 seq 值与 ack=1 则连接建立成功。(客户端:好的,我来了)面试官:为什么 http 建立连接需要三次握手,不是两次或四次答:三次是最少的安全次数,两次不安全,四次浪费资源

四、客户端请求

客户端与服务器连接上了之后,客户端就可以开始向服务器请求资源,就可以开始发送 HTTP 请求了。

1.HTTP 请求报文结构我们之前说过 TCP 报文包=TCP 头信息+TCP 数据体,TCP 头信息我们已经讲了,现在来讲 TCP 数据体,也就是我们的 HTTP 请求报文。


2.HTTP 请求实例来看看实际的 HTTP 请求例子:


1.①是请求方法,HTTP/1.1 定义的请求方法有 8 种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的两种 GET 和 POST,如果是 RESTful 接口的话一般会用到 GET、POST、DELETE、PUT2.②为请求对应的 URL 地址,它和报文头的 Host 属性组成完整的请求 URL3.③是协议名称及版本号 4.④是 HTTP 的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息 5.⑤是报文体,它将一个页面表单中的组件值通过 param1=value1&param2=value2 的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求 URL 也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。请求头参数非常多,这里就不一一说明,只说明两个低级的反扒参数:1.User-Agent:客户端使用的操作系统和浏览器的名称和版本,有些网站会限制请求浏览器 2.Referer:先前网页的地址,表示此请求来自哪里,有些网站会限制请求来源

五、服务端响应

服务器在收到客户端请求处理完需要响应并返回给客户端,而 HTTP 响应报文结构与请求结构体一致。

1.HTTP 响应报文结构


2.HTTP 响应实例


3.响应状态码响应报文中我们重点关注下:服务器的响应状态码,面试也很容易问到,下面只列出分类,详细状态码请自行上网查找了解。


六、断开连接

在服务器响应完毕后,一次会话就结束了,请问这时候连接会断开吗?

1.长短连接是否断开我们需要区分 HTTP 版本:(1)在 HTTP/1.0 版本的时候,客户端与服务器完成一个请求/响应之后,会将之前建立的 TCP 连接断开,下次请求的时候又要重新建立 TCP 连接,这也被称为短连接(2)在 HTTP1.0 发布仅半年后(1997 年 1 月),HTTP/1.1 版本发布并带来一个新的功能:在客户端与服务器完成一次请求/响应之后,允许不断开 TCP 连接,这意味着下次请求就直接使用这个 TCP 连接而不再需要重新握手建立新连接,这也被称为长连接注意:长连接是指一次 TCP 连接允许多次 HTTP 会话,HTTP 永远都是一次请求/响应,会话结束,HTTP 本身不存在长连接之说。早在 1999 年 HTTP1.1 就推广普及,所以现在浏览器在请求时请求头中都会携带一个参数:Connection:keep-alive,这表示浏览器要求与服务器建立长连接,而服务器也可以设置是否愿意建立长连接,如果是 close,表示已关闭。

2.长连接优缺点对于服务器来说建立长连接有优点也有缺点:优点:当网站中有大量静态资源(图片、css、js 等)就可以开启长连接,这也几张图片就可以通过一次 TCP 连接发送。缺点:当客户端请求一次时候不在请求,而服务器却开着长连接资源被占用着,这是严重浪费资源。所以是否开启长连接,长连接时间都需要根据网站自身来合理设置。ps:大家不要小看这一个 TCP 连接,在一次客户端 HTTP 完整的请求中(DNS 寻址、建立 TCP 连接、请求、等待、解析网页、断开 TCP 连接)建立 TCP 连接占用的时间比还是很大的。

3.断开连接过程在建立 TCP 连接时是三次握手,而断开 TCP 连接是四次挥手。


ps:http 还有两个很大的缺点就是明文且不能保证完整性,所以目前会渐渐被 HTTPS 代替。

用户头像

还未添加个人签名 2021.06.18 加入

还未添加个人简介

评论

发布
暂无评论
一文带你了解什么是HTTP协议