《图解HTTP》读书笔记

165 阅读17分钟

第一章 了解Web及网络基础

一、 HTTP协议访问 Web

浏览器输入URL以获取文档展示。Web浏览器(客户端)-> URL -> web服务器获取文件资源 -> 展示web页面

二、 HTTP的诞生

  1. 基于知识共享提出WWW、HTML、HTTP
  2. 现在HTTP协议已经超出了Web这个框架的局限,被运用到了各种场景里。

三、 网络基础TCP/IP

  1. TCP/IP协议族:互联网相关的各类协议族的总称
  2. TCP/IP的分层管理:应用层(FTP,DNS,HTTP)、传输层(TCP,UDP)、网络层(IP)和数据链路层
  3. TCP/IP通信传输流

http2.webp

http3.webp

四、 网络基础TCP/IP

  1. IP协议:IP协议和IP地址不同
  • IP地址(Internet Protocol):指明了节点被分配的地址,可变换
  • MAC地址(Media Access Contol Address):网卡所属固定地址,基本不会更改
  • ARP协议(Address Resolution Protocol):根据通信方IP地址反查出对应的MAC地址
  1. 确保可靠性的TCP协议
  • TCP:提供可靠的字节流服务(Byte Stream Service)
  • 字节流服务(Byte Stream Service):将大块数据分割成以报文(segment)为单位的数据包进行管理
  • 三次握手

http5.jpg

  • 四次挥手

http6.jpg

五、 负责域名解析的DNS服务

DNS(Domain Name System)服务:提供域名到IP直接的解析服务

六、 各种协议与HTTP协议的关系

http4.webp

七、 URI和URL

  • URI(Uniform Resource Identifier)
  • URL(Uniform Resource Locator)
  • URL是URI的子集

http7.webp

第二章 简单的HTTP协议

一、HTTP协议用于客户端和服务端之间的通信

HTTP协议能明确区分哪端是客户端,哪端是服务端

二、通过请求和响应的交换达成通信

请求从客户端发出,服务端响应该请求并返回

请求报文构成

请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字
段和内容实体构成的。

响应报文构成

响应报文基本上由协议版本、状态码(表示请求成功或失败的数字 代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。

三、HTTP是不保存状态的协议

请求或者响应不做持久化处理 使用Cookie技术可以管理状态

四、请求URI定位资源

HTTP协议使用URI定位互联网上的资源

五、告知服务器意图的HTTP方法

  • GET:获取资源
  • POST:传输实体主体
  • PUT:传输文件
  • HEAD:获得报文首部
  • DELETE:删除文件
  • OPTIONS:询问支持的方法
  • TRACE:追踪路径(客户端通过TRACE方法可以查询发出去的请求是怎样被加工/篡改的)
  • CONNECT:要求用隧道协议链接代理(CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道 协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接 层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加 密后经网络隧道传输。)

六、使用方法下达命令

HTTP/1.0 和 HTTP/1.1 支持的方法

七、持久连接节省通信量

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

  • 持久连接

    只要任意一端没 有明确提出断开连接,则保持 TCP 连接状态。

  • 管线化

    不用等待响应亦可直接发送下一个请求。这样就能够做到同时并行发送多个请求,而不需要一个接一个地等 待响应了。

八、使用Cookie的状态管理

Cookie 技术通过在请求和响应报文中写入 Cookie 信 息来控制客户端的状态。

http8.webp

第三章 HTTP报文内的HTTP信息

一、HTTP报文

http9.webp

二、请求报文和响应报文的结构

htpp10.webp

  • 请求行:包含用于请求的方法,请求 URI 和 HTTP 版本。

  • 状态行:包含表明响应结果的状态码,原因短语和 HTTP 版本。

  • 首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体 首部。

  • 其他:可能包含 HTTP 的 RFC 里未定义的首部(Cookie 等)。

三、 编码提升传输速率

  • 报文主体和实体主体的差异:通常是相等的,只有传输进行编码操作时,两者才会有差异

  • 压缩传输的内容编码

    gzip(GNU zip)

    compress(UNIX系统的标准压缩)

    deflate(zlib)

    identity(不进行编码)

  • 分割发送的分块传输编码

  • 发送多种数据的多部分对象集合

    通常是在图片或文本文件等上传时使用,做部分对象集合包含的对象如下:

    multipart/form-data

    multipart/byteranges

  • 获取部分内容范围请求

  • 内容协商返回最适合内容

第四章 返回结果的HTTP状态码

一、状态码告知从服务器返回的结果请求

HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器 端的处理是否正常、通知出现的错误等工作 只有 14 种

二、14个常用状态码

  • 200 OK

    表示从客户端发来的请求在服务器端被正常处理了

  • 204 No Content

    该状态码代表服务器接收的请求已成功处理,但在返回的响应报文 中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如, 当从浏览器发出请求处理后,返回 204 响应,那么浏览器显示的页面不发生更新。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

  • 206 Partial Content

    该状态码表示客户端进行了范围请求,而服务器成功执行了这部分 的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

  • 301 Moved Permanently

    永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以 后应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI 保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。

  • 302 Found

    临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。和301 Moved Permanently 状态码相似,但 302 状态码代表的资源 不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的 URI 将来还有可能发生改变。比如,用户把URI 保存成书签,但不会像 301 状态码出现时那样去更新书签,而是仍旧保留返回 302 状态码的页 面对应的 URI。

  • 303 See Other

    该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。303状态码和302Found状态码有着相同的功能,但303状态码明确表示客户端应当采用 GET 方法获取资源,这点与 302 状态码有区别。(当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把 POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次发送。301、302 标准是禁止将 POST 方法改变成GET方法的,但实际使用时大家都会这么做。)

  • 304 Not Modified

    该状态码表示客户端发送附带条件的请求A时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX 类别中,但是和重定向没有关系。

  • 307 Temporary Redirect

    临时重定向。该状态码与302 Found有着相同的含义。尽管302标准禁止POST变换成 GET,但实际使用时大家并不遵守。307会遵照浏览器标准,不会从POST变成GET。但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况。

  • 400 Bad Request

    该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求 的内容后再次发送请求。另外,浏览器会像200 OK一样对待该状态码。

  • 401 Unauthorized

    该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、 DIGEST 认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。返回含有 401 的响应必须包含一个适用于被请求资源的 WWW- Authenticate 首部用以质询(challenge)用户信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口。

  • 403 Forbidden

    该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分 对原因进行描述,这样就能让用户看到了。未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源 IP 地址试图访问)等列举的情况都可能是发生403的原因。

  • 404 Not Found

    该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

  • 500 Internal Server Error

    该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。

  • 503 Service Unavailable

    该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry- After首部字段再返回给客户端。

注意

状态码和状况的不一致

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

第五章 与HTTP协作的Web服务器

一台Web服务器可搭建多个独立域名的Web网站,也可作为通信路径上的中转服务器提升传输效率

一、用单台虚拟主机实现多个域名

多个域名,单指向的IP是相同的

二、通信数据转发程序:代理、网关、隧道

HTTP通信时,除客户端和服务器外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道

代理

代理是一种有转发功能的应用程序。客户端和服务端的“中间人”

  • 缓存代理:缓存资源到代理服务器,下次接收到对相同资源的请求时,直接将缓存的资源作为响应返回
  • 透明代理:转发请求或响应时,不对报文做任何加工的代理类型。反之为非透明代理
网关

网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的服务器一样对请求进行处理。有时客户端可能都不会觉察,自己的通信目标是一个网关

  • 网关能提高通信的安全性
隧道

隧道是在相隔甚远的客户端和服务器两者之间进行中转(使用SSL等加密手段进行通信),并保持双方通信连接的应用程序

  • 隧道的目的是确保客户端能与服务器进行安全的通信

三者区别

尽管代理、网关和隧道都可以在不同的网络之间进行数据传输,但它们之间还是存在一些区别。代理在客户端和目标服务器之间进行数据传输,而网关连接的是不同类型的网络。隧道是将数据包封装在另一个协议中以便在不同网络之间传输。代理可以过滤请求,加速响应时间,同时还可以提高隐私性和安全性。网关可以实现路由和数据包过滤等功能。隧道可以通过Internet传输数据包,同时保持数据包的安全性和完整性。

代理的应用场景

代理服务器在互联网中广泛应用,它们可以加速Web页面的加载速度、减轻服务器的负载、过滤内容和提高访问安全性。下面列出了一些代理的应用场景:

1,加速Web访问速度:代理服务器可以缓存已访问过的网页,使下一次访问时更快。

2,减轻服务器负载:代理服务器可以拦截一些请求,从而减轻服务器的负载。

3,过滤内容:代理服务器可以拦截某些请求,从而过滤内容,使用户不会访问一些有害的网站或内容。

4,提高安全性:代理服务器可以隐藏用户的真实IP地址,从而提高安全性。

5,提高匿名性:代理服务器可以充当匿名代理,隐藏客户端的真实IP地址,保护用户的隐私。

网关的应用场景

网关在不同类型的网络之间进行连接,它们可以实现路由和数据包过滤等功能。下面列出了一些网关的应用场景:

1,连接局域网到Internet:网关可以将局域网连接到Internet,从而实现对Internet的访问。

2,连接不同类型的网络:网关可以连接不同类型的网络,如连接LAN和WAN。

3,实现数据包过滤:网关可以根据规则过滤数据包,从而保护网络的安全。

4,实现路由:网关可以根据路由表将数据包转发到目标网络或主机。

隧道的应用场景

隧道可以将数据包封装在另一个协议中以便在不同网络之间传输。下面列出了一些隧道的应用场景:

1,远程访问:通过建立隧道,用户可以从外部网络远程访问内部网络。

2,负载均衡:隧道可以将数据包转发到多个目标主机,从而实现负载均衡。

第六章 HTTP首部

  • HTTP请求报文结构

  • HTTP响应报文结构

  • HTTP 首部字段结构

  1. 结构规范

首部字段名: 字段值
如:
Content-Type: text/html ####单字段
Keep-Alive: timeout=15, max=100 ####多字段

  1. 若 HTTP 首部字段重复了会如何?

当 HTTP 报文首部中出现了两个或两个以上具有相同首部字段名时会 怎么样?这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同, 结果可能并不一致。有些浏览器会优先处理第一次出现的首部字段,而有 些则会优先处理最后出现的首部字段。

  • 4种 HTTP 首部字段类型
  1. 通用首部字段(General Header Fields)

请求报文和响应报文两方都会使用的首部。

  1. 请求首部字段(Request Header Fields)

从客户端向服务器端发送请求报文时使用的首部。补充了请求的附 加内容、客户端信息、响应内容相关优先级等信息。

  1. 响应首部字段(Response Header Fields)

从服务器端向客户端返回响应报文时使用的首部。补充了响应的附 加内容,也会要求客户端附加额外的内容信息。

  1. 实体首部字段(Entity Header Fields)

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

  • HTTP/1.1 首部字段一览

HTTP/1.1 规范定义了如下 47 种首部字段。

  • 非 HTTP/1.1 首部字段

在 HTTP 协议通信交互中使用到的首部字段,不限于 RFC2616 中 定义的 47 种首部字段。还有 Cookie、Set-Cookie 和 Content-Disposition 等在其他 RFC 中定义的首部字段,它们的使用频率也很高。
这些非正式的首部字段统一归纳在 RFC4229 HTTP Header Field Registrations 中。

  • End-to-end 首部和 Hop-by-hop 首部

HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成 2 种类型。

端到端首部(End-to-end Header) 分在此类别中的首部会转发给请求 / 响应对应的最终接收目标,且 必须保存在由缓存生成的响应中,另外规定它必须被转发。

逐跳首部(Hop-by-hop Header) 分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1和之后版本中,如果要使用 hop-by-hop 首部,需提供 Connection 首部字段。

下面列举了 HTTP/1.1 中的逐跳首部字段。除这 8 个首部字段之外, 其他所有字段都属于端到端首部。

  1. Connection
  2. Keep-Alive
  3. Proxy-Authenticate
  4. Proxy-Authorization
  5. Trailer
  6. TE
  7. Transfer-Encoding
  8. Upgrade

第七章 确保Web安全的HTTPS

一、HTTP的缺点

  • 通信使用明文可能会被窃听
    1. TCP/IP是可能被窃听的网络
    2. 加密处理防治被窃听(通信加密HTTPS和内容加密)
  • 不验证同新方的身份就可能遭遇伪装
    1. 任何人都可以发起请求
    2. 查明对手的证书(使用SSL)
  • 无法证明报文完整性,可能已遭篡改
    1. 接收到的内容可能有误
    2. 如何防止篡改(使用HTTPS)

二、HTTP+加密+认证+完整性保护 = HTTPS

  • HTTPS是身披SSL外壳的HTTP

    HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替

  • HTTPS采用混合加密机制

    共享密钥加密和公开密钥加密两者并用。交换密钥环节用公开密钥加密方式,之后建立通信交换报文阶段使用共享密钥加密方式

第八章 确认访问用户身份的认证

  • 认证

  1. 密码(字符串信息)
  2. 动态令牌(仅限本人持有的设备内显示的一次性密码)
  3. 数字认证(仅限本人终端持有的信息)
  4. 生物认证(指纹和虹膜等本人的生理信息)
  5. IC卡等(仅限本人持有的信息)
  • HTTP使用的认证方式

  1. BASIC认证(基础认证)
  2. DIGEST认证(摘要认证)
  3. SSL客户端认证
  4. FormBase认证(基于表单认证)

第九、十、十一章后续有时间再看

参考资料