HTTP(CS-Notes)

CS-Notes 笔记的笔记 CS-Notes 笔记的笔记 附上 cs-Note的链接 概念篇 计算机操作系统 进程与线程 进程是资源分配的基本单位以及系统调度的单位,线程是独立调度的基本单位 进程控制块(PCB) :描述进程的基本信息和运行状态 创建或撤销线程的时候,系统都要回收资源,开销很大。但是创建或销毁进程时开销较小。另外,进程切换需要执行进程CPU环境的保存以及新调度进程CPU环境的设置,而线程切换时只需要保存和设... 阅读详情

 

1  基础概念

1.1  URI

URI 包含 URL 和 URN。

 

1.2  请求和响应报文

1. 请求报文

2. 响应报文


 

 

 

2  HTTP 方法

客户端发送的 请求报文 第一行为请求行,包含了方法字段。

GET

获取资源

当前网络请求中,绝大部分使用的是 GET 方法。

 

 

HEAD

获取报文首部

和 GET 方法类似,但是不返回 报文实体主体部分。

主要用于确认 URL 的有效性以及资源更新的日期时间等。

 

 

POST

传输实体主体

POST 主要用来传输数据,而 GET 主要用来获取资源。

更多 POST 与 GET 的比较请见第九章。

 

 

PUT

上传文件

由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题。一般不使用该方法。

PUT /new.html HTTP/1.1
Host: example.com
Content-type: text/html
Content-length: 16

<p>New File</p>

 

 

PATCH

对资源进行部分修改

PUT 也可以用于修改资源,但是只能完全替代原始资源;PATCH 允许部分修改。

PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 100

[description of changes]

 

 

DELETE

删除文件

与 PUT 功能相反,并且同样不带验证机制。

DELETE /file.html HTTP/1.1

 

 

OPTIONS

查询支持的方法

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

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

 

 

CONNECT

要求在与代理服务器通信时建立隧道

使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议 把通信内容加密后,经网络隧道传输。

CONNECT www.example.com:443 HTTP/1.1

 

TRACE

追踪路径

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

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

通常不会使用 TRACE,并且它容易受到 XST 攻击(Cross-Site Tracing,跨站追踪)。


 

 

3  HTTP 状态码

服务器返回的 响应报文 中第一行为 状态行,包含了状态码以及原因短语,用来 告知 客户端 请求的结果。

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

 

1XX 信息

  • 100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。

2XX 成功

  • 200 OK

  • 204 No Content :请求已经成功处理,但是 返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。

  • 206 Partial Content :表示客户端进行了范围请求,响应报文 包含由 Content-Range 指定范围的实体内容。

3XX 重定向

  • 301 Moved Permanently :永久性重定向

  • 302 Found :临时性重定向

  • 303 See Other :和 302 有着相同的功能,但是 303 明确要求 客户端应该采用 GET 方法获取资源。

  • 注:虽然 HTTP 协议规定 301、302 状态下 重定向时不允许把 POST 方法 改成 GET 方法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。

  • 304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since。如果不满足条件,则服务器会返回 304 状态码。

  • 307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求 浏览器不会把重定向请求的 POST 方法改成 GET 方法。

4XX 客户端错误

  • 400 Bad Request :请求报文中存在语法错误。

  • 401 Unauthorized :该状态码表示 发送的请求 需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。

  • 403 Forbidden :请求被拒绝。

  • 404 Not Found

5XX 服务器错误

  • 500 Internal Server Error :服务器正在执行请求时 发生错误。

  • 503 Service Unavailable :服务器暂时处于超负载 或 正在进行停机维护,现在无法处理请求。


 

HTTP 首部

有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。

各种首部字段及其含义如下(不需要全记,仅供查阅):

通用首部字段

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

请求首部字段

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

响应首部字段

首部字段名说明
Accept-Ranges是否接受字节范围请求
Age推算资源创建经过时间
ETag资源的匹配信息
Location令客户端重定向至指定 URI
Proxy-Authenticate代理服务器对客户端的认证信息
Retry-After对再次发起请求的时机要求
ServerHTTP 服务器的安装信息
Vary代理服务器缓存的管理信息
WWW-Authenticate服务器对客户端的认证信息

实体首部字段

首部字段名说明
Allow资源可支持的 HTTP 方法
Content-Encoding实体主体适用的编码方式
Content-Language实体主体的自然语言
Content-Length实体主体的大小
Content-Location替代对应资源的 URI
Content-MD5实体主体的报文摘要
Content-Range实体主体的位置范围
Content-Type实体主体的媒体类型
Expires实体主体过期的日期时间
Last-Modified资源的最后修改日期时间

 

 

