一篇文章带你详解 HTTP 协议(上)
发布日期:2021-06-29 09:00:22 浏览次数:2 分类:技术文章

本文共 4297 字,大约阅读时间需要 14 分钟。

文章目录,方便阅读:

一、概述

二、HTTP 工作过程

三、HTTP 协议基础

四、HTTP 协议报文结构

五、HTTP 报文首部之请求行、状态行

六、HTTP 报文首部之首部字段(重点分析)

七、HTTP 响应状态码(重点分析)

八、HTTP 报文实体

九、与 HTTP 协作的 Web 服务器

配套思维导图:

 

一、概述


1.计算机网络体系结构分层

2.TCP/IP 通信传输流

利用 TCP/IP 协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则从链路层往上走。如下:

TCP/IP 通信传输流

  1. 首先作为发送端的客户端在应用层(HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求。

  2. 接着,为了传输方便,在传输层(TCP 协议)把从应用层处收到的数据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。

  3. 在网络层(IP 协议),增加作为通信目的地的 MAC 地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。

  4. 接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP请求。

如下图所示:

HTTP 请求

在网络体系结构中,包含了众多的网络协议,这篇文章主要围绕 HTTP 协议(HTTP/1.1版本)展开。

  1. HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

  2. HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。

  3. 我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。

 

二、HTTP 工作过程


HTTP请求响应模型

HTTP通信机制是在一次完整的 HTTP 通信过程中,客户端与服务器之间将完成下列7个步骤:

1.建立 TCP 连接

在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80;

2.客户端向服务器发送请求命令

一旦建立了TCP连接,客户端就会向服务器发送请求命令;

例如:GET /sample/hello.jsp HTTP/1.1

3.客户端发送请求头信息

客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送;

4.服务器应答

客户端向服务器发出请求后,服务器会向客户端返回响应;

例如: HTTP/1.1 200 OK

响应的第一部分是协议的版本号和响应状态码

5.服务器返回响应头信息

正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向客户端发送关于它自己的数据及被请求的文档;

6.服务器向客户端发送数据

服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据;

7.服务器关闭 TCP 连接

一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

 

三、HTTP 协议基础


1.通过请求和响应的交换达成通信

应用 HTTP 协议时,必定是一端担任客户端角色,另一端担任服务器端角色。仅从一条通信线路来说,服务器端和客服端的角色是确定的。HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。

2.HTTP 是不保存状态的协议

HTTP 是一种无状态协议。协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。

可是随着 Web 的不断发展,我们的很多业务都需要对通信状态进行保存。于是我们引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。

3.使用 Cookie 的状态管理

Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

Cookie 的流程

 

4.请求 URI 定位资源

HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到。

5.告知服务器意图的 HTTP 方法(HTTP/1.1)

HTTP 方法

 

6.持久连接

HTTP 协议的初始版本中,每进行一个 HTTP 通信都要断开一次 TCP 连接。比如使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无畏的 TCP 连接建立和断开,增加通信量的开销。

为了解决上述 TCP 连接的问题,HTTP/1.1 和部分 HTTP/1.0 想出了持久连接的方法。其特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。旨在建立一次 TCP 连接后进行多次请求和响应的交互。在 HTTP/1.1 中,所有的连接默认都是持久连接。

7.管线化

持久连接使得多数请求以管线化方式发送成为可能。以前发送请求后需等待并接收到响应,才能发送下一个请求。管线化技术出现后,不用等待亦可发送下一个请求。这样就能做到同时并行发送多个请求,而不需要一个接一个地等待响应了。

比如,当请求一个包含多张图片的 HTML 页面时,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术要比持久连接速度更快。请求数越多,时间差就越明显。

 

四、HTTP 协议报文结构


1.HTTP 报文

用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文;响应端(服务器端)的叫做响应报文。HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。

2.HTTP 报文结构

HTTP 报文大致可分为报文首部和报文主体两部分。两者由最初出现的空行(CR+LF)来划分。通常,并不一定有报文主体。如下:

2.1请求报文结构

请求报文的首部内容由以下数据组成:

  • 请求行 —— 包含用于请求的方法、请求 URI 和 HTTP 版本。
  • 首部字段 —— 包含表示请求的各种条件和属性的各类首部。(通用首部、请求首部、实体首部以及RFC里未定义的首部如 Cookie 等)

请求报文的示例,如下:

请求报文示例

 

2.2响应报文结构

响应报文结构

 

响应报文的首部内容由以下数据组成:

  • 状态行 —— 包含表明响应结果的状态码、原因短语和 HTTP 版本。
  • 首部字段 —— 包含表示请求的各种条件和属性的各类首部。(通用首部、响应首部、实体首部以及RFC里未定义的首部如 Cookie 等)

响应报文的示例,如下:

标题

 

五、HTTP 报文首部之请求行、状态行


1.请求行

举个栗子,下面是一个 HTTP 请求的报文:

GET  /index.htm  HTTP/1.1Host: sample.com

其中,下面的这行就是请求行,

GET  /index.htm  HTTP/1.1
  • 开头的 GET 表示请求访问服务器的类型,称为方法;

  • 随后的字符串  /index.htm 指明了请求访问的资源对象,也叫做请求 URI;

  • 最后的 HTTP/1.1,即 HTTP 的版本号,用来提示客户端使用的 HTTP 协议功能。

综合来看,大意是请求访问某台 HTTP 服务器上的 /index.htm 页面资源。

2.状态行

同样举个栗子,下面是一个 HTTP 响应的报文:

HTTP/1.1  200  OKDate: Mon, 10 Jul 2017 15:50:06 GMTContent-Length: 256Content-Type: text/html    ...

其中,下面的这行就是状态行,

HTTP/1.1  200  OK
  • 开头的 HTTP/1.1 表示服务器对应的 HTTP 版本;

  • 紧挨着的 200 OK 表示请求的处理结果的状态码和原因短语。

 

剩下的

六、HTTP 报文首部之首部字段(重点分析)

七、HTTP 响应状态码(重点分析)

八、HTTP 报文实体

九、与 HTTP 协作的 Web 服务器

将于进行重点分析详解。

转载地址:https://blog.csdn.net/zl1zl2zl3/article/details/84035968 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:一篇文章带你详解 HTTP 协议之报文首部及字段详解(中)
下一篇:【手写系列】透彻理解Spring事务设计思想之手写实现

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月20日 20时54分04秒