HTTP协议

简介

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

HTTP使用了面向连接的TCP作为传输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。但是,HTTP协议本身是无连接的。这就是说,虽然HTTP使用了TCP连接,但通信的双方在交换HTTP报文之前不需要先建立HTTP连接。

HTTP协议是无状态的(stateless)。也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同

工作原理

HTTP/1.0

在浏览器地址栏键入URL,按下回车之后会经历以下流程(HTTP/1.0):

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
  5. 释放 TCP连接;
  6. 浏览器将该 html 文本并显示内容;  

HTTP/1.1

HTTP/1.0的主要缺点,就是每请求一个文档就要有两倍RTT的开销。 (一个报文段发出的时间,以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间RTT。)

  • 一个RTT用于连接TCP连接
  • 另一个RTT用于请求和接收万维网文档。

HTTP/1.1协议较好地解决了这个问题,它使用了持续连接(persistent connection)。所谓持续连接就是万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行。

HTTP/1.1协议的持续连接有两种工作方式,即非流水线方式(without pipelining)和流水线方式(with pipelining)。

  • 非流水线方式的特点,是客户在收到前一个响应后才能发出下一个请求。
  • 流水线方式的特点,是客户在收到HTTP的响应报文之前就能够接着发送新的请求报文。

HTTP的报文结构

请求报文

方法 URL 版本\r\n
首部字段名:值\r\n
首部字段名:值\r\n
首部字段名:值\r\n
\r\n
请求正文

示例:

GET /http HTTP/1.1
Host: x2d.co
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7,cs;q=0.6,zh-TW;q=0.5
Cookie: i18n_redirected=zh

响应报文

协议版本 状态码 状态码描述\r\n
首部字段名:值\r\n
首部字段名:值\r\n
首部字段名:值\r\n
\r\n 响应正文

示例:

HTTP/1.1 301 Moved Permanently
Server: nginx/1.16.1
Date: Thu, 28 Oct 2021 14:12:54 GMT
Content-Type: text/html
Content-Length: 169
Location: http://x2d.co/http/
Connection: keep-alive