HTTP 协议

HTTP 协议

1. HTTP 的诞生

HTTP 协议是超文本传输(Hyper Text Transfer Protocol)协议的简称,是一种网络信息传输协议。最初,为了构建一个能够相互分享知识的互联网络(万维网,World Wide Web),研究者提出了三种WWW构建技术,分别是:用于展示页面的文本标记语言HTML(Hyper Text Markup Language,超文本标记语言),用于传输文档的网络传输协议 HTTP (Hyper Text Transfer Protocol)和用于定位资源地址的标识符URL(Uniform Resource Locator,统一资源定位符)。

其中 HTTP 协议是web构建的技术之一。个人理解,简单的说,HTTP 协议主要定义了客户端发送请求(Requests)的过程和服务器发送响应(Responses)的过程。本文将首先简述web浏览器与服务器的通信过程;然后分别简述 HTTP 请求与响应的机制。其中的主要内容是 HTTP 报文的组织结构与内容,HTTP 请求报文包含:请求行、请求头(Header)、空行和请求主体;HTTP 响应报文包含:响应行、响应头、空行和响应主体。可见 HTTP 请求报文与响应报文结构上是一致的。

2. web浏览器与服务器的通信过程

以获取一个百度首页为例,当浏览器输入 www.baidu.com 后,浏览器与服务器之间如何进行通信。

  1. 浏览器搜索自身DNS缓存,如果存在则直接访问返回的IP;否则搜索系统中的 DNS 缓存,如果存在则直接访问返回的 IP ;否则搜索硬盘中的 host 文件,同理存在 IP 则返回;否则向运营商服务器或域名服务器发送 DNS 解析请求,返回 IP 地址;
  2. 浏览器获取 IP 地址后,浏览器与服务器建立TCP连接(3次请求);
  3. TCP 连接建立后,浏览器向服务器发送HTTP 请求报文;
  4. 服务器接收到请求报文后,根据 HTTP 请求报文信息,进行后台处理,然后发送响应报文;
  5. 浏览器接收到响应报文后,会解析和渲染报文中的HTML页面,其中的 JS、CSS、图片等静态资源会继续通过 HTTP 请求加载。资源加载完成后,完整的页面就展现出来了;
  6. 最后,浏览器如果没有后续请求,则断开与服务器的 TCP 连接(4次挥手)。注:HTTP 协议虽然是无连接的协议,但 HTTP 1.1 在HTTP 请求头中添加一个字段 Connection: Keep-Alive,当使用了 Keep-Alive 模式,则客户端与服务器之间就可以进行持久连接(并非每次请求之后都断开 TCP 连接)

上述过程只是简单的概括,实际过程远比这复杂。

基于 HTTP 协议进行的网络传输是无连接无状态的,这意味着每次传输之后会断开连接,下次连接在进行重连;同时,每次通信不会保存状态信息,每次通信都是独立的。针对这两个问题,HTTP 协议也提供了一些解决方案。首先,下文将分别介绍请求与响应报文内容,然后简述针对无连接与无状态问题,协议所提供的一些解决方案。

3. HTTP 请求报文

HTTP 请求报文包括请求行、请求头部(Header)、空行和请求主体,如下图所示(没有请求主体):

[外链图片转存失败(img-lrfpMglt-1566805130984)(HTTP s://pic4.zhimg.com/v2-f243c10fdc19d6e6d6b2683f96c47263_b.png)]

请求行(图中第一行)由请求方式、资源路径和协议构成,各个元素之间用空格隔开。请求头部(图中第二行至最后一行)由主机名、用户代理信息等元素构成。请求主体(图中不包含)是可选的,请求报文可以没有请求主体。请求主体主要存放一些发送的数据,一般 GET 请求会将参数放在 URL 中,也就是在请求头中而请求主体一般为空,而 POST 请求将参数放在请求主体中。请求主体可以传一些 json 数据或者字符串等等。

其中, HTTP 1.1 协议中共定义了八种请求方式来以不同方式操作指定的资源:GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT。方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回[状态码405](HTTP s://zh.wikipedia.org/wiki/HTTP 状态码#405)(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回[状态码501](HTTP s://zh.wikipedia.org/wiki/HTTP 状态码#501)(Not Implemented)。HTTP 服务器至少应该实现GET和HEAD方法,其他方法都是可选的。此外,除了上述方法,特定的HTTP 服务器还能够扩展自定义的方法。例如:PATCH(由 [RFC 5789](HTTP s://tools.ietf.org/html/rfc5789) 指定的方法)。

8种请求方式中,我们使用最频繁的就是GET与POST。GET 请求一般用于信息的获取,不会对服务器产生副作用,不会影响资源的状态。POST 请求一般向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件),数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

4. HTTP 响应报文

HTTP 响应报文包括响应行、响应头、空行和响应主体,如下图所示:

[外链图片转存失败(img-ZTVVHEF7-1566805130986)(HTTP s://pic1.zhimg.com/v2-127fe6d1e97ea2293108f085d9a55b04_b.png)]

响应行(图中第一行)由协议和状态码构成。响应头(图中二到四行)由服务器名等元素构成。响应主体一般是请求返回的 HTML 页面或 JSON 等类型的数据。

其中,HTTP 协议利用响应行中的状态码以及描述状态的短语来表示服务器对客户端响应的结果。状态码一般由3位构成:

  • 1xx 消息: 请求已被服务器接收,继续处理;
  • 2xx 成功: 请求已别服务器成功处理;
  • 3xx 重定向: 需要后续操作才能完成该请求;
  • 4xx 请求错误: 客户端请求存在错误,服务器无法处理;
  • 5xx 服务器错误: 服务器在处理一个正确的请求时发生错误。

状态码对应的描述短语,在 [RFC 2616](HTTP s://tools.ietf.org/html/rfc2616) 中做了一些推荐,常用的例如:

  • 200 OK : 请求成功。一般用于GET与POST请求;
  • 301 Moved Permanently : 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替;
  • 302 Moved Temporarily : 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI;
  • 400 Bad Request : 客户端请求的语法错误,服务器无法理解;
  • 401 Authorized : 请求要求用户的身份认证;
  • 403 Forbidden : 服务器理解请求客户端的请求,但是拒绝执行此请求;
  • 404 Not Found : 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面;
  • 500 Internal Server Error : 服务器内部错误,无法完成请求;
  • 503 Service Unavailable : 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中。

HTTP 协议的请求报文和响应报文,均包含首部信息(请求头与响应头),这些首部信息为客户端和服务器在进行请求和响应时提供必要的信息。下文将简述一些首部信息。

5. HTTP 首部信息

HTTP 1.1 协议,在 RFC2616 中共定义了47种首部信息字段,这些首部信息根据实际用途可被分为以下4种类型:

  1. 通用首部字段(General Header Fields):共9个,请求和响应报文都会使用的首部字段,常用的字段有:Cache-Control、Connection、Date 等。
  2. 请求首部字段(Request Header Fields):共19个,请求报文中使用的首部字段,用来补充请求的附加信息、客户端信息、响应内容相关优先级等信息,常用的字段有:Accept、Accept-Encoding、Accept-Language、User-Agent 等。
  3. 响应首部字段(Response Header Fields):共9个,响应报文中使用的首部信息,用于响应的附加信息,也会要求客户端附加额外的信息,常用的字段有:Server 等。
  4. 实体首部字段(Entity Header Fields):共10个,针对报文中实体部分使用的首部字段,用于补充实体内容更新时间等与实体有关的信息,常用的字段有:Content-Encoding、Content-Language、Content-Type、Expires 等。

但是还有一些非正式的首部字段被收纳在 RFC4229 中,其中包括一些常用字段,例如:Cookie 、Set-Cookie 和 Content-Disposition 等字段。

6. 其他

上文提及基于 HTTP 协议的网络传输是无连接无状态的。而在某些场景下,需要打破无连接无状态的情况,进行持久连接会话追踪。下面简单介绍一点持久连接和会话追踪的方案。

持久连接

无连接意味着每进行一次“请求-响应”,都得重新进行一次 TCP 连接。为解决此问题,在 HTTP 协议中,增加了 Keep-Alive 模式。当设置字段 Connection: Keep-Alive 时,则连接将处于 Keep-Alive 连接模式。该模式下,当客户端对服务器进行过一次请求后,TCP 连接将保持,之后的请求都不会重新建立 TCP 连接。

会话追踪

无状态意味着每次“请求-响应”都是独立的,每次会话之间不会保存用户信息等可能被多个会话所公用的状态信息,但在默写场景需要将状态信息进行保存。针对这个问题,常用的会话追踪方式有:

  1. URL重写:URL重写技术一般是在URL结尾附加一个参数用于表示该会话,当将会话ID传递给服务器后,服务器可以通过该ID进行查询会话状态。
  2. Cookie:Cookie 是服务器发送给客户端的一段信息,当客户端发送请求时会读取之前的Cookie并将其转发给服务器,从而保持会话的状态信息。
  3. 隐藏表单域:该技术将会话ID添加到隐藏的表单元素中,然后在发送请求时将表单发送给服务器,服务器读取表单内容识别会话。

本文仅介绍了 HTTP 协议的基本内容,使得读者对 HTTP 协议有个基本了解。

参考资料

[HTTP s://www.zhihu.com/search?q=HTTP %E5%8D%8F%E8%AE%AE&utm_content=search_suggestion&type=content](HTTP s://www.zhihu.com/search?q=HTTP 协议&utm_content=search_suggestion&type=content)

图解HTTP 协议

[HTTP s://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE](HTTP s://zh.wikipedia.org/wiki/超文本传输协议)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值