第二章 HTTP初探

2.1 HTTP版本

自 HTTP 协议发明到现在,经过了几次版本修改,分别是HTTP/0.9HTTP/1.0HTTP/1.1以及HTTP/2
现在市面上主要还是 HTTP/1.1,我们本文也主要介绍的是该版本。

2.2 TCP/IP协议

在学习 HTTP 协议之前我们先来了解下 TCP/IP 协议。可能大家要问了,我们在学习 HTTP,为什么要扯到 TCP/IP协议呢?你是不是在凑字数?骗子!!!非也,非也,我们要理解 HTTP,就必须要简单了解一下 TCP/IP 协议,它是 HTTP 的基础,地基打稳了房子才能结实嘛!
大家在工作过程中可能经常听到 OSI 七层网络结构以及 TCP/IP 四层网络结构等,但是这些都是什么呢?你平时工作中是否被搞晕过呢?

5dde3316000172fc05010349.png

左边的是大名鼎鼎的国际标准化组织 ISO 指定的网络结构模型。但是实际上大家使用的都是右边的 TCP/IP 四层网络结构。

ISO指定网络标准的时候,TCP/IP已经成为了事实上的标准,所以造成了一种奇葩现象。国际协会指定了标准,但是大家都不用~~

下面我们简单的聊一下 TCP/IP 四层结构中每一层的作用。

应用层: 这一层就是上层应用使用的协议。比如HTTP协议,FTP协议,SMTP协议等。

传输层: 从物理层到传输层这三层都是负责建立网络连接,发送数据。他们并不关心应用层使用什么协议。
传输层使用的就是TCPUDP协议。

网络层: 这一层负责选择路由路径。条条大路通罗马嘛,所以从相同的出发地到相同的目的地 也会有很多种路径,网络层就负责选择一条数据通行的路径。

物理层: 这一层负责数据的发送。这是最底层的网卡负责的。网卡把数据转换成高/低电平,然后通过网线发送出去。

下面我们以一个实际的例子来说明这个过程:
5dde33220001ff2716200730.png

上图是 主机A 向 主机B 发送 hello world 的过程。用户发出一个请求之后,从应用层开始,一直到物理层,每一层都会被加上盖层所属的附加信息;在接收端,每经过一层都会去掉该层的附加信息,然后交给上层处理。

是不是很像洋葱,一层又一层……

应用层把待发送的信息 hello world 使用自己的协议进行封装,然后调用传输层的接口,以此类推,最终数据传递给了物理层。每一层都会加上自己特有的一些标志信息。物理层最后把要发送的数据(包含应用层真正想发送的hello world 以及每个层自己增加的标识信息)转换为高低电平发送出去,接收端收到之后进行一个逆向的解析过程,最后主机B收到了 hello world。

上面是一个简单的描述,但是整体的原理就是这样的~
大家不要被每一层的概念所迷惑。这些层是人为划分出来的概念。就是为了写代码实现的时候比较方便。只需要定义每个层的接口,上一层调用下一层的接口就行了,不必关心具体实现。这也是软件设计中的一种理念。

2.3 HTTP协议

上面简单的说了一下网络的结构,这些东西是 HTTP 运行的基础。 下面我们聊一下本文的重点:HTTP 协议相关的内容。

2.3.1 HTTP协议总览

我们先看一下 HTTP 协议的总览图,如下:
image.png

2.3.2 HTTP协议结构

image.png

图中可以看到,HTTP协议分为三个部分,其中报文头部和报文主体之间使用空行进行分隔。

HTTP 是一个 Request-Response 的协议。

image.png

  1. 客户端发出 HTTP 请求( request );
  2. 服务器接收请求,处理请求,然后返回响应结果( response );
  3. 客户端接收响应结果,进行其它处理。

下面我们针对HTTP的请求和响应分别学习他们的报文结构。

2.3.3 HTTP 请求报文

image.png

  • 请求行
  • 请求头
  • 请求体

请求行

image.png

请求行包含了三部分,分别是请求方法,请求的 URL 以及请求体。

请求方法

HTTP/1.1支持多种请求方法 ( method ),如下图:

image.png

图中的数字表示的是支持该方法的最低 HTTP 协议版本,例如我们从图中可以看到HTTP/0.9只支持GET方法。在工作中我们最常用到的是 GETPOST 方法。下面我们简单来聊一下这两种方法的区别。