5  具体应用

5.1  连接管理

1. 短连接与长连接

当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问的 HTML 页面资源,还会请求图片资源。如果每进行一次 HTTP 通信就要 新建一个 TCP 连接,那么开销会很大。

长连接 只需要建立一次 TCP 连接,就能进行多次 HTTP 通信。

  • 从 HTTP/1.1 开始 默认是长连接的,如果要断开连接,需要由客户端 或者 服务器端提出断开,使用 Connection : close;
  • 在 HTTP/1.1 之前默认是短连接的,如果需要使用长连接,则使用 Connection : Keep-Alive。

 

2. 流水线

默认情况下,HTTP 请求是按顺序发出的,下一个请求 只有在当前请求 收到响应之后 才会被发出。由于受到网络延迟和带宽的限制,在下一个请求 被发送到服务器之前,可能需要等待很长时间(因为要等待当前请求的响应报文发回来,下一个请求才能发送。报文在网络中一来一回要花好久的时间)。

流水线是 在同一条长连接上 连续发出请求,而不用等待 响应返回,这样可以减少延迟。


 

5.2  Cookie

HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。HTTP/1.1 引入 Cookie 来保存状态信息。

Cookie 是服务器 发送到 用户浏览器,并保存在本地的一小块数据。它会在 浏览器之后 向同一服务器再次发起请求时 被携带上,用于告知服务端 两个请求 是否来自同一浏览器。由于之后每次请求  都会需要携带 Cookie 数据,因此会带来额外的性能开销(尤其是在移动环境下)。

Cookie 曾一度用于客户端数据的存储,因为当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。新的浏览器 API 已经允许开发者直接将数据 存储到本地,如使用 Web storage API(本地存储和会话存储)或 IndexedDB。

 

1. 用途

  • 会话状态管理(如用户登录状态、购物车、游戏分数 或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

 

2. 创建过程

服务器发送的响应报文 包含 Set-Cookie 首部字段。客户端 得到响应报文后,把 Cookie 内容保存到浏览器中。

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

[page content]

 

客户端 之后对同一个服务器发送请求时,会从浏览器中取出 Cookie 信息 ,并通过 Cookie 请求首部字段 发送给服务器。

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

 

3. 分类

  • 会话期 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。
  • 持久性 Cookie:指定 过期时间(Expires)或有效期(max-age)之后,就成为了持久性的 Cookie。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

 

4. 作用域

Domain 标识 指定了 哪些主机可以接受 Cookie。如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了 Domain,则一般包含子域名。例如,如果设置 Domain=mozilla.org,则 Cookie 也包含在 子域名 中(如 developer.mozilla.org)。

Path 标识 指定了 主机下的哪些路径 可以接受 Cookie(该 URL 路径 必须存在于 请求 URL 中)。以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配。例如,设置 Path=/docs,则以下地址都会匹配:

  • /docs
  • /docs/Web/
  • /docs/Web/HTTP

 

 

5. JavaScript

浏览器通过 document.cookie 属性 可创建新的 Cookie,也可通过该属性访问 非 HttpOnly 标记的 Cookie。

document.cookie = "yummy_cookie=choco";
document.cookie = "tasty_cookie=strawberry";
console.log(document.cookie);

 

 

6. HttpOnly

标记为 HttpOnly 的 Cookie 不能被 JavaScript 脚本调用。跨站脚本攻击 (XSS) 常常使用 JavaScript 的 document.cookie API 窃取用户的 Cookie 信息。因此使用 HttpOnly 标记,可以在一定程度上避免 XSS 攻击。

 

7. Secure

标记为 Secure 的 Cookie  只能通过 被HTTPS 协议加密过的请求 发送给服务端。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障。

 

8. Session

除了可以将用户信息 通过 Cookie 存储在用户浏览器中,也可以利用 Session 存储在服务器端,存储在服务器端的信息更加安全。

Session 可以存储在服务器上的文件、数据库或者内存中。也可以将 Session 存储在 Redis 这种内存型数据库中,效率会更高。

使用 Session 维护 用户登录状态的过程如下:

  • 用户进行登录时,用户提交包含用户名和密码的表单,放入 HTTP 请求报文中;
  • 服务器验证该用户名和密码,如果正确则把用户信息 存储到 Redis 中,它在 Redis 中的 Key 称为 Session ID;
  • 服务器返回的响应报文的 Set-Cookie 首部字段  包含了这个 Session ID。客户端收到响应报文之后,将该 Cookie 值 存入浏览器中;
  • 客户端之后对同一个服务器进行请求时会包含该 Cookie 值,服务器收到之后提取出 Session ID,从 Redis 中取出用户信息,继续之前的业务操作。

应该注意 Session ID 的安全性问题,不能让它被恶意攻击者轻易获取,那么就不能产生一个容易被猜到的 Session ID 值。此外,还需要经常重新生成 Session ID。在对安全性要求极高的场景下,例如转账等操作,除了使用 Session 管理用户状态之外,还需要对用户进行重新验证,比如重新输入密码,或者使用短信验证码等方式。

 

9. 浏览器禁用 Cookie

此时无法使用 Cookie 来保存用户信息,只能使用 Session。除此之外,不能再将 Session ID 存放到 Cookie 中,而是使用 URL 重写技术,将 Session ID 作为 URL 的参数进行传递。

 

10. Cookie 与 Session 选择

  • Cookie 只能存储 ASCII 码字符串,而 Session 则可以存储任何类型的数据,因此在考虑数据复杂性时首选 Session;
  • Cookie 存储在浏览器中,容易被恶意查看。如果非要将一些隐私数据存在 Cookie 中,可以将 Cookie 值进行加密,然后在服务器进行解密;
  • 对于大型网站,如果用户所有的信息都存储在 Session 中,那么开销是非常大的,因此不建议将所有的用户信息 都存储到 Session 中。

 

5.3  缓存

1. 优点

  • 缓解服务器压力;
  • 降低 客户端 获取资源的延迟:缓存通常位于内存中,读取缓存的速度更快。并且缓存服务器在地理位置上也有可能比源服务器来得近,例如浏览器缓存。

 

2. 实现方法

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

 

3. Cache-Control

HTTP/1.1 通过 Cache-Control 首部字段 来控制缓存。

3.1 禁止进行缓存

no-store 指令 规定:不能对请求或响应的任何一部分进行缓存。

Cache-Control: no-store

3.2 强制确认缓存

no-cache 指令规定:缓存服务器 需要 先向 源服务器 验证 缓存资源的有效性,只有当缓存资源有效时 缓存服务器才能使用该缓存对客户端的请求进行响应。

Cache-Control: no-cache

3.3 私有缓存和公共缓存

private 指令规定了将资源作为私有缓存,只能被单独用户使用,一般存储在用户浏览器中。

Cache-Control: private

public 指令规定了将资源作为公共缓存,可以被多个用户使用,一般存储在代理服务器中。

Cache-Control: public

 

3.4 缓存过期机制

max-age 指令 出现在请求报文,并且缓存资源的缓存时间小于该指令指定的时间,那么就能接受该缓存。

max-age 指令 出现在响应报文,表示 缓存资源  在缓存服务器中保存的时间。

Cache-Control: max-age=31536000

 

Expires 首部字段 也可以用于告知缓存服务器 该资源什么时候会过期。

Expires: Wed, 04 Jul 2012 08:26:05 GMT
  • 在 HTTP/1.1 中,会优先处理 max-age 指令;
  • 在 HTTP/1.0 中,max-age 指令 会被忽略掉。

 

4. 缓存验证

需要先了解 ETag 首部字段的含义,它是资源的唯一标识。

URL 不能唯一表示资源,例如 http://www.google.com/ 有中文和英文两个资源,只有 ETag 才能对这两个资源进行唯一标识。

ETag: "82e22293907ce725faf67773957acd12"

 

可以将缓存资源的 ETag 值放入 If-None-Match 首部。服务器收到该请求后,判断缓存资源的 ETag 值 和 资源的最新 ETag 值是否一致。如果一致 则表示缓存资源有效,返回 304 Not Modified。

If-None-Match: "82e22293907ce725faf67773957acd12"

Last-Modified 首部字段 也可以用于缓存验证,它包含在源服务器发送的响应报文中,指示 源服务器对资源的最后修改时间。但是它是一种弱校验器,因为只能精确到一秒,所以它通常作为 ETag 的备用方案。如果响应首部字段里含有这个信息,客户端可以在后续的请求中带上 If-Modified-Since 来验证缓存。服务器只在所请求的资源 在给定的日期时间之后 对内容进行过修改的情况下,才会将资源返回,状态码为 200 OK。如果请求的资源从那时起 未经修改,那么返回一个不带有实体主体的 304 Not Modified 响应报文。

Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT

 

5.4  内容协商

通过内容协商,返回最合适的内容。例如根据浏览器的默认语言选择,返回中文界面还是英文界面。

1. 类型

1.1 服务端驱动型

客户端设置特定的 HTTP 首部字段,例如 Accept、Accept-Charset、Accept-Encoding、Accept-Language。服务器根据这些字段,返回特定的资源。

它存在以下问题:

  • 服务器很难知道客户端浏览器的全部信息;
  • 客户端提供的信息相当冗长(HTTP/2 协议的首部压缩机制缓解了这个问题),并且存在隐私风险(HTTP 指纹识别技术);
  • 给定的资源 需要返回 不同的展现形式,共享缓存的效率会降低,而服务器端的实现 会越来越复杂。

 

1.2 代理驱动型

服务器返回 300 Multiple Choices 或者 406 Not Acceptable,客户端从中选出最合适的那个资源。

 

 

2. Vary

Vary: Accept-Language

在使用内容协商的情况下,只有当缓存服务器中的缓存满足内容协商条件时,才能使用该缓存,否则应该向源服务器 请求该资源。

例如,一个客户端发送了一个包含 Accept-Language 首部字段的请求之后,源服务器返回的响应包含 Vary: Accept-Language 内容,缓存服务器对这个响应进行缓存之后,在客户端下一次访问同一个 URL 资源,并且 Accept-Language 与缓存中的对应的值相同时,才会返回该缓存。


 

 

5.5  内容编码

内容编码 将实体主体进行压缩,从而减少传输的数据量。

常用的内容编码有:gzip、compress、deflate、identity。

浏览器发送 Accept-Encoding 首部,其中包含有它所支持的压缩算法,以及各自的优先级。服务器则从中选择一种,使用该算法对响应的消息主体进行压缩;并且服务器发送 Content-Encoding 首部来告知浏览器,它选择了哪一种算法。由于该内容协商过程是基于编码类型来选择资源的展现形式的,响应报文的 Vary 首部字段至少要包含 Content-Encoding。


 

 

5.6  范围请求

如果网络出现中断,服务器只发送了一部分数据,范围请求可以使得 客户端 只请求 服务器未发送的那部分数据,从而避免服务器重新发送所有数据。

1. Range

在请求报文中添加 Range 首部字段指定请求的范围。

GET /z4d4kWk.jpg HTTP/1.1
Host: i.imgur.com
Range: bytes=0-1023

请求成功的话,服务器返回的响应包含 206 Partial Content 状态码。

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/146515
Content-Length: 1024
...
(binary content)

 

 

2. Accept-Ranges

响应首部字段 Accept-Ranges 用于告知客户端:是否能处理范围请求,可以处理使用 bytes,否则使用 none。

Accept-Ranges: bytes

 

3. 响应状态码

  • 在请求成功的情况下,服务器会返回 206 Partial Content 状态码。
  • 在请求的范围越界的情况下,服务器会返回 416 Requested Range Not Satisfiable 状态码。
  • 在不支持范围请求的情况下,服务器会返回 200 OK 状态码。

 

5.7  分块传输编码

Chunked Transfer Encoding,可以把数据分割成多块,让浏览器 逐步显示页面。


 

 

5.8  多部分对象集合

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

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

Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="submit-name"

Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--

 

5.9  虚拟主机

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


 

5.10  通信数据转发

1. 代理

代理服务器 接受 客户端的请求,并且转发给其它服务器。

 

使用代理的主要目的是:

  • 缓存
  • 负载均衡
  • 网络访问控制
  • 访问日志记录

 

代理服务器分为正向代理和反向代理两种:

  • 用户察觉得到正向代理的存在。

  • 而反向代理一般位于内部网络中,用户察觉不到。

2. 网关

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

 

3. 隧道

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



 

6  HTTPS

HTTP 有以下安全性问题:

  • 使用明文进行通信,内容可能会被窃听;
  • 不验证通信方的身份,通信方的身份有可能遭遇伪装;
  • 无法证明报文的完整性,报文有可能遭篡改。

HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信,也就是说 HTTPS 使用了隧道进行通信。

通过使用 SSL,HTTPS 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。

6.1  加密

1. 对称密钥加密

对称密钥加密(Symmetric-Key Encryption),加密和解密使用同一密钥。

  • 优点:运算速度快;
  • 缺点:无法安全地 将密钥传输给通信方。

 

2.非对称密钥加密

非对称密钥加密,又称公开密钥加密(Public-Key Encryption),加密和解密使用不同的密钥。

公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。

收信人 告诉所有发信人。我要的信,应该被什么算法加密。(相当于每个发给收件人的信件,都用接收方提供的锁锁起来。发信者们,只有同样的锁,没有钥匙。即使报文被第三方截获了,但第三方没有钥匙,也开不了锁)。

收信人 收到 被算法加密信件时,会使用自己的私钥来从 被公钥加密的信件中解读内容。(收信人 拿只有自己知道的钥匙解锁)。

非对称密钥除了用来加密,还可以用来进行签名。因为私有密钥无法被其他人获取,因此通信发送方使用其私有密钥进行签名,通信接收方使用发送方的公开密钥对签名进行解密,就能判断这个签名是否正确。

  • 优点:可以更安全地将公开密钥传输给通信发送方;
  • 缺点:运算速度慢。

 

3. HTTPS 采用的加密方式

HTTPS 采用混合的加密机制,将非对称密钥加密 用于传输 对称密钥,来保证传输过程的安全性。之后使用对称密钥加密进行通信来保证通信过程的效率。(下图中的 Session Key 就是对称密钥)

使用 非对称密钥加密 ,来保证 对称密钥传输过程的安全性。

使用对称密钥加密进行通信,来保证 通信过程的效率。

 

6.2  认证

通过使用 证书 ,来对通信方进行认证。

数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。

服务器的运营人员 向 CA 提出 公开密钥的申请。CA 在判明 提出申请者的身份之后,会对 已申请的公开密钥 做数字签名,然后分配这个已签名的公开密钥;并将该公开密钥 放入公开密钥证书后,将密钥和证书绑定在一起。

进行 HTTPS 通信时,服务器会把证书 发送给客户端。客户端取得证书中的公开密钥之后,先使用数字签名进行验证,如果验证通过,就可以开始通信了。

 

6.3  完整性保护

SSL 提供报文摘要功能,来进行完整性保护。

HTTP 也提供了 MD5 报文摘要功能,但不是安全的。例如报文内容被篡改之后,同时重新计算 MD5 的值,通信接收方是无法意识到发生了篡改。

HTTPS 的报文摘要功能之所以安全,是因为它结合了加密和认证这两个操作。试想一下,加密之后的报文,遭到篡改之后,也很难重新计算报文摘要,因为无法轻易获取明文。

 

6.4  HTTPS 的缺点

  • 因为需要进行加密解密等过程,因此速度会更慢;
  • 需要支付证书授权的高额费用。


 

7  HTTP/2.0

7.1  HTTP/1.x 缺陷

HTTP/1.x 实现简单是以牺牲性能为代价的:

  • 客户端需要使用多个连接,才能实现并发和缩短延迟;
  • 不会压缩请求和响应首部,从而导致不必要的网络流量;
  • 不支持有效的资源优先级,致使底层 TCP 连接的利用率低下。

 

7.2  二进制分帧层

HTTP/2.0 将报文分成 HEADERS 帧和 DATA 帧,它们都是二进制格式的。

 

在通信过程中,只会有一个 TCP 连接存在,它承载了任意数量的双向数据流(Stream)。

  • 一个数据流(Stream)都有一个唯一标识符和可选的优先级信息,用于承载双向信息。
  • 消息(Message)是 与逻辑请求或响应对应的 完整的一系列帧。
  • 帧(Frame)是最小的通信单位,来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。

 

7.3  服务端推送

HTTP/2.0  在客户端请求一个资源时,服务器会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 page.html 页面,服务端就把 script.js 和 style.css 等与之相关的资源 一起发给客户端。

 

 

7.4  首部压缩

HTTP/1.1 的首部 带有大量信息,而且每次都要重复发送。

HTTP/2.0 要求客户端和服务器 同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输。

不仅如此,HTTP/2.0 也使用 Huffman 编码,对首部字段进行压缩。


 

 

 

8  HTTP/1.1 新特性

详细内容请见上文

  • 默认是长连接
  • 支持流水线
  • 支持同时打开多个 TCP 连接
  • 支持虚拟主机
  • 新增状态码 100
  • 支持分块传输编码
  • 新增缓存处理指令 max-age

 

9  GET 和 POST 比较

9.1  作用

GET 用于获取资源,而 POST 用于传输实体主体。

 

9.2  参数

GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)查看。

因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符 就需要先进行编码。例如 中文 会转换为 %E4%B8%AD%E6%96%87,而空格会转换为 %20。

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

 

9.3  安全

安全的 HTTP 方法 不会改变服务器状态,也就是说它只是可读的。

GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。

安全的方法除了 GET 之外还有:HEAD、OPTIONS。

不安全的方法除了 POST 之外还有 PUT、DELETE。

 

 

9.4  幂等性

幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。

所有的安全方法也都是幂等的。

在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。

GET /pageX HTTP/1.1 是幂等的,连续调用多次,客户端接收到的结果都是一样的:

GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1

 

POST /add_row HTTP/1.1 不是幂等的,如果调用多次,就会增加多行记录:

POST /add_row HTTP/1.1   -> Adds a 1nd row
POST /add_row HTTP/1.1   -> Adds a 2nd row
POST /add_row HTTP/1.1   -> Adds a 3rd row

 

DELETE /idX/delete HTTP/1.1 是幂等的,即使不同的请求接收到的状态码不一样:

DELETE /idX/delete HTTP/1.1   -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1   -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1   -> Returns 404

 

9.5  可缓存

如果要 对响应 进行缓存,需要满足以下条件:

  • 请求报文的 HTTP 方法本身 是可缓存的,包括 GET 和 HEAD,但是 PUT 和 DELETE 不可缓存,POST 在多数情况下不可缓存的。
  • 响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。
  • 响应报文的 Cache-Control 首部字段 没有指定 不进行缓存。

 

 

XMLHttpRequest

为了阐述 POST 和 GET 的另一个区别,需要先了解 XMLHttpRequest:

XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面,而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。

  • 在使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data。但并不是所有浏览器会这么做,例如火狐就不会。
  • 而 GET 方法 Header 和 Data 会一起发送。

 

参考资料

Badcase归因分析“四部曲” badcase是业内的专业名词,简单解释一下。bad是坏,case是案例,说白了就是模型或者具体规则无法很好预测的那些案例。以分类模型为例,本来一个样本应该是负类的,结果预测为正类,那这个样本就能被称为bad case。那相对应的就是good case就是优秀案例。 阅读详情

相关推荐

Godot4 TileMap分层绘制全攻略:解决角色、树木遮挡混乱,打造正确视觉层级

本文详细介绍了Godot4 TileMap分层绘制技术,通过图层管理和Y-Sort功能解决2D游戏中角色与物体的遮挡问题。从基础图层设置到高级优化策略,帮助开发者打造符合自然视觉规律的场景层次,提升游戏沉浸感。特别针对TileMap和TileSet的使用提供了实用技巧和代码示例。

weixin_28717411的博客 511

看完这篇 Session、Cookie、Token,和面试官扯皮就没问题了

是Java建设者的第85篇原创长文本文的组织脉络如下Cookie 和 SessionHTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道...

