刨析 HTTP

HTTP/0.9
HTTP/1.0
HTTP/1.1 1999
HTTP/2.0 2014
HTTP/3.0 2019

简单高效是一剂猛药,但也并非没有副作用,恰恰因为其HTTP/1.1版本的简单高效导致其二十多年驻足不前。 可能有 小伙伴经常在技术网站 看到过于HTTP/ 2.0 甚至是HTTP / 3.0 的讨论,但 残酷的嘴上都说HTTP/2.0怎么怎么高效,但是实际应用还是摆脱不了HTTP/1.1的真香定律 。所以今天老张介绍的也是以HTTP/1.1为主。

说了这么多的HTTP简单,到底有多简单呢?

请求,响应,没了……

因为HTTP协议是基于TCP的应用协议,而TCP协议是可靠通信,所以完全可以 将HTTP通信简单的看作一来一往的两条数据流,甚至HTTP报文都是基于文本而不是二进制的 。下面老张将分别介绍一下请求报文和响应报文。

7层网络模型和4层网络模型

02

请求报文

HTTP请求报文结构

一条HTTP请求报文有三部分构成: 请求行,请求头,请求体 。其中请求体是可选的。

请求行

请求行位于HTTP请求的开始,由请求方法、请求地址和使用的HTTP协议版本组成,它们之间通过空格分隔,最后用回车换行(\r\n)结束。上图中使用的请求方法是GET(比较常见的还有POST),请求的地址为http://www.example.com/index.html,使用的协议版本为HTTP/1.1。

请求头

请求头由多个Key: Value形式组合而成,它们之间通过回车换行分割,最后通过两个连续的回车换行标识请求头的结束。

请求体一般出现POST或者PUT方式的请求中,其本身并不是请求报文的必须部分,这里老张不多介绍,现在一块来看一下一个完整的请求报文。

注意最后的光标

03

响应报文

HTTP响应报文结构

同请求报文一样,响应报文也是有三部分构成: 响应行、响应头和响应体

响应行

响应行同样由三部分组成,但是又与请求行有所区别,分别是 响应协议,响应状态码和响应描述,以回车换行标识结束 。上图的响应行表示,服务器使用的HTTP版本是1.1,状态码200和状态描述OK表示正常生成了响应数据。

响应头

同请求头一样, 应头也是一组Key:Value的组合,最后以两个连续的回车换行标识响应头的结束。

响应体

响应体就是服务器返回给客户端的网络资源了,上图表示服务器返回了一条HTML格式的数据。

现在再来看一下一条完整的响应报文。

可以看到响应头和响应体之间多了一个空行

04

结语

整个流程在浏览器的展示

看完了老张的介绍,相信各位肯定也理解了HTTP协议的本质——请求+响应。

下一篇老张准备在本文的基础上介绍一下爬虫以及如何应对“流氓爬虫”。