前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HTTP 协议简介

HTTP 协议简介

作者头像
用户3147702
发布2022-06-27 12:35:43
6060
发布2022-06-27 12:35:43
举报
文章被收录于专栏:小脑斧科技博客

1. 概述

HTTP 协议是超文本传送协议(HyperText Transfer Protocol)的缩写,它是万维网(World Wide Web,www,也简称为Web)的基础。HTTP协议设计之初就是为了实现Web的想法。 HTTP协议位于 TCP/IP 协议栈的应用层。 我们在浏览器的地址栏里输入的网站地址叫做 URL(UniformResourceLocator,统一资源定位符) 就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并呈现出客户端需要的网页。

HTTP 是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP) 通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80),我们称这个客户端为用户代理程序(user agent) 应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server) 在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel) 尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层,任何能够提供这种保证的协议都可以被其使用。

2. HTTP 协议的历史

HTTP 协议到现在为止总共经历了 3 个版本的演化。

2.1. HTTP 0.9

第一个HTTP协议诞生于1989年3月。当时Berners-Lee向 CERN(Conseil Europeen pour la Recherche Nucleaire,欧洲核能研究所)提交了一篇名为《信息管理的一个提议》的文章。文章中提出了www网络的构想,不过仅仅在很多方面都只关注了概念,而没涉及到细节。

第一个HTTP协议的版本是HTTP 0.9,它的组成极其简单,因为它只允许客户端发送GET这一种请求,它不包含协议头,每个请求只有一句话,例如:

代码语言:javascript
复制
GET /index.html

由于没有协议头,造成了 HTTP 0.9 协议只支持一种内容,即纯文本。不过网页仍然支持用 HTML 语言格式化,同时无法插入图片。所以 HTTP 0.9 能够支持的应用实在太有限了。一次 HTTP 0.9 的传输首先要建立一个由客户端到 Web 服务器的 TCP 连接,由客户端发起一个请求,然后由 Web 服务器返回页面内容,然后连接会关闭。如果请求的页面不存在,也不会返回任何错误码。

2.2. HTTP 1.0

HTTP 协议的第二个版本是 HTTP 1.0,直到 HTTP 1.0 成为最重要的面向事务的应用层协议。该协议对每一次请求/响应,同样是建立并关闭一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。 HTTP 1.0最显著的变化之一是开始支持客户端通过POST方法向Web服务器提交数据。从此客户端与Web服务器之间不再只能单向地获取数据,而可以实现交互,因此CGI(Common Gate Interface,通用网关接口)开始流行起来,Web上开始出现留言板、论坛等丰富的应用。 HTTP 1.0还有个显著的变化是通过HTTP协议头可以支持各种媒体类型。从此Web上不再仅仅是纯文本的页面,比如图像通过 <img> 的HTML标记开始出现。 HTTP 1.0支持长连接(但默认还是使用短连接),缓存机制,以及身份认证。

HTTP 1.0 是一个成熟的 HTTP 协议,现在很多浏览器和Web服务器都强制要求HTTP协议版本至少是1.0。

2.3. HTTP 1.1

HTTP协议的第三个版本是HTTP 1.1,它就是目前使用最广泛的协议版本。这个版本的HTTP协议已经稳定了,跟HTTP 1.0相比,它新增了很多引人注目的新特性,比如Host协议头,一个HTTP请求的头中可以包含一句例如:

代码语言:javascript
复制
Host: techlog.cn

从此一个Web服务器可以支持挂载多个域名了,无需每个域名都使用独立IP,每个网站可以使用虚拟主机。 另一个HTTP 1.1的新特性是支持部分内容请求/响应,这意味着当客户端请求的数据量很大时,可以分多次发起请求,每次请求只要求获取整块数据的一部分。Web服务器也可以分多次响应,每次只返回整块数据的一部分。这使得流媒体得以实现。

从HTTP 1.1开始,客户端默认与Web 服务器建立长连接,这种连接适合Web上数据量较大的丰富应用,使得资源消耗更少。

HTTP 1.1 相对于 HTTP 1.0 的主要区别体现在: 1. 缓存处理 2. 带宽优化及网络连接的使用 3. 错误通知的管理 4. 消息在网络中的发送 5. 互联网地址的维护 6. 安全性及完整性

2.4. HTTP 2

于2015年5月作为互联网标准正式发布 HTTP 2(原名 HTTP 2.0) HTTP/2的目标包括异步连接复用,头压缩和请求反馈管线化并保留与HTTP 1.1的完全语义兼容。 Facebook对各方案进行了评价并最终推荐了 SPDY 协议。

3. HTTP 请求信息

HTTP 1.1 协议的请求信息包含以下内容:

  • 请求行 — GET /images/logo.gif HTTP/1.1
  • 请求头 — Accept-Language: en\nHost: techlog.cn
  • 空行
  • 其他消息体

请求行和标题必须以<CR><LF>作为结尾。空行内必须只有<CR><LF>而无其他空格。 在HTTP/1.1协议中,所有的请求头,除Host外,都是可选的。

3.1. URI

HTTP协议通过URI(Uniform Resource Identifiers,统一资源定位符)来访问资源。 一个完整的 URI 组成如下: http://user:password@techlog.cn:80/html/article.php?id=10182642&token=mAcX21i8#div3。

