HTTP 基础

119 阅读6分钟

HTTP 协议简介

Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器等一系列运作流程。而协议是指规则的约定。可以说,Web是建立在 HTTP 协议上通信的。

HTTP 协议定义 Web 客户端如何从 Web 服务器请求 Web 页面,以及服务器如何把 Web 页面传送给客户端。

HTTP 协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。

服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

HTTP是不保存状态的协议,既无状态协议,协议本身对于请求或响应之间的通信状态不进行保存,因此连接双方不能知晓对方当前的身份和状态。

这也是Cookie技术产生的重要原因之一:客户端的状态管理。浏览器会根据从服务器端发送的响应报文内 Set-Cookie 首部字段信息自动保持 Cookie。而每次客户端发送 HTTP 请求,都会在请求报文中携带 Cookie,作为服务端识别客户端身份状态的标识

TCP/IP 协议族

为了更好的了解HTTP协议,我们必须先了解一下 TCP/IP 协议族。

TCP/IP 协议族是Internet最基本的协议,HTTP协议是它的一个子集。TCP/IP协议族按层次分为以下四层:

应用层

应用层规定了向用户提供应用服务时通信的协议,如:

TCP/IP 协议族内预存了各类通用的应用服务协议。比如,FTP(File Transfer Protocol,文件传输协议)、DNS(Domain Name System,域名系统)以及 HTTP 协议。

DNS 提供域名解析功能。例如 www.baidu.com 到 IP 地址(119.75.217.109)之间的解析服务。

传输层

传输层对接上层应用层,提供处于网络连接中两台计算机之间的数据传输所使用的协议。

在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。

TCP 协议是全双工的,即发送数据和接收数据是同步进行的,就好像我们打电话一样,说话的同时也能听见。TCP 协议在建立和断开连接时有三次握手和四次挥手,因此在传输的过程中更稳定可靠但同时就没 UDP 那么高效了。

UDP 协议是面向无连接的,也就是说在正式传递数据之前不需要先建立连接。UDP 协议不保证有序且不丢失的传递到对端,也就是说不够稳定,但也正因如此,UDP 协议比 TCP 更加高效和轻便。

网络层

网络层规定了数据通过怎样的传输路线到达对方计算机传送给对方(IP协议等)。

与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的所用就是在众多的选项内选择一条传输路线。就跟携程提供的回家路线图作用一样。

链路层

用来处理连接网络的硬件部分,包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。

硬件上的范畴均在链路层的作用范围之内。

一般的 Web 应用的通信传输流是这样的:

image.png

发送端在层与层之间传输数据时,每经过一层时会被打上一个该层所属的首部信息。

反之,接收端在层与层之间传输数据时,每经过一层时会把对应的首部信息去除。

串行连接、持久连接、管道化持久连接、http 2.0 多路复用简介

串行连接

HTTP有无连接的特性,即每次连接只能处理一个请求,收到响应后立即断开连接。

HTTP/1.0 版本(称为串行连接或短连接、短轮询)中每次HTTP通信后都要断开TCP连接,所以每个新的HTTP请求都需要建立一个新的连接。

但在现在网站动则几十条HTTP请求的情况下,很容易达到浏览器请求上限,并且每次请求都建立新的tcp连接(每次都有三次握手四次挥别)极大的增加了通信开销。

持久连接

为解决这个问题,有人提出了持久连接(也叫长连接、长轮询)。

一定时间内,同一域名下的HTTP请求,只要两端都没有提出断开连接,则持久保持TCP连接状态,其他请求可以复用这个连接通道。

HTTP/1.1 实现并默认了所有连接都是持久连接,这样客户端发起多个HTTP请求时就减少了TCP握手造成的网络资源和通信时间的浪费。

但是持久连接采用阻塞模式,下次请求必须等到上次响应返回后才能发起,如果上次的请求还没返回响应内容,下次请求就只能等着(就是常说的线头阻塞)。

管道化持久连接

管道化则可以不用等待响应返回而发送下个请求并按顺序返回响应,现代浏览器并未默认开启管道化。

HTTP/2.0 多路复用

每个HTTP请求都有一个序列标识符,这样浏览器可以并发多个请求,服务器接收到数据后,再根据序列标识符重新排序成不同的请求报文,而不会导致数据错乱( 细节参照此文)。

同样,服务端也可以并发返回多个响应给浏览器,浏览器收到后根据序列标识重新排序并归入各自的请求的响应报文。并且同一个域名下的所有请求都复用同一个TCP连接,极大增加了服务器处理并发的上限。

WebSocket

WebSocket是HTML5提出的一种客户端和服务端通讯的全双工协议,由客户端发起请求,建立连接之后不仅客户端可以主动向服务端发送请求,服务端可以主动向客户端推送信息

  • 图 a 中,串行连接每次发起请求都必须建立新的 TCP 连接
  • 图 b 中,持久连接多个 HTTP 请求可以复用同一个 TCP 连接,但是请求必须在上次响应返回之后进行
  • 图 c 中,管道化连接也可以复用同一个 TCP 连接,并且可以不用等待发出多个 HTTP 请求,但是响应必须按顺序返回

URI

HTTP 协议使用 URI 定位互联网上的资源。概念:

  • URI(Universal Resource Identifier:统一资源标识符)
  • URL(Universal Resource Locator:统一资源定位符)
  • URN(Universal Resource Name:统一资源名称)

个人理解URI是一个资源文件的不同表示方法的总称。比如一个文件 a.html ,既可以用这个文件的名字 a.html 来表示,也可以用文件路径 www.baidu.com/a.html 来表示,甚至可以用 urn:a:1535-3613 这样的标识符来表示。他们的关系如下:

更多