HTTP协议本质(通俗理解)

176 阅读2分钟

HTTP vs TCP

我们知道,HTTP协议作为一个应用层协议,通常运行在传输控制协议TCP(Transmission Control Protocol)之上。这里通俗的解释一下什么叫“应用层协议”,应用层协议只关注业务,重点在如何设计报文、解析报文上,不关注连接是怎么建立的、数据是怎么传输的;而TCP协议恰恰与之相反,它不关注传输的内容,它只负责把连接建立上,把数据传到另一端,而具体传了什么,该怎么解析里面的数据它全不管,在TCP眼里,所有数据,都是一堆字节而已。

HTTP协议

理解了“应用层协议”和“传输控制协议”的分工,你就明白了HTTP协议,其实没有什么高深的地方,只是一个大家都遵守的“报文格式”而已。简单类比,就像平时开发时,前端和后端一起约定的json格式一样,目的是传输数据给对方,并且对方知道如何取数据。

在TCP上发送HTTP

下面我们就实操一下,在一个TCP上发送HTTP报文,实现对一个网站的访问。

  1. 下载一个工具,我这里使用的是NetAssist网络调试助手,界面如下:

image.png

  1. 找一个网站,在“网络设置”里填上域名/端口号这些信息并连接上。

  2. 在“数据发送”框里填上一段文本。这里你就可以看到,http报文实则就是一段纯文本。我们平时用的类似Postman的那些工具,只是提供了一个友好的交互,来生成这一段纯文本而已。下面我解释一下上图中的报文

    GET /templates/chuzhou/xin/css/xin_base.css HTTP/1.1
    Host: img.chuzhou.cn
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
    Referer: <http://www.chuzhou.cn/>
    

image.png

-   第一行指定请求方法(GET)、资源路径和协议版本,注意GET/资源路径/协议版本之间是有空隔的。
-   **`Host`**头字段指定了目标服务器的主机名。
-   **`User-Agent`**头字段标识了发起请求的用户代理(通常是浏览器)。
-   **`Accept`**头字段表示客户端接受的响应内容类型。
-   最后还两个空行,这一点对GET请求很重要,空行也是报文约定的一部分。
  1. 服务端接收到我们发送的这一段报文,就会按约定返回你需要的那一个css文件,当然它他会把相应的响应头给你,如下图,你一看就明白了。
    image.png 同样,返回的报文其实也是一段纯文本而已,浏览器拿到这段纯文本,会解析成并使用里的信息。比如,浏览器发现有这一行Cache-Control: max-age=604800,就会依照约定,启用缓存;发现响应体里面有很多CSS,就会把他们应用到相应的Dom上。