HTTP基础

一、基础概念

1.1 Web基础

HTTP(HyperText Transfer Protocol,超文本传输协议)。WEB使用HTTP协议作为规范,完成从客户端到服务器端等一系列运作流程。

构建WWW(Word Wide Web)的三种技术:HTML(作为页面的文本标记语言)、HTTP(作为文档传输协议)、URL(指定文档所在地址)。

超文本(HyperText):多文档之间相互关联。

RFC(Request for Comments,征求修正意见书),互联网的设计文档。

1.2 URL

URI (Uniform Resource Indentifier,统一资源标识符)包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基本都是 URL。

  • URL(Uniform Resource Locator,统一资源定位符);
  • URN(Uniform Resource Name,统一资源名称),例如 urn:isbn:0-486-27557-4 。
1.2.1 URL格式

这里写图片描述

1.3 请求和响应报文

用于 HTTP 协议交互的信息被称为 HTTP 报文。HTTP 报文本身是由多行(由 CR+LF 作换行符)数据构成的字符串文本。——(CR:Carriage Return,回车,16进制 0x0d;LF:Line Feed,换行,16进制 0x0a)

HTTP 报文大致分为报文首部和报文主体两部分。两者由空行( CR+LF )划分。通常,不一定要有报文主体。

  • 报文首部:服务器端或客户端需处理的请求或响应的内容及属性;
  • 报文主体:应被发送的数据。

请求报文和响应报文的结构如下:

这里写图片描述

1.3.1 请求报文

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:

  • 请求行(request line),包括用于请求的方法、请求URI和 HTTP 版本
  • 请求首部字段,包括请求的各种条件和属性的各类首部
  • 空行
  • 请求数据

下图给出了请求报文的一般格式。

这里写图片描述

1.3.2 响应报文

接收到请求的服务器,会将请求内容的处理结果以响应的形式返回。HTTP响应消息也由四个部分组成,分别是:

  • 状态行,包括 HTTP 版本、标明响应结果的状态码和对应原因短语
  • 响应首部字段,包括响应的各类条件和属性的各类首部
  • 空行
  • 响应正文

这里写图片描述

二、HTTP 方法

——告知服务器意图:指定请求的资源按期望产生某种行为。

2.1 GET:获取资源

用来请求已被URL识别的资源。(若是文本则原样返回,若是CGI程序,则返回执行后的输出结果)

2.2 POST:传输实体主体数据

POST 主要目的不是获取响应的主体内容,而是传输实体的主体数据

GET与POST带参数

GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL中,而 POST 的参数存储在实体主体部分

GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
  • GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 URL 是可见的,可能会泄露私密信息。
  • 并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。
2.3 HEAD:获取报文首部

和 GET 方法一样,但是不返回报文主体部分。主要用于确认 URL 的有效性以及资源更新的日期时间等。

2.4 PUT:上传文件

用于传输文件:在请求报文的主体中包含文件内容,然后保存到请求URL指定的位置。由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般 WEB 网站不使用该方法。

2.5 DELETE:删除文件

与 PUT 功能相反,按请求URL删除指定的资源,并且同样不带验证机制。

2.6 OPTIONS:查询支持的方法

查询指定的 URL 能够支持的方法。

会返回 Allow: GET, POST, HEAD, OPTIONS 这样的内容。

2.7 RACE:追踪路径

服务器会将通信路径返回给客户端。

发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务器就会减 1,当数值为 0 时就停止传输。

TRACE 一般不会使用,并且它容易受到 XST 攻击(Cross-Site Tracing,跨站追踪),因此更不会去使用它。

这里写图片描述

2.8 CONNECT:要求用隧道协议连接代理

要求在于代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。

主要使用 SSL(Secure Sokets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
这里写图片描述

三、HTTP 状态码

服务器返回的响应报文中第一行为状态行,包含了协议版本、状态码以及原因短语,来告知客户端请求的结果。状态码负责标识客户端 HTTP 请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。

状态码如 200 OK,以 3 位数字和原因短语组成。第一位指定响应类别,后两位无分类。响应类别有以下 5 种。

状态码类别原因短语
1XXInformational(信息性状态码)接收的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务器错误状态码)服务器处理请求出错
3.1 2XX 成功

2xx 的响应结果表明请求被正确处理了。

  • 200 OK :表示从客户端发来的请求在服务器端被正常处理了。但是在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变(如 GET 和 HEAD 方法)。
  • 204 No Content服务器接受的请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要对客户端返回新内容时使用。
  • 206 Partial Content :该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。