WantFlyDaCheng的博客 427

关于MII、RMII、GMII、RGMII、PHY、网络变压器、RJ45的硬件总结

文章目录前言一、网络传输结构及原理1.以太网的工作原理2.TCP/IP协议3.数据链路层(MAC)二、介质独立接口MII,RMII,GMII,RGMII1.MII(Media Independent interface)2.RMII(Reduced Media Independent Interface)3.GMII(Gigabit Medium Independent)4.RGMII(Reduced Gigabit Media Independent Interface)三、物理层芯片(PHY)二、使用步

weixin_44415816的博客 3万+

小cookie,大智慧

Cookie是什么?cookies是你访问网站时创建的数据片段文件,通过保存浏览信息,它们使你的在线体验更加轻松。使用cookies,可以使你保持在线登录状态,记录你的站点偏好,并为你提...

dotNET跨平台 605

vasp算表面吸附流程_VASP表面吸附计算实例分析

本文主要为了记录在学习Vasp计算过程中如何设置INCAR中的一些参数,并不着重讲解其含义,详见可自行到vasp官网查阅。其次关于建模部分也不做细致讨论,一般结构可从Materials Studio里自带的晶体数据库导出,或从三大数据库网站上下载:1、Materaials Project网址:https://materialsproject.org/(强烈推荐,邮箱注册即可使用)2、CCDC网址:...

weixin_39617669的博客 2240

Oracle GoldenGate (OGG) 实战:从安装到故障排查的完整避坑指南

本文提供了一份详尽的Oracle GoldenGate实战指南,涵盖从环境准备、核心进程配置到性能调优与故障排查的全过程。重点解析了OGG安装与部署中的常见陷阱,并分享了确保数据同步链路稳定运行的高级运维技巧与常见故障处理方法,帮助技术人员高效避坑。

weixin_29230649的博客 380

服务器无法在发送 http 标头之后修改 cookie_Authorization和Cookie

AuthorizationRFC 7235 定义了一个 HTTP 身份验证框架,服务器可以用来针对客户端的请求发送 challenge (质询信息),客户端则可以用来提供身份验证凭证。质询与应答的工作流程如下:服务器端向客户端返回 401(Unauthorized,未被授权的) 状态码,并在 WWW-Authenticate 首部提供如何进行验证的信息,其中至少包含有一种质询方式。之后...

weixin_39955700的博客 522

从‘炼丹’到‘讲理’:物理信息神经网络(PINN)的硬约束 vs 软约束,我该选哪个?

本文深入探讨了物理信息神经网络(PINN)中硬约束与软约束的选择策略,帮助研究者在深度学习中有效融入物理先验知识。通过对比两种约束方法的实现复杂度、数据效率和计算性能,提供了针对材料科学和流体动力学等领域的实用决策指南,并介绍了自适应约束和混合约束等前沿技术。

weixin_42535703的博客 527

服务器无法在发送 http 标头之后修改 cookie.,浏览器在后续请求中不发送cookie

使用cookie进行用户识别的项目.当用户到达时,它会调用该服务(在localhost中运行),并且带有响应头的服务发送cookie如下所示:curl 'http://127.0.0.1:8000/api/v1.0/tracking' -X OPTIONS -H 'Access-Control-Request-Method: POST' -H 'Origin: http://local.com:8...

weixin_30781905的博客 589

YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强

YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强

Coding... 5501

INCA ProF文件解析

本博文从实际应用出发,介绍INCA prof文件的关键信息,通过实例,描述当得到一个刷写需求后,如何在不改变用户之前的使用习惯的前提下,满足原有的INCA刷写应用数据和标定程序的需求。 声明:本文不涉及项目名称,没有商业目的,纯属分享技术,乐享知识。

汽车电子软件领域知识分享 1万+

服务器无法在发送 HTTP 标头之后修改 cookie

隔三差五就碰到VS报错: System.Web.HttpException:“服务器无法在发送 HTTP 标头之后修改 cookie。” 解决后过几天又忘记了。 原因是:   程序为每个页面在config文件中配置了一个ID,在页面初始化时,将其写入到cookie中。所以新增了页面却不在config文件中写入的话,就会报错 转载于:https://www.cnblogs.com/de...

weixin_30642561的博客 848

老款 NUC 复活计划:装 Ubuntu 部署 OpenClaw 本地 AI

老款 NUC 变身本地 AI 服务器指南 本文详细介绍了如何将老旧华硕 NUC 设备改造为本地 AI 服务器。主要内容包括: 硬件评估:列出老款 NUC 的最低配置要求(i3 6代/8GB内存/256GB SSD),并提供兼容性检查命令和性能预期表 系统准备:指导备份数据、下载 Ubuntu 22.04 LTS 和制作启动盘的方法(Windows/Linux双平台) 安装流程:从 BIOS 设置到 Ubuntu 安装的完整步骤,包括推荐的分区方案 系统优化:禁用不必要的服务、内核参数调优、Swap 配置和

博客 7607

MIPS Quick Tutorial [转载自 http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm]

<br /><br />MIPS Architecture and Assembly Language Overview<br />Adapted from: http://edge.mcs.dre.g.el.edu/GICL/people/sevy/architecture/MIPSRef(SPIM).html[Register Description] [I/O Description]<br /><br /> <br /> Data Types and Literals<br />Data types

Min的专栏 700

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

今天不想学习,但还是被惊艳到了!

今天来推荐一些高价值的学习资料,主要还是对于找工作非常有用的,这次来聊聊和 Java 后端相关的 Github 项目,可以说,在仔细看完这个项目之后,它给我的感觉是令人惊艳的,忍不住收藏一...

Oner.wv的专栏 115

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【LeetCode】Unique Binary Search Trees给定节点数二叉树数量

http://cs.lmu.edu/~ray/notes/binarytrees/

he wolf 880

Github中star数前十的项目

1. CyC2018/CS-Notes star: 59.3k 介绍: 技术面试必备基础知识、Leetcode 题解、后端面试、Java 面试、春招、秋招、操作系统、计算机网络、系统设计 :https://cyc2018.github.io/CS-Notes/#/ 概览: 2. elastic/elasticsearch star: 40.7k 介绍: 开源,分布式,RESTful搜索引擎 https://www.elastic...

xuanwo007的博客 878

如何用 CS-Notes 系统补全计算机基础知识:面试备战完整指南

上次模拟面试,面试官问"在浏览器输入 URL 之后发生了什么",我答到一半就卡壳了。你多半也懂这种痛:计算机基础碎得很——操作系统看过一点、网络背过几篇、数据库翻过两页——拼不成体系,面试时脑子一片空白。如果你正想找一条系统补 CS 基础、备战技术面试的路径,CS-Notes 这套开源的计算机科学笔记知识库值得认真看一眼:它把算法、操作系统、计算机网络、数据库、Java、系统设计这些面试高频领域整

gitblog_00352的博客 654

爆赞!GitHub上收获Star数排名前10的Java项目

1. CS-Notes star:92.1k 介绍:技术面试必备基础知识、Leetcode、计算机操作系统、计算机网络、系统设计、Java、Python、C++ ;地址:https://cyc2018.github.io/CS-Notes; 其中,算法包括:剑指 Offer 题解、Leetcode 题解、算法、笔试面试题库。数据库包括:数据库系统原理、SQL、Leetcode-Database 题解、MySQL、Redis。Java包括:Java 基础、Java 容器、Java 并发、Java.

Java技术开发工程师的博客 778

CS-Notes 知识清单 备战版

CS-Notes 知识清单 备战版前言清单3.1 操作系统基础3.2 Linux3.3 基础3.4 HTTP3.5 Socket3.1 SQL3.2 系统原理3.3 MySQL3.4 Redis3.1 设计模式3.2 分布式3.3 系统设计应用3.4 其它 前言 CS-Notes 寒假期间一直在看cyc2018 分享的 计算机知识笔记CS-Notes 800多页 量太大了 买了cyc2018在牛客和别的平台的一些 专栏 看到 cyc 分享了一些知识清单 我自己再拿来搜集一些答案 用来备战 清单 先把 fl

韩旭051的博客 2637

CS-Notes 完全指南:从算法到操作系统的面试知识体系一次性拆解

CS-Notes 是一个用 Markdown 写成的技术面试知识库,把算法题解、操作系统、计算机网络、数据库、Java、系统设计这六大块高频考点装进一个仓库,每篇都是"结论先行 + 代码/图示"的结构。它适合三类人:正在准备面试的求职者、想补基础的在校学生、需要快速查概念的技术从业者。先说清边界:它不是教程合集,没有视频、没有课后作业,也不替代项目经验。 [![CS-Notes 计算机网络与 S

gitblog_00253的博客 496

集群(CS-Notes)

目录 1 负载均衡 1.1 负载均衡算法 1. 轮询(Round Robin) 2. 加权轮询(Weighted Round Robbin) 3. 最少连接(least Connections) 4. 加权最少连接(Weighted Least Connection) 5. 随机算法(Random) 6. 源地址哈希法 (IP Hash) 1.2 转发实现 1. HTTP...

春卷同学的博客 3956

CS-Notes 终极指南:构建编程语言知识体系的完整教程

你是否曾因编程语言的多样性而感到困惑?从经典的 C 语言到现代的 Rust,从 Web 开发的 JavaScript 到系统编程的 Go,每个语言都有其独特的语法和设计哲学。CS-Notes 项目正是为了解决这一问题而生——它是一个系统化的编程语言知识库,帮助你从底层原理到高级实践,全面掌握编程语言的本质。 ## 项目愿景:从语法到思想的编程语言探索之旅 编程语言不仅仅是工具,更是思维的载体。

gitblog_00838的博客 820

【GitHub项目推荐--CS-Notes:技术面试必备知识库完全指南】

​CS-Notes​ 是由CyC2018维护的一个开源技术笔记仓库,旨在为计算机科学学习者和技术面试者提供全面、系统的知识总结。该项目涵盖了算法、操作系统、计算机网络、系统设计等核心领域,是准备技术面试和提升计算机基础知识的宝贵资源。所有内容均采用中文编写,并遵循中文文案排版指北,确保可读性和一致性。🔗 ​GitHub地址📚 ​核心价值​:面试准备 · 知识总结 · 开源免费 · 持续更新​项目特色​:​全面覆盖​:从基础算法到高级系统设计,一应俱全​中文友好。

j8267643的博客 1309
上一篇: 正确理解ThreadLocal的使用场景
下一篇: Java基础(CS-Notes)
春卷同学
博客等级 码龄12年 1668粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值