Alex_McAvoy

想要成为渔夫的猎手

HTTP 协议

【概述】

通过超文本传输协议(Hypertext Transfer Protocol,HTTP),定义了万维网客户进程(浏览器)如何向万维网服务器请求万维网文档,以及服务器如何将文档传送给浏览器

从层次的角度来看,HTTP 是面向事务的应用层协议,其基于 TCP 协议,保障数据的可靠传输,但其本身是无连接的,即 HTTP 虽然使用了 TCP 连接,但通信双方在交换 HTTP 报文时,不需要建立 HTTP 连接

在同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时相同,因为服务器不记得曾经访问过的这个客户,也不记得为该客户曾服务过多少次,因此,HTTP 协议是无状态的,这简化了服务器的设计,使服务器更容易支持大量并发的 HTTP 请求

在实际应用中,通常使用 Cookie 加数据库的方式来追踪用户活动,Cookie 是存储在用户主机的文本文件,其中包含一串识别码,用于令 Web 服务器来识别服务,Web 服务器根据 Cookie 就能从其数据库中查询到该用户的活动记录,进而执行一些个性化的工作

【HTTP 操作过程】

从 HTTP 协议的执行过程来说,当浏览器要访问 WWW 服务时,大致工作流如下:

  1. 通过 DNS 来完成对 WWW 服务器的域名解析,一旦获取服务器的 IP 地址,浏览器会通过 TCP 来向服务器发送建立连接请求
  2. 每个万维网站点都有一个服务器进程,其不断地监听 TCP 的 $80$ 端口,当监听到连接请求后,就与浏览器建立连接
  3. TCP 连接建立后,浏览器就向服务器发送请求来获取某一 Web 页面的 HTTP 请求
  4. 在服务器收到 HTTP 请求后,将构建所请求的 Web 页面的信息,并通过 HTTP 响应返回给浏览器
  5. 浏览器将返回的信息进行解释,之后将 Web 页面显示给用户
  6. 通信完成,TCP 连接释放


以用户单击 HTML 页面的 www.baidu.com/images/index.html 的超链接为例,在单击后,发生的事件顺序如下:

  1. 浏览器分析链接指向页面的 URL:www.baidu.com/images/index.html
  2. 浏览器向 DNS 请求解析 www.baidu.com
  3. DNS 解析出 www.baidu.com 的 IP 地址
  4. 浏览器与该 IP 地址对应服务器建立 TCP 连接(默认端口号 $80$)
  5. 浏览器发出 HTTP 请求:GET /images/index.html
  6. 服务器通过 HTTP 响应将文件 index.html 发送给浏览器
  7. TCP 连接释放
  8. 浏览器将文件 index.html 进行解释,并展现给用户

【连接方式】

由于 HTTP 是无连接的,也就是说,在收发 HTTP 报文时,是基于 TCP 连接的

根据 TCP 连接是否在发送完响应后断开,HTTP 可分为持久连接与非持久连接

1.持久连接

持久连接,就是万维网服务器在发送响应后,仍然保持这条 TCP 连接,使同一个客户和服务器可以继续在这条连接上传送后续的 HTTP 请求和响应报文

持久连接又分为流水线和非流水线两种方式:

  • 非流水线方式:客户在收到前一个响应后,才能发出下一个请求
  • 流水线方式:客户采用流水线的方式,接收响应与发送请求

2.非持久连接

非持久连接,就是在每一个 HTTP 请求发送后,都建立一条 TCP 连接,在服务器响应后,断开该 TCP 连接

也就是说,请求一个万维网文档所需的时间,是该文档的传输时间加上两倍的 RTT,其中,一个 RTT 用于 TCP 连接,另一个 RTT 用于请求和接收文档

【HTTP 报文结构】

类型

HTTP 是面向文本的,因此,在报文中的每个字段都是一些 ASCII 码,且每个字段的长度都是不确定的

在浏览器与服务器间请求和响应的交互,必须按照规定的格式和一定的规则,这些格式和规则就是 HTTP,因此,HTTP 有两类报文:

  • HTTP 请求报文:从 Web 客户端向 Web 服务器发送服务请求
  • HTTP 响应报文:从 Web 服务器向 Web 客户端发送服务响应

请求报文

HTTP 请求报文由开始行、首部行、实体主体组成,具体格式如下图

其中,开始行也称请求行,其各字段含义如下:

  • 方法:请求报文采用的各种方法,如 GETPOSTPUT
  • URL:即所请求的资源的 URL
  • 版本:HTTP 的版本

常见的方法及作用如下表:

响应报文

HTTP 响应报文由开始行、首部行、实体主体组成,具体格式如下图

其中,开始行也称状态行,其各字段含义如下:

  • 版本:HTTP 的版本
  • 状态码:反映请求状态的代码
  • 短语:解释状态码的简单短语

状态码都是三位数字,其基本含义如下:

  • 1xx:表示通知信息,如请求收到了或正在进行处理
  • 2xx:表示成功,如接受或知道了
  • 3xx:表示重定向,表示要完成请求还必须采取进一步的行动
  • 4xx:表示客户的差错,如请求中有错误的语法或不能完成
  • 5xx:表示服务器的差错,如服务器失效无法完成请求
感谢您对我的支持,让我继续努力分享有用的技术与知识点!