本质上它们都是 TCP 链接,因为它们是 HTTP 协议中的两种发送请求的方式,底层都是 TCP/IP。
GET
的语义是请求获取指定的资源。
GET
方法是安全、幂等、可缓存的(除非有 Cache-ControlHeader
的约束) GET
方法的报文主体没有任何语义POST
的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。 POST
不安全,不幂等,(大部分实现)不可缓存 为了针对其不可缓存性,有一系列的方法来进行优化
HTTP 持久化连接
Connection: keep-alive
以上就是 持久连接节省通信量 的栏位。
HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP 连接。
以当年的通信情况来说,因为都是些容量很小的文本传输,所以即使 这样也没有多大问题。可随著 HTTP 的普及,文档中包含大量图片的 情况多了起来。 比如,使用浏览器浏览一个包含多张图片的 HTML页面时,在发送 请求访问 HTML页面资源的同时,也会请求该 HTML页面里包含的 其他资源。因此,每次的请求都会造成无谓的 TCP 连接建立和断 开,增加通信量的开销。
持久连接
为解决上述 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了 持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或 HTTP connection reuse)的方法。持久连接的特点是,只要任意一端 没有明确提出断开连接,则保持 TCP 连接状态。
持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额 外开销,减轻了伺服器端的负载。另外,减少开销的那部分时间,使 HTTP 请求和响应能够更早地结束,这样 Web 页面的显示速度也就相 应提高了。
在 HTTP/1.1 中,所有的连接默认都是持久连接,但在 HTTP/1.0 内并 未标准化。虽然有一部分伺服器通过非标准的手段实现了持久连接, 但伺服器端不一定能够支持持久连接。毫无疑问,除了伺服器端,客 户端也需要支持持久连接。
管线化
持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。这样就能做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
Cookie 状态管理
HTTP 是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。
不可否认,无状态协议当然也有它的优点。由于不必保存状态,自然 可减少伺服器的 CPU 及内存资源的消耗。从另一侧面来说,也正是 因为 HTTP 协议本身是非常简单的,所以才会被应用在各种场景里。
保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入 了 Cookie 技术。Cookie 技术通过在请求和响应报文中写入 Cookie 信 息来控制客户端的状态。
Cookie 会根据从伺服器端发送的响应报文内的一个叫做 Set-Cookie 的 首部栏位信息,通知客户端保存 Cookie。当下次客户端再往该伺服器 发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出 去。
伺服器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一 个客户端发来的连接请求,然后对比伺服器上的记录,最后得到之前 的状态信息。
HTTP 缓存控制
浏览器在请求已经访问过的URL的时候,会判断是否使用缓存,。
判断是否使用缓存,主要通过判断缓存是否在有效期 内, 通过两个栏位来判断:
Expires ,有效期,返回的是一个GMT时间,但是使用的是客户端时间 ,与伺服器时间存在一定时间差。
Cache-Control => max-age ,最大有效时间,单位是s,优先顺序比 expires 高,为了解决 expires 时间差的问题而出现的。
缓存过期后,浏览器不会直接去伺服器上拿缓存,而是判断缓存是否有更新,能否继续使用,判断的方法有两种:
Last-Modified / If-Modified-Since :伺服器会响应一个Last-Modified 栏位,表示最近一次修改缓存的时间,当缓存过期后,浏览器就会把这个时间放在 If-Modified-Since 去请求伺服器,判断缓存是否有更新。
Etag / If-None-Match :伺服器会响应一个 Etag 栏位,一个表示文件唯一的字元串, 一旦文件更新,Etag也会跟著更改;缓存过期后,浏览器会把这个字元串放在 If-None-Match 去请求伺服器,判断是否有更新,Etag的优先顺序比Last-Modified 的更高, Etag 的出现, 是为了解决一个缓存文件在短时间内被多次修改的问题, 因为 Last-Modified 只能精确到秒。
HTTP 工作流程
HTTP 协议定义 Web 客户端如何从 Web 伺服器请求Web页面,以及伺服器如何把 Web 页面传送给客户端。HTTP 协议采用了请求/响应模型。客户端向伺服器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。伺服器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、伺服器信息、响应头部和响应数据。
HTTP 请求/响应的步骤
1、客户端连接到Web伺服器
一个 HTTP 客户端(通常是浏览器)与 Web 伺服器的HTTP埠(默认 80)建立一个TCP套接字连接。
2、发送HTTP请求
通过 TCP 套接字,客户端向 Web 伺服器发送一个文本的请求报文。
3、伺服器接受请求并返回 HTTP 响应
Web 伺服器解析请求,定位请求资源。伺服器将资源复本写到 TCP 套接字,由客户端读取。
4、释放连接 TCP 连接
若 connection
模式为 close
,则伺服器主动关闭 TCP 连接,客户端被动关闭连接,释放 TCP 连接;若 connection
模式为 keepalive
,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干位元组的 HTML 文档和文档的字符集。客户端浏览器读取响应数据 HTML,根据 HTML 的语法对其进行格式化,并在浏览器窗口中显示。
生活中常见例子
在浏览器中输入 URL 地址,回车后:
1、浏览器向 DNS 伺服器请求解析该 URL 中的域名所对应的 IP 地址
2、解析出 IP 地址后,根据该 IP 地址和默认埠 80,和伺服器建立 TCP 连接
3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文数据发送给伺服器;
4、伺服器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5、释放 TCP 连接
6、浏览器将该 html 文本并显示内容;
推荐阅读: