HTTP权威指南读书笔记

一、HTTP:Web的基础

1.HTTP概述

http报文结构:

  • 起始行
  • 首部字段
  • 主体

注:起始行和首部都是文本形式且都是结构化的,而主体则不同。

HTTP 是个应用层协议。HTTP 无需操心网络通信的具体细节;它把联网的细节都交给了通用、可靠的因特网传输协议 TCP/IP。

HTTP网络协议栈:
这里写图片描述

web的结构组件:

  • 代理
  • 缓存
  • 网关
    网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将 HTTP 流量转换成其他的协议。
  • 隧道
    隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP 应用程序。HTTP 隧道通常用来在一条或多条 HTTP 连接上转发非 HTTP 数据,转发时不会窥探数据。
  • Agent代理
    如Web 浏览器

2.URL与资源

URI 是一类更通用的资源标识符,URL 实际上是它的一个子集。URI 是一个通用的概念,由两个主要的子集 URL 和 URN 构成。

URL结构: 方案 :// 服务器位置 / 路径

大多数URL方案的语法:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

3.HTTP报文

如果说 HTTP 是因特网的信使,那么 HTTP 报文就是它用来搬东西的包裹了。

报文流

HTTP 报文是在 HTTP 应用程序之间发送的数据块。

报文构成:

  • 对报文进行描述的起始行(start line)
  • 包含属性的首部(header)块
  • 以及可选的、包含数据的主体(body)部分。—– 部不同的是,主体中可以包含文本或二进制数据,也可以为空与起始行和首

报文语法:

  • 请求报文

  • 响应报文


起始行

常见http方法:

状态码:

首部

HTTP 首部字段向请求和响应报文中添加了一些附加信息。本质上来说,它们只是一些名 / 值对的列表。

主体

4.连接与管理

HTTP 的优化,包括并行连接、keep-alive(持久连接)和管道化连接;

TCP 会按序、无差错地承载 HTTP 数据;

TCP流是分段的、由IP分组传送

每个ip分组包括:

  • 一个 IP 分组首部(通常为 20 字节)
    包含了源和目的 IP 地址、长度和其他一些标记
  • 一个 TCP段 首部(通常为 20 字节)
    TCP端口号、TCP 控制标记,以及用于数据排序和完整性检查的一些数字值
  • 一个 TCP 数据块(0 个或多个字节)

http与https协议栈区别:

套接字调用 close() 会将 TCP 连接的输入和输出信道都关闭了。这被称作“完全关闭”。还可以用套接字调用 shutdown() 单独关闭输入或输出信道。这被称为“半关闭”。

关闭连接的输出信道总是很安全的;、

关闭连接的输入信道比较危险,除非你知道另一端不打算再发送其他数据了。

附:TCP三次握手和四次挥手

三次握手

首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

四次挥手

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说”我Client端没有数据要发给你了”,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,”告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,”告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,”就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,”就知道可以断开连接了”。Client端等待了 2MSL 后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

整个过程Client端所经历的状态如下:

而Server端所经历的过程如下:

【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

二、HTTP结构

5、web服务器

web服务器会做什么?

Web 服务器有时会返回重定向响应而不是成功的报文。 Web 服务器可以将浏览器重定向到其他地方来执行请求。重定向响应由返回码 3XX 说明。Location 响应首部包含了内容的新地址或优选地址的 URI。

6、代理

Web 代理(proxy)服务器是网络的中间实体。代理位于客户端和服务器之间,扮演“中间人”的角色,在各端点之间来回传送 HTTP 报文。

代理连接的是两个或多个使用相同协议的应用程序,而网关连接的则是两个或多个使用不同协议的端点。

为什么用代理?

  • 过滤器
  • 文档访问控制
  • 安全防火墙
  • web缓存
  • 反向代理
  • 内容过滤器
  • 转码器: 如gif转jpg
  • 匿名者

web请求导向代理的方式

代理URI与服务器URI的不同

客户端向 Web 服务器发送请求时,请求行中只包含部分 URI(没有方案、主机或端口),如下例所示:

GET /index.html HTTP/1.0

User-Agent: SuperBrowser v1.3

但当客户端向代理发送请求时,请求行中则包含完整的 URI。例如:

GET http://www.marys-antiques.com/index.html HTTP/1.0

User-Agent: SuperBrowser v1.3

追踪报文

via首部

Via 首部字段列出了与报文途经的每个中间节点(代理或网关)有关的信息。报文每经过一个节点,都必须将这个中间节点添加到 Via 列表的末尾。

注意:

每个 Via 路标中最多包含 4 个组件:一个可选的协议名(默认为 HTTP)、一个必选的协议版本、一个必选的节点名和一个可选的描述性注释。

Via的请求和响应路径

