《图解HTTP》 1-5章节

334 阅读13分钟

一、了解Web及网络基础

1.1 网络基础TCP/IP

在了理解HTTP,事先了解下TCP/IP协议族。
通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的。而HTTP属于它的一个内部子集。
TCP/IP协议族里重要的一点就是分层。以下4种分层:应用层、传输层、网络层和数据链路层。

  1. 应用层:决定了向用户提应用供服务时通信的活动。
  2. 传输层:传输层对上层应用层,提供出于网络连接中的两台计算机之间的数据传输。
  3. 网络层:用来处理网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包传给对方。
  4. 链路层:用来处理连接网络的硬件部分。

1.2 TPC/IP通信传输流

发送端应用层往下走,接收端则从链路层往上走。

发送端在与层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时都会把对应的首部消去。

1.3 与HTTP关系密切的协议:IP、TCP和DNS

  1. 负责传输的IP协议:IP地址指明了节点分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。没人能够全面掌握互联网中的传输状态(类似物流,中间经过很多中转站)。
  2. 确保可靠性的TCP协议:确保数据无误的送达目标。TCP采用了3次握手策略。
  3. 负责解析域名的DNS:DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。

1.4 各种协议与HTTP协议的关系

从下图中了解IP协议、TCP协议和DNS服务在使用HTTP协议的通信过程中各自发挥了哪些作用。

1.5 URI和URL

  1. URI:统一资源标识符,常见的标识符(ftp,http,ldap,tel,news..)

    协议方案:使用http:或https:等协议方案名获取访问资源是需要指定协议类型。不区分字母大小写,最后附一个冒号(:)。也可使用data:或javascript:这类指定数据或脚本程序的方案名。

    登录信息:指定用户名和密码作为从服务端获取资源时必要的登录信息(身份认证)。此项是可选项。

    服务器地址:使用绝对URI必须指定待访问的服务器地址。地址可以是类似hackr.jp这种DNS可解析的名称,或者192.168.1.1这类IPv4地址名,还可以是[0:0:0:0:0:0:0:1]这样用方括号括起来的IPv6地址名。

    服务器端口号:指定服务器连接的网络端口号。此项也是可选项,若用户省略则自动使用默认端口号。

    带层次的文件路径:指定服务器上的文件路径来定位特指的资源。这与UNIX系统的文件目录结构相似。

    查询字符串:针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数。此项可选。

    片段标识符:使用片段标识符通常可标记处已获取资源中的子资源。

  2. URL:统一资源定位符,URL表示资源的地点(互联网上所处的位置)。是URI的子集。

二、简单的HTTP协议

2.1 HTTP协议客户端与服务端

客户端发送的内容 : GET /index.htm HTTP/1.1 Host: hackr.jp 意思是访问某台服务器上的index.htm 页面资源

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

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

2.2 HTTP 是不保存状态的协议

HTPP是一种不保存状态,即无状态协议。协议对于发送过的请求或响应都不做持久化处理。(发送了之后就忘了)是为了更快地处理大量事务,确保协议的可伸缩性。为了实现保持状态功能,引入了Cookie技术。

2.3 请求URI定位资源

HTTP协议使用URI定位互联网上的资源。(可以用一个*来代替请求URI)

2.4 告知服务器意图的HTTP方法

  1. GET:获取资源。用来请求访问已被URI识别的资源。指定的资源经服务器端解析返回响应内容。如果请求的资源是文本,那就保持原样返回。(原样返回的状态码:304)
  2. POST:传输实体主体。
  3. PUT:传输文件。HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传你文件,存在安全性问题。
  4. HEAD:获得报文首部。与GET方法一样,只是不返回报文主体部分。用户确认URI的有效性及资源更新的日期时间等。
  5. DELETE:删除文件。与PUT方法一样不带校验机制。
  6. OPTIONS:询问支持的方法。用来查询针对请求URI指定的资源支持的方法。返回服务器支持的方法(GET,POST)等。
  7. TRACE:追踪路径。让Web服务器端将之前的请求通信返回给客户端的方法。发送请求时,在Max-Forwards 首部字段中填入数值,每经过一个服务端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200 OK 的响应。(会导致跨站追踪)。
  8. CONNECT:要求用隧道协议连接代理。要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

2.5 持久连接节省通信量

为了解决TCP的连接问题,HTTP/1.1 和一部的HTTP/1.0 想出了持久连接(HTTP Persistent Connections, 也称为HTTP keep-alive 或 HTTP connection reuse)的方法。
持久连接的特点是,只要任一端没有明确提出断开连接,则保持TCP连接状态。

  1. 管线化:持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。
  2. Cookie状态管理:Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息, 通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

三、HTTP 报文内的HTTP信息

3.1 HTTP报文

请求端(客户端)的HTTP报文叫做请求报文,响应端(服务端)的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符)
数据构成的字符串文本。
  1. 请求行:包含用于请求的方法, 请求 URI 和 HTTP 版本。
  2. 状态行:包含表明响应结果的状态码, 原因短语和 HTTP 版本。
  3. 首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体首部。

3.2 编码提升传输速率

HTTP在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但是编码的操作需要计算机来完成,因此会消耗更多的CPU等资源。
  1. 报文(message):是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。
  2. 实体(entity):作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。

压缩传输的内容编码:常用的编码内容有以下几种
1.gzip(GNU zip)
2.compress(UNX 系统的标准压缩)
3.deflate(zlib)
4.identity(不进行编码)
分割发送的分块传输编码:分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。

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

发送邮件时,我们可以在邮件里写入文字并添加多份附件。这是因为采用了MIME机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。
多部分对象集合包含的对象如下。
  1. multipart/form-data:在Web表单文件上传时使用。
  2. multipart/byteranges:状态码206响应报文包含了多个范围的内容使用

3.4 获取部分内容的范围要求

执行范围请求时,会用到首部字段 Range (Range: bytes=-3000, 5000-7000,7000-)来指定资源的 byte 
范围。响应会返回状态码为 206 Partial Content 的响应报文。另外,对于多重范围的范围请求, 响应会在首部字段 
ContentType 标明 multipart/byteranges 后返回响应报文。如果服务器端无法响应范围请求,则会返回状态码 200 OK 
和完整的实体内容。

3.5 内容协商返回最合适的内容

  1. 服务器驱动协商:由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理。
  2. 客户端驱动协商:有客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。
  3. 透明协商:是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。

四、返回结果的HTTP状态码

HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。让我们通过本章的
学习,好好了解一下状态码的工作机制。

200OK

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

204 No Content

该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。

206 Partial Content

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

301 Moved Permanently

永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。

302 Found

临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户能使用新的URI访问。

303 See Other

由于请求对应的资源存在着另一个 URI,应使用 GET方法定向获取请求的资源。303 状态码和 302 Found 状态码有着相同的功能,
但 303 状态码明确表示客户端应当采用 GET方法获取资源,这点与 302 状态码有区别。

304 Not Modified

表示客户端发送附带条件的请求 2 时,服务器端允许请求访资源,但未满足条件的情况。 (附带条件的请求是指采用 
GET方法的请求报文中包含 If-Match, If-ModifiedSince, If-None-Match, If-Range, If-Unmodified-Since 
中任一首部。)

307 Temporary Redirect

临时重定向。

400 Bad Request

请求报文中存在语法错误。

401 Unauthorized

发送的请求需要通过HTTP认证的认证信息。会弹出认证对话框。

403 Firbidden

对请求资源的访问被服务器拒绝了。

404 Not Found

服务器上没有该资源。路径错误。

500 Internal Server Error

服务器端在执行请求是发生了错误。服务器内部报错。

503 Service Unavailable

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

五、与HTTP协作的Web服务器

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

代理

是一种有转发功能的应用程序,代理不改变请求 
URI,会直接发送给前方持有资源的目标服务器。可级联多台代理服务器。需要附加Via 首部字段以标记出经过的主机信息;
代理有多种使用方法,按两种基准分类。 一种是是否使用缓存,另一种是是否会修改报文。
缓存代理(Caching Proxy) 会预先将资源的副本(缓存)保存在代理服务器上。代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源, 而是将之前缓存的资源作为响应返回。
不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。

网关

是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。利
用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。

隧道

是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。可按要求建立起一条与其他服务器的通信
线路,届时使用 SSL等加密手段进行通信。确保客户端能与服务器进行安全的通信。

保存资源的缓存

缓存是指代理服务器或客户端本地磁盘内保存的资源副本。缓存服务器是代理服务器的一种,并归类在缓存代理类型中。
可避免多次从源服务器转发资源。缓存是有有效期限的,缓存失效, 缓存服务器将会再次从源服务器上获取“新”资源。