3.2 3XX 重定向

3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。

  • 301 Moved Permanently:永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。
  • 302 Found:临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
  • 303 See Other
    • 注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会在301、302 和 303 状态下的重定向时把 POST 方法改成 GET 方法
  • 304 Not Modified:该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况,直接返回304 状态码,不包含任何响应的主体部分。附带条件的请求例如:If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since。
  • 307 Temporary Redirect:临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法
3.3 4XX 客户端错误

4XX 的响应结果表明客户端发生错误及原因。

  • 400 Bad Request:请求报文中存在语法错误
  • 401 Unauthorized:该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。如果之前已进行过一次请求,则表示用户认证失败。

这里写图片描述

  • 403 Forbidden:请求资源的访问被服务器拒绝,服务器端没有必要给出拒绝的详细理由。未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源 IP 地址试图访问)等列举的情况都可能是发生 403 的原因。
  • 404 Not Found :该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
3.4 5XX 服务器错误

5XX 的响应结果表明服务器本身发生错误。

  • 500 Internal Server Error:服务器正在执行请求时发生错误。也有可能是 Web 应用存在的 bug 或某些临时的故障。
  • 503 Service Unavilable:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入 RetryAfter 首部字段再返回给客户端。
3.5 状态码和状况的不一致

不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比如 Web 应用程序内部发生错误,
状态码依然返回 200 OK,这种情况也经常遇到。

四、HTTP首部

HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客户端和服务器分别处理请求和响应提供
所需要的信息。对于客户端用户来说,这些信息中的大部分内容都无须亲自查看。

有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。各种首部字段及其含义如下(不需要全记,仅供查阅):

4.1 通用首部字段

——请求报文和响应报文都会使用的首部字段。

首部字段名说明
Cache-Control控制缓存的行为
Connection逐跳首部、 连接的管理
Date创建报文的日期时间
Pragma报文指令
Trailer报文末端的首部一览
Transfer-Encoding指定报文主体的传输编码方式
Upgrade升级为其他协议
Via代理服务器的相关信息
Warning错误通知
4.2 请求首部字段

——补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。

首部字段名说明
Accept用户代理可处理的媒体类型及相对优先级
Accept-Charset用户代理支持的字符集及相对优先顺序
Accept-Encoding用户代理支持的内容编码及优先级顺序
Accept-Language用户代理可处理的自然语言集(自然语言)及相对优先级
Authorization用户代理的认证信息
Expect期待服务器的特定行为
From用户的电子邮箱地址
Host****请求资源所在服务器
If-Match比较实体标记(ETag)
If-None-Match比较实体标记(与 If-Match 相反)
If-Modified-Since比较资源的更新时间
If-Unmodified-Since比较资源的更新时间(与If-Modified-Since相反)
If-Range资源未更新时发送实体 Byte 的范围请求
Max-Forwards最大传输逐跳数
Proxy-Authorization代理服务器要求客户端的认证信息
Range实体的字节范围请求
Referer对请求中 URI 的原始获取方
TE客户端能处理的传输编码方式及相对优先级—>用于传输编码
User-AgentHTTP 客户端程序的信息
4.3 响应首部字段

——补充了响应的附加内容,也会要求客户端附加额外的内容。

首部字段名说明
Accept-Ranges告知客户端服务器是否能处理范围请求
Age推算资源创建经过时间
ETag资源的唯一性标识,由服务器分配
Location令客户端重定向至指定URI
Proxy-Authenticate把代理服务器所要求的认证信息发送给客户端
Retry-After对客户端再次发起请求的时机要求
Server当前服务器上安装的 HTTP 服务器应用程序的信息
Vary源服务器对代理服务器的缓存控制
WWW-Authenticate服务器对客户端的认证信息
4.4 实体首部字段

——针对请求和响应报文的实体部分使用的首部字段。补充了资源内容更新时间等与实体有关的信息。

首部字段名说明
Allow告知客户端指定资源可支持的所有 HTTP 方法
Content-Encoding告知客户端服务器对实体主体选用的编码方式
Content-Language告知客户端实体主体使用的自然语言
Content-Length实体主体的大小(单位: 字节)
Content-Location报文主体返回资源对应的 URI
Content-MD5实体主体的报文摘要
Content-Range响应返回实体主体的位置范围
Content-Type实体主体内对象的媒体类型
Expires告知客户端实体主体过期的时间
Last-Modified资源的最后修改时间
4.5 非 HTTP/1.1 首部字段

例如 Cookie、Set-Cookie 和 Content-Disposition 等在其他RFC中定义的首部字段。

首部字段名说明首部类型
Set-Cookie服务器开始管理客户端状态时所使用的 Cookie 信息响应首部字段
Cookie告知服务器客户端想获得 HTTP 状态管理支持时,发送之前的 Cookie请求响应字段
4.5.2 其他首部字段

X-Frame-Options、X-XXS-Protection、DNT、P3P等

五、具体应用

HTTP 协议是无状态的,每当有新的请求发送,就会有新的响应产生,协议本身并不保留之前一切的请求或响应报文的信息。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应及状态不做持久化管理。即 HTTP 协议自身不具备保存和管理之前发送过的请求和响应的功能,也就无法“根据之前的状态进行本次的请求处理”或者“退回至上次的请求状态”或者“保持某个状态”等功能。如要求登录认证的 Web 页面若无法进行状态管理,那么每次跳转新界面就要再次登录,或者在每次请求报文中附加参数来管理登录状态。

HTTP 协议无状态主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务,确保协议的可伸缩性。并且无状态协议本身不必保存状态,就可以减少服务器的CPU及内存的消耗。

为了保留无状态的优势并解决类似的矛盾,HTTP/1.1 引入 Cookie 来保存状态信息

Cookie 根据服务器端发送的响应报文包含的 Set-Cookie 首部字段信息,通知客户端保存 Cookie,客户端得到该响应后把 Cookie 内容保存到浏览器中。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发出去。

服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。Cookie 由服务器端生成,客户端保存并在下次请求时自动添加并发送

发生 Cookie 交互时,HTTP 请求报文和响应报文的内容如下:

这里写图片描述

Set-Cookie 字段有以下属性:

属性说明
NAME=VALUE赋予 Cookie 的名称和其值(必需项)
expires=DATECookie 的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH将服务器上的文件目录作为 Cookie 的适用对象(若不指定则默认为文档所在的文件目录)
domain=域名作为 Cookie 适用对象的域名(若不指定则默认为创建 Cookie 的服务器的域名)
Secure仅在 HTTPS 安全通信时才会发送 Cookie
HttpOnly加以限制,使 Cookie 不能被 JavaScript 脚本访问

Session 和 Cookie 区别

Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文就包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session ID。HTTP 就是 Session 和 Cookie 这两种方式一起合作来实现跟踪用户状态的,而 Session 用于服务器端,Cookie 用于客户端

浏览器禁用 Cookie 的情况

会使用 URL 重写技术,在 URL 后面加上 sid=xxx 。

使用 Cookie 实现用户名和密码的自动填写

网站脚本会自动从 Cookie 中读取用户名和密码,从而实现自动填写。

5.2 缓存

有两种缓存方法:

  • 让代理服务器进行缓存;
  • 让客户端浏览器进行缓存。

Cache-Control 用于控制缓存的行为。

Cache-Control: no-cache 有两种含义,如果是客户端向缓存服务器发送的请求报文中含有该指令,表示客户端不想要缓存的资源;如果是源服务器向缓存服务器发送的响应报文中含有该指令,表示缓存服务器不能对资源进行缓存。

Expires 字段可以用于告知缓存服务器该资源什么时候会过期。当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字段 Expires,会优先处理 max-age 指令。

5.3 持久连接

HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。

当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求该 HTML 页面中包含的图片资源(即获取 HTML 文档,获取图片,获取图片……)。如果每进行一次 HTTP 通信就要断开一次 TCP 连接,连接建立和断开的开销会很大。持久连接只需要进行一次 TCP 连接就能进行多次 HTTP 通信HTTP/1.1开始,所有的连接默认都是持久连接

持久连接的特点:只要任意一端没有明确提出断开连接,则保持TCP连接状态。从而减少了TCP连接的重复建立和断开造成的额外开销,减轻了服务器端的负载。

这里写图片描述

持久连接需要使用 Connection 首部字段进行管理。

  • HTTP/1.1 开始 HTTP 默认是持久化连接的,如果要断开 TCP 连接,需要由客户端或者服务器端提出断开,使用 Connection: close ;
  • HTTP/1.1之前 HTTP 默认是非持久化连接的,如果要维持持续连接,需要使用 Keep-Alive。