请求和响应报文都会经过代理进行传输,因此,请求和响应报文中都要有 Via 首部。

通常,不管中间插入了多少代理,TRACE 报文都会沿着整条路径传到目的服务器上。可以使用 Max-Forwards(最大转发次数)首部来限制 TRACE 和 OPTIONS请求所经过的代理跳数。

7、缓存

缓存能解决哪些问题?

  • 冗余的数据传输
  • 带宽瓶颈
  • 瞬间拥塞 – 每年电商大促,会面临这个问题
  • 距离时延

缓存命中

HTTP 为我们提供了几个用来对已缓存对象进行再验证的工具,但最常用的是 If-Modified-Since 首部。将这个首部添加到 GET 请求中去,就可以告诉服务器,只有在缓存了对象的副本之后,又对其进行了修改的情况下,才发送此对象。

HTTP 没有为用户提供一种手段来区分响应是缓存命中的,还是访问原始服务器得到的。客户端有一种方法可以判断响应是否来自缓存,就是使用 Date 首部。将响应中Date 首部的值与当前时间进行比较,如果响应中的日期值比较早,客户端通常就可以认为这是一条缓存的响应。客户端也可以通过 Age 首部来检测缓存的响应,通过这个首部可以分辨出这条响应的使用期。

层次结构的缓存

缓存的处理步骤

保持副本新鲜

  • 文档过期

通过特殊的 HTTP Cache-Control 首部和 Expires 首部,HTTP 让原始服务器向每个文档附加了一个“过期日期”。

  • 服务器在验证

对 缓 存 再 验 证 来 说 最 有 用 的 2 个 首 部 是 If-Modified-Since (常用用于内容变更判断)和 If-None-Match(常用于版本对比)。

控制缓存的能力

服务器可以通过 HTTP 定义的几种方式来指定在文档过期之前可以将其缓存多长时间。按照优先级递减的顺序,服务器可以:

  • 附加一个 Cache-Control: no-store 首部到响应中去:响应后,直接从缓存中删除
  • 附加一个 Cache-Control: no-cache 首部到响应中去:响应后,缓存中没了,但可以放在本地缓存中
  • 附加一个 Cache-Control: must-revalidate 首部到响应中去: 响应首部告诉缓存,在事先没有跟原始服务
    器进行再验证的情况下,不能提供这个对象的陈旧副本
  • 附加一个 Cache-Control: max-age 首部到响应中去:表示的是从服务器将文档传来之时起,可以认为此文档处于新鲜状态的秒数
  • 附加一个 Expires 日期首部到响应中去:它指定的是实际的过期日期而不是秒数
  • 不附加过期信息,让缓存确定自己的过期日期。 •

8、集成点:网关、隧道及中继

网关

  • 为什么需要网关?
    由于,单个应用程序无法处理所有这些能想到的资源;
    为了解决这个问题,开发者提出了网关(gateway)的概念,网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。网关是资源和应用程序之间的粘合剂。
  • 客户端和服务器端网关
    用一个斜杠来分隔客户端和服务器端协议,并以此对网关进行描述:
    < 客户端协议 >/< 服务器端协议 >

    • 服务器端网关 • (server-side gateway)通过 HTTP 与客户端对话,通过其他协议与服务器通信(HTTP/*)。
  • 客户端网关 • (client-side gateway)通过其他协议与客户端对话,通过 HTTP 与服务器通信(*/HTTP)。

web隧道

Web 隧道(Web tunnel),这种方式可以通过 HTTP 应用程序访问使用非 HTTP 协议的应用程序。

这样就可以在 HTTP 上捎带其他协议数据了,如 使用 Web 隧道最常见的原因就是要在 HTTP 连接中嵌入非 HTTP

流量,这样,这类流量就可以穿过只允许 Web 流量通过的防火墙了。

Web 隧 道 是 用 HTTP 的 CONNECT 方 法 建 立 起 来 的。

中继

HTTP 中继(relay)是没有完全遵循 HTTP 规范的简单 HTTP 代理。中继负责处理HTTP 中建立连接的部分,然后对字节进行盲转发。

某些简单盲中继实现中存在的一个更常见(也更声名狼藉的)问题是,由于它们无法正确处理 Connection 首部,所以有潜在的挂起 keep-alive 连接的可能。图 8-14对这种情况进行了说明。

9、web机器人

10、HTTP-NG

三、识别、认证与安全

11、客户端识别与cookie机制

12、基本认证机制

13、摘要认证

14、安全HTTP

四、实体、编码和国际化

15、实体和编码

16、国际化

17、内容协商与转码

五、内容发布与分发

18、Wb主机托管

19、发布系统

20、重定向和负载均衡

21、日志记录与使用情况跟踪

猜你喜欢

转载自blog.csdn.net/baogang409/article/details/80494636