HTTP学习之路

一. OSI七层模型

OSI

从上图中可以清晰的看到OSI七层模型的分层情况,它是从最上面的应用层逐级往下的,下面对它们各自的作用做一概述:

  1. 第七层:应用层,提供为应用软件而设的界面,以设置与另一应用软件之间的通信,我们这里所讨论到的HTTP协议也在该层,同时,应用层也想第六层表示层发出请求。
  2. 第六层:表示层,把数据转换为能与接受者的系统格式兼容并适合传输的格式,该层已被弃用,应用层中向HTTP、FTP、Telnet等协议有类似功能,传输层也有协议具备该功能。
  3. 第五层:会话层,负责在数据传输中设置和维护电脑网络中服务端和客户端的通信连接,该层也被弃用,因为在应用层的HTTP和一些其它协议中也具备着类似的功能。
  4. 第四层:传输层,该层的协议为应用进程提供端到端的通信服务,我们经常提到的TCP(传输控制协议)就处于该层。
  5. 第三层:网络层,该层提供路由和寻址功能,为两端系统互联提供最佳路径,此外,该层还具备一定的拥塞控制和流量控制的能力,该层的协议是由IP(Internet Protocol 网际协议)规定和实现的,所以也被称为IP层。
  6. 第二层:数据链路层,它在两个网络实体之间提供数据链路的创建、维持和释放管理,声名远播的异步传输模式和IEEE 802.2协议都位于该层。
  7. 第一层:物理层,它是OSI七层模型中的最底层,它存在的意义是为数据段提供传送数据通路,确保原始数据可在各种物理媒体上传输,常见物理层设备包括网卡,光纤、串口和并口等。局域网和广域网皆属于第1、2层。

二、 HTTP的工作原理

  1. 客户端对用户输入的URI内容进行通过DNS协议查询到对应的IP。

  2. 客户端通过查询到的IP、用户提供的和默认的其他URI内容形成请求报文,向服务器端发送请求。

  3. 中间可能会经过一些代理服务器、网关和隧道,还有一些缓存服务器会将源服务器的部分内容进行缓存,当它在确定源服务器内容未进行更新,且客户端没有特定要求时,会直接将此内容向客户端进行相应。

  4. 服务器端在接收到客户端的请求报文后,根据HTTP方法,做出相应的相应,形成相应报文。

  5. 当需要使用Cookie时,客户端第一次发送请求时,服务器就会生成Cookie,并将Cookie添加到相应中,返回给客户端,客户端就会将Cookie保存下来,当下一次发送请求时,客户端所发送的请求中就会添加Cookie后再进行发送,这时服务器就会知道是谁在发送,并向客户端返回相应的响应报文。

  6. 当客户端接收到相应报文后,会将相应内容进行解析,呈现在网页上。

浏览器行为

三、URI的格式和常见的协议

URI格式

常见的协议包括本文所讲的HTTP,还有譬如FTP、mailto、Telnet,他们都是TCP/IP的子集。

IP查询有DNS协议,数据链层还有异步传输模式和IEEE 802.2协议等。

四、 HTTP和服务器交互的方法

  1. GET:向服务器获取资源,请求访问已被URI是被的资源。
  2. POST:传输实体主体,返回服务器端接收数据传回的结果。
  3. PUT:传输文件,要求将请求报文主题中包含文件内容,并将该文件内容保存到请求URI制定的位置,一般而言,服务器为了安全起见,一般不会使用该方法。
  4. DELETE:删除文件,要求将URI中的指定资源删除,和PUT方法一样,服务器一般也不会使用该方法。
  5. HEAD:它也是向服务器获取资源,但与GET方法不同的是,它不返回报文主题部分。
  6. OPTIONS:询问支持的方法,服务器会相应它所支持的所有方法。
  7. TRACE:让WEB服务器端将之前的请求通信环会给客户端的方法。
  8. CONNECT:要求用隧道协议连接代理,隧道可按要求建立起一条鱼其他服务器的通信线路,并使用SSL等加密手段,让客户端和服务器端进行安全的通信。
  9. 此外,还有LINK和UNLINK方法用来建立和断开资源之间的联系,在HTTP1.1中已被废弃。

### 五、 常见状态码

  1. 一般来讲,1XX代表接收的请求正在处理,这个状态码一般是看不到的,2XX代表请求正常处理完毕,常见的包括200、204、206等,3XX标识需要进行附加操作以完成请求,常见301、302、303、304、307等,4XX代表服务器无法处理请求,常见400、403、404等,5XX表示服务器处理请求错误,常见500、502、503等。

  2. 2XX:

    200:OK 表示客户端发送的请求在服务器端被正常处理了。

    204:No Content 表示服务器端正常处理了请求,但是返回的响应报文中没有主体部分

    206:Partial Content 该状态码表示客户端进行了部分请求,服务器端完成了这个部分请求,在相应报文中,有Content-Range指定范围的实体内容。

  3. 3XX:

    301:Moved Prmanently 永久性重定向,表示资源已经被永久的分配到了一个新的URI上了。

    302:Found 临时性重定向,表示资源已经被分配了新的URI,但下次请求时可能还会使用原来的URI。

    303:See Other 表示请求的资源存在着另一个URI,应使用GET方法定向获取请求的资源。

    304:Not Modified 表示服务器端已经确定,本地缓存是最新内容,使用本地缓存。

    307:Temporary Redirect 临时重定向,和302含义相同,和302不同,它会遵守浏览器标准,不会从POST变为GET。

  4. 4XX:

    400:Bad Request 表示请求报文中存在语法错误。

    401:Unauthorized 表示请求需要有通过HTTP认证的认证信息,若之前已经有过一次请求,则表示认证失败。

    403:forbidden 表示请求被服务器拒绝,客户端可能不具备访问该资源的权限信息。

    404:Not Found 表示服务器上找不到该资源,此外,该状态码也可能出现在服务器拒绝访问时。

  5. 5XX:

    500:Internal Server Error 服务器错误,表示可能服务器在执行请求时发生了错误。

    502:Bad Gateway 无效网关,服务器当前链接太多,导致服务器无法给出正常的相应。

    503:Service Unavailable 服务器处于超负载或者正在进行停机维护的状态,无法处理请求。

六、报文的组成部分

报文

七、请求头的格式和作用

客户端在向服务器端发送HTTP请求时,必须指明请求类型,一般包括HTTP方法、URI以及HTTP版本。

此外,客户端会根据需要向服务器发送一些其它的请求头:

请求头
上图为某个页面的请求头,其中包括:

  • Accept:设置浏览器可接受的MIME类型 以上为通配
  • Accept-Encoding:设置浏览器能够解码的数据编码方式 以上gzip、defalate、sdch
  • Accept-Language:设置浏览器所支持的语言 以上为中文,q则表示权重
  • Connection:表示是否需要持久连接 以上为需要
  • Host:初始URI中的主机和端口
  • If-Modified-Since:为资源指定一个日期,只有在这个日期之后进行访问才需要重新进行请求,否则返回304状态码,使用缓存
  • Referer:包含一个URI,用户从该URI触发访问当前请求页面。
  • User-Agent:代表用户现在正在使用的浏览器类型,以便服务器端进行资源的选择。
  • 此外,请求头中还可以包括一些其它内容,如Content-length(请求消息正文长度)、Cookie、From(请求发送者的E-mail,一般不会在浏览器中用到)和Pragma(若指定no-cache,则表示无论是否有缓存,都不能使用,必须从服务器端重新进行数据的请求,才能使用)等。

八、首部的格式和作用

上面已经提到,报文的首部一般包括请求行/状态行、请求/响应首部字段、通用首部字段和实体首部字段

首部
以上为一个报文的首部,它的前两项为请求首部Request URL(请求的URL)和Request Method(方法),后两项为相应的首部Status Code(状态码)和Remote Address(远程地址)。

响应首部:

响应首部
在以上响应首部中,规定了缓存控制的方式,指明资源创建的时间,服务器,状态码,Alt-Svc(HTTP Alternative Services >HTTP 替代服务)和一些x-开头的非标准参数。

### 九、主体的作用

报文主体分为请求主体和相应主体:

  • 请求主体:一般为请求数据。

  • 响应主体:相应主体是可选的,当使用HEAD方法进行请求时,没有主体部分。

    一般响应主体包括所有类型的数据。

十、浏览器缓存机制的控制

在HTTP协议中,定义3种缓存机制:

  • Freshness:允许客户端无需检查原始服务器上的内容就缓存当前相应,其对应字段常用ExpiresCache-Control
  • Validation:允许在当前缓存内容”过期”后检查原始内容是否已经更新,常用字段有Last-Modified和ETag。
  • Invalidation:允许在访问同一个资源时使之前的缓存内容失效,比如使用POST、PUT、DELETE方法请求数据,就会让之前的数据失效。
  • 当浏览器发送请求时,若请求首部中设置了pragma:no-cache,则默认所有的中间服务器不反回缓存的资源。

  • Cache-Control字段:

    no-cache指令:不缓存过期资源,该指令的作用是防止从缓存中返回过期资源。

    no-store指令:该指令规定缓存不能再本地存储请求或相应的任意部分。

    max-age指令:该指令所指定的时间和缓存资源的缓存事件进行比对,若指令所指定的时间更大,则表示客户端能够接受缓存的资源。

    min-fresh指令:要求缓存服务器返回至少还未过指定时间的缓存资源。

    max-stale指令:指定资源过期后,在设定时间内仍可使用,若没有指定时间,则一直可用。

    only-if-cached指令:要求缓存服务器不用重新加载,也不用确认,直接返回缓存,若缓存无响应,则返回状态码504:Gateway Timeout

    must-revalidate指令:要求向源服务器确定即将返回的相应缓存是否有效,且会忽略max-stale指令。

    proxy-revalidate指令:要求所有的缓存服务器在接受到客服端带有该指令的请求返回相应之前,必须再次验证缓存的有效性。

  • ​Expires字段:

    该字段会设置一个明确的时间,告诉客户端相应的内容在指定的时间之前都不会产生变化。浏览器因此也不需要请求文档内容,而直接从缓存内读取数据,该字段存在着缺点,若客户端和服务端时区不同可能造成时间不同,如果服务器在时间内内容发生改变,无法向客户端发出通知。该字段在HTTP1.1中优先级较低,一般会优先处理max-age

  • 条件请求字段Last-Modified和If-Modified-Since:
    1. Last-Modified是服务器端用以告诉客户端在数据最后的更新时间,客户端根据这个时间和原有资源进行比对,若在最后更新时间之后的数据,则可以直接使用,否则需要获取。
    2. If-Modified-Since是客户端去想服务器询问在这个时间之后数据资源是否改变,若没有改变,则可以直接使用缓存,否则重新进行数据的请求。
  • Connection字段:

    1. 控制不在转发给代理的首部字段,将不再转发的指定作为指令写入Connection中。
    2. 管理持久连接:keep-alive表示持久连接,close表示关闭持久连接。