HTTP URI 的组成

组成

意义

是否必须

http

协议名称

user

用户名

passowrd

密码

techlog.cn

主机网络地址

80

端口号

/html/article.php

资源路径

id=10182642&token=mAcX21i8

查询参数

div3

锚点

需要注意的是,web 浏览器并不强制用户输入格式规范的 URI,浏览器会对 URI 做一些处理使之符合 HTTP 协议的规范。 如用户没有提供资源路径,则浏览器会自动添加 / 作为资源路径。

3.2. 请求方法

HTTP/1.1协议中共定义了八种方法,来表明Request-URI指定的资源的不同操作方式。 1. OPTIONS — 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*’的请求来测试服务器的功能性 2. HEAD — 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息 3. GET — 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web 应用程序中。其中一个原因是GET可能会被网络蜘蛛等随意访问 4. POST — 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改 5. PUT — 向指定资源位置上传其最新内容 6. DELETE — 删除指定资源 7. TRACE — 回显服务器收到的请求 8. CONNECT — HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)

3.3. 请求头 HEADER

请求头除 Host 外均是可选的:

HTTP/1.1 请求头常见字段

字段

意义

Accept

客户端可以处理的媒体类型(MIME-Type),按优先级排序;在一个以逗号为分隔的列表中,可以定义多种类型和使用通配符

Accept-Language

客户端支持的自然语言列表

Accept-Encoding

客户端支持的编码列表

User-Agent

客户端环境类型

Host

服务器端的主机地址

Connection

连接类型,默认为Keep-Alive

Modify-Time

资源更新时间

Content-Length

资源大小

3.4. Expect 请求

HTTP/1.1 协议规定了 Expect 请求:

代码语言:javascript
复制
{ "Expect" : "100-continue" }

客户端可以通过 Expect 请求测试服务器是否支持 POST 请求,比如 libcurl 会在 POST 数据大于 1024 字节时自动在 POST 前发送 Expect 请求。

按照协议规定,如果服务端支持 POST 大数据,则需要返回应答。

代码语言:javascript
复制
HTTP/1.1 100 Continue \r\n

否则返回 417 Expectation Failed。

4. 服务器响应

服务器响应由下列信息构成:

  • HTTP 协议头
  • 空行
  • web 资源内容

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

4.1. 状态代码

状态代码的第一个数字代表当前响应的类型。

  • 1xx消息 — 请求已被服务器接收,继续处理
  • 2xx成功 — 请求已成功被服务器接收、理解、并接受
  • 3xx重定向 — 需要后续操作才能完成这一请求
  • 4xx请求错误 — 请求含有词法错误或者无法被执行
  • 5xx服务器错误 — 服务器在处理某个正确请求时发生错误

下面列举常见情况:

  • 客户端错误 100 — Continue 继续。 101 — witching Protocols 交换协议。
  • 成功 200 — OK。 201 — Created 已创建。 202 — Accepted 已接收。 203 — Non-Authoritative Information 非认证信息。 204 — No Content 无内容。 205 — Reset Content 重置内容。 206 — Partial Content 部分内容。
  • 重定向 300 — Multiple Choices 多路选择。 301 — Moved Permanently 永久转移。 302 — Found 暂时转移。 303 — See Other 参见其它。 304 — Not Modified 未修改。 305 — Use Proxy 使用代理。 307 — Temporary Redirect 临时重定向。
  • 客户端错误 400 — Bad Request 错误请求。 401 — Unauthorized 未认证。 402 — Payment Required 需要付费。 403 — Forbidden 禁止访问。 404 — Not Found 未找到。 405 — Method Not Allowed 方法不允许。 406 — Not Acceptable 不接受。 407 — Proxy Authentication Required 需要代理认证。 408 — Request Time-out 请求超时。 409 — Conflict 冲突。 410 — Gone 失败。 411 — Length Required 需要长度。 412 — Precondition Failed 条件失败。 413 — Request Entity Too Large 请求实体太大。 414 — Request-URI Too Large 请求URI太长。 415 — Unsupported Media Type 不支持媒体类型。 416 — Requested range not satisfiable。 417 — Expectation Failed 不支持 Expect 请求(见上文介绍)
  • 服务端错误 500 — Internal Server Error 服务器内部错误。 501 — Not Implemented 未实现。 502 — Bad Gateway 网关失败。 503 — Service Unavailable 不支持的。 504 — Gateway Time-out 网关超时。 505 — HTTP Version not supported HTTP版本不支持。

HTTP状态码是可扩展的。HTTP应用程序不需要理解所有已注册状态码的含义。 用户代理(user agent)应当把实体和响应一起提交给用户,因为实体很可能包括人可读的关于解释不正常状态的信息。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小脑斧科技博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 概述
  • 2. HTTP 协议的历史
    • 2.1. HTTP 0.9
      • 2.2. HTTP 1.0
        • 2.3. HTTP 1.1
          • 2.4. HTTP 2
          • 3. HTTP 请求信息
            • 3.1. URI
              • 3.2. 请求方法
                • 3.3. 请求头 HEADER
                  • 3.4. Expect 请求
                  • 4. 服务器响应
                    • 4.1. 状态代码
                    相关产品与服务
                    云服务器
                    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档