同时,持久连接使得多数请求可以以管线化方式发送。若没有持久连接,则发送一个请求之后必须等待并接收到响应才能发送下一个请求,管线化 可以同时并行发送多个请求,而不需要一个一个等待响应。

请求包含其他资源的 HTML 页面,与挨个连接相比,持久连接更快,管线化技术比持久连接更快。并且请求数越多,时间差越明显。

这里写图片描述

5.4 编码

编码(Encoding)主要是为了 对实体进行压缩。常用的编码有:gzip、compress、deflate、identity,其中 identity 表示不执行压缩的编码格式。

5.5 分块传输

分块传输(Chunked Transfer Coding)可以把数据分割成多块,让浏览器逐步显示页面

5.6 多部分对象集合

一份报文主体内可 含有多类型的实体同时发送,每个部分之间用 boundary 字段定义的分隔符进行分隔;每个部分都可以有首部字段。

例如,上传多个表单时可以使用如下方式:

这里写图片描述

5.7 范围请求

如果下载过程中遇到网络中断的情况,而服务器只发送了一部分数据,之前就只能重头开始。范围请求使得客户端能够只请求指定范围的那部分数据 。从而避免服务器端重新发送所有数据,可以完成从中断处恢复下载。

这里写图片描述

具体用法:在请求报文中使用首部字段 Range 指定请求资源的 byte 范围。例如 Range : bytes = 5001-10000; Range : bytes = 5001-; Range : bytes = 0-3000,5000-7000。

针对范围请求,响应成功会返回状态码为 206 Partial Content 的响应报文。另外,对于多重范围的范围请求,响应会在首部字段 Content-Type 标明 multipart/byteranges 后返回响应报文

5.8 内容协商

同一个 Web 网站有可能存在多份相同内容的页面。比如英语版和中文版的 Web 页面,它们内容上虽相
同,但使用的语言却不同。

当浏览器的默认语言为英语(或中文),访问相同 URI 的 Web 页面时,则会显示对应的英语版(或中文版)的 Web 页面。这样的机制称为内容协商(Content Negotiation)。

内容协商机制:客户端和服务器端就响应的内容进行交涉,然后返回最合适的资源。内容协商以语言、字符集、编码方式等为基准判断响应的资源。包含在请求报文中的某些首部字段就是判断的基准,包括:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。

5.9 虚拟主机

使用虚拟主机技术,使得一台服务器拥有多个域名,并且在逻辑上可以看成多个服务器

5.10 通信数据转发程序
5.10.1 代理

代理服务器接受客户端的请求,并且转发给其它服务器。代理服务器一般是透明的,不会改变 URL。

使用代理的主要目的是:缓存、网络访问控制以及记录访问日志

这里写图片描述

5.10.2 网关

与代理服务器不同的是,网关服务器会将 HTTP 转化为其它协议进行通信,从而其它非 HTTP 服务器的服务。

这里写图片描述

5.10.3 隧道

使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。

这里写图片描述

六、HTTPs

HTTP 有以下安全性问题:

  1. 通信使用明文,内容可能会被窃听;
  2. 不验证通信方的身份,因此有可能遭遇伪装;
  3. 无法证明报文的完整性,所以有可能已遭篡改。

HTTPs :并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信,再由 SSL 和 TCP 通信。通过使用 SSL,HTTPs 提供了加密、认证和完整性保护

6.1 加密

有两种加密方式:对称密钥加密和公开密钥加密。

  • 对称密钥加密的加密和解密使用同一密钥;(对称密钥加密的缺点:无法安全传输密钥)
  • 而公开密钥加密使用一对密钥用于加密和解密,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。(公开密钥加密的缺点:相对来说更耗时)

HTTPs 采用混合的加密机制,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。(下图中,共享密钥即对称密钥)

这里写图片描述

6.2 认证

通过使用 证书 来对通信方进行认证。证书中有公开密钥数据,如果可以验证公开密钥的确属于通信方的,那么就可以确定通信方是可靠的。

数字证书认证机构(CA,Certificate Authority)颁发的公开密钥证书,可以通过 CA 对其进行验证。

进行 HTTPs 通信时,服务器会把证书发送给客户端,客户端取得其中的公开密钥之后,就可以开始加密过程。

使用 OpenSSL 这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。浏览器在访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。

客户端证书需要用户自行安装,只有在业务需要非常高安全性时才使用客户端证书,例如网上银行。

6.3 完整性

SSL 提供摘要功能来验证完整性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值