图解http
计算机与网络设备要相互通信,双方就必须基于相同的方法。我们就把这种规则称为协议(protocol)。通常使用的网络(包括互联网)是在 TCP/IP 协议族的基础上运作的。而 HTTP 属于它内部的一个子集。
一、TCP/IP分层
①应用层
应用层决定了向用户提供应用服务时通信的活动。TCP/IP 协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和 DNS(Domain Name System,域 名系统)服务就是其中两类。HTTP协议也处于该层。
②传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议)。
③网络层
网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。
④链路层
用来处理连接网络的硬件部分。硬件上的范畴均在链路层的作用范围之内。
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该 层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层 时会把对应的首部消去。这种把数据信息包装起来的做法称为封装(encapsulate)。
二、http协议
HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同,用于客户端和服务器之间的通信。
2.1无状态连接
HTTP 是一种不保存状态,即无状态(stateless)协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。
http方法:
①GET:请求资源;②POST:传输实体主体;③PUT:传输文件;④HEAD:获取报文头部;⑤DELETE:删除文件;⑥OPTIONS:询问支持的方法;⑦TRACE:追踪路径;⑧CONNECT:要求使用隧道协议连接代理;
2.2持久化和管线化
持久连接:HTTP/1.1 和一部分的 HTTP/1.0使用持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或 HTTP connection reuse)的方法。持久连接的特点是,只要任意一端 没有明确提出断开连接,则保持 TCP 连接状态。
管线化:管线化技术出现后,不用等待响应亦可直接发送下一个请求。这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
2.3Cookie
Cookie 技术通过在请求和响应报文中写入 Cookie 信 息来控制客户端的状态。
Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的 首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器 发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一 个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
三、http报文
用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。 HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。
HTTP 报文大致可分为报文首部和报文主体两块。两者由最初出现的 空行(CR+LF)来划分。通常,并不一定要有报文主体。
四、http状态码
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结 果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出 现了错误。
4.1 2XX成功
2XX 的响应结果表明请求被正常处理了。
4.2 3XX重定向
3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。
4.3 4XX 客户端错误
4XX 的响应结果表明客户端是发生错误的原因所在。
4.4 5XX 服务器错误
5XX 的响应结果表明服务器本身发生错误。
五、http首部
5.1http首部字段
HTTP 首部字段根据实际用途被分为以下 4 种类型。
①通用首部字段(General Header Fields),请求报文和响应报文两方都会使用的首部
②请求首部字段(Request Header Fields)
③响应首部字段(Response Header Fields)
④实体首部字段(Entity Header Fields)
5.2通用首部字段
5.2.1Cache-Control
Cache-Control: public
:当指定使用 public 指令时,则明确表明其他用户也可利用缓存;
Cache-Control: private
:缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送 过来的请求,代理服务器则不会返回缓存;
Cache-Control: no-cache
:
①客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接 收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发 给源服务器。
②服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对 资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资 源有效性进行确认,且禁止其对响应资源进行缓存操作。
Cache-Control: no-cache=Location
:由服务器返回的响应中,若报文首部字段 Cache-Control 中对 no-cache 字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首 部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首 部字段可以使用缓存。只能在响应指令中指定该参数。
Cache-Control: max-age=604800(单位:秒)
:
①当客户端发送的请求中包含 max-age 指令时,如果判定缓存资源的缓 存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。 另外,当指定 max-age 值为 0,那么缓存服务器通常需要将请求转发 给源服务器。
②当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源 的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时间。
Cache-Control: min-fresh=60(单位:秒)
:min-fresh 指令要求缓存服务器返回至少还未过指定时间的缓存资源。
Cache-Control: only-if-cached
:使用 only-if-cached 指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。换言之,该指令要求缓存服务器不重新 加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码 504 Gateway Timeout。
Cache-Control: must-revalidate
:使用 must-revalidate 指令,代理会向源服务器再次验证即将返回的响 应缓存目前是否仍然有效。
5.2.2Connection
Connection 首部字段具备如下两个作用。 控制不再转发给代理的首部字段,管理持久连接。
Connection: 不再转发的首部字段名
Connection: Keep-Alive
:建立持久连接
5.2.3Date
首部字段 Date 表明创建 HTTP 报文的日期和时间。
5.3请求首部字段
5.3.1Accept
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
:Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体 类型的相对优先级。可使用 type/subtype 这种形式,一次指定多种媒 体类型。
Accept-Encoding: gzip, deflate
:告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。
5.3.2If-Modified-Since
If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT
:
首部字段 If-Modified-Since,属附带条件之一,它会告知服务器若 If-Modified-Since 字段值早于资源的更新时间,则希望能处理该请求。 而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源 都没有过更新,则返回状态码 304 Not Modified 的响应。
If-Modified-Since 用于确认代理或客户端拥有的本地资源的有效性。 获取资源的更新日期时间,可通过确认首部字段 Last-Modified 来确定。
5.3.3range
If-Range
&range
5.4响应首部字段
5.4.1age
Age: 600
:首部字段 Age 能告知客户端,源服务器在多久前创建了响应。字段值 的单位为秒。
5.4.2ETag
ETag: "82e22293907ce725faf67773957acd12"
5.5实体首部字段
Allow: GET, HEAD
:首部字段 Allow 用于通知客户端能够支持 Request-URI 指定资源的所 有 HTTP 方法。当服务器接收到不支持的 HTTP 方法时,会以状态码 405 Method Not Allowed 作为响应返回。与此同时,还会把所有能支 持的 HTTP 方法写入首部字段 Allow 后返回。
Content-Encoding: gzip
:首部字段 Content-Encoding 会告知客户端服务器对实体的主体部分选 用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行 的压缩。
Expires: Wed, 04 Jul 2012 08:26:05 GMT
:首部字段 Expires 会将资源失效的日期告知客户端。缓存服务器在接 收到含有首部字段 Expires 的响应后,会以缓存来应答请求,在 Expires 字段值指定的时间之前,响应的副本会一直被保存。当超过 指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求 资源。但是,当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字 段 Expires,会优先处理 max-age 指令。
Last-Modified: Wed, 23 May 2012 09:59:55 GMT
:首部字段 Last-Modified 指明资源最终修改的时间。
5.6为cookie服务的字段
管理服务器与客户端之间状态的 Cookie,虽然没有被编入标准化 HTTP/1.1 的 RFC2616 中,但在 Web 网站方面得到了广泛的应用。
下面的表格列举了 Set-Cookie 的字段值: