howieyi

No pains, No gains!

View project on GitHub

HTTP 协议的那些事

HTTP

  • HTTP 是超文本传输协议,从 www 浏览器传输到本地浏览器的 一种传输协议,网站是基于 HTTP 协议的,例如网站的图片、 CSS、JS 等都是基于 HTTP 协议进行传输的。
  • HTTP 协议是由从客户机到服务器的请求(Request)和从服务器 到客户机的响应(response)进行约束和规范。

浏览器行为与 HTTP 协议

  • 输入网址并回车
  • 浏览器解析域名
  • 浏览器发送 HTTP 请求
  • 服务器处理请求
  • 服务器返回 HTML 响应
  • 浏览器处理 HTML 页面
  • 继续请求其他资源

TCP/IP 协议栈

  • 应用层:为用户提供所需要的各种服务,例如:HTTP、FTP、DNS、SMTP 等
  • 传输层:为应用层实体提供端到端的通信功能,保证数据包的顺序传送及数据 的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用 户数据报协议(UDP).
  • 网络层:主要解决主机到主机的通信问题。IP 协议是网际互联层最重要的协议
  • 网络接口层:负责监视数据在主机和网络之间的交换。

HTTP 的工作过程(一次 HTTP 操作称为一个事务,其工作过程可分为四步)

  • 1.首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP 的工作开始。
  • 2.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是 MIME 信息包括请求修饰符、客户机信息和可能的内容。
  • 3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功 或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。
  • 4.客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
  • 如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户 来说,这些过程是由 HTTP 自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

请求与响应

  • HTTP 请求组成:请求行、消息报头、请求正文。
  • HTTP 响应组成:状态行、消息报头、响应正文。
  • 请求行组成:以一个方法符号开头,后面跟着请求的 URI 和协 议的版本。
  • 状态行组成:服务器 HTTP 协议的版本,服务器发回的响应状态代码和状态代码的文本描述。

请求方法

  • GET: 请求获取 Request-URI 所标识的资源
  • POST: 在 Request-URI 所标识的资源后附加新的数据
  • HEAD: 请求获取由 Request-URI 所标识的资源的响应消息报头
  • PUT: 请求服务器存储一个资源,并用 Request-URI 作为其标识
  • DELETE:请求服务器删除 Request-URI 所标识的资源
  • TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
  • CONNECT:保留将来使用
  • OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求

HTTP 状态码(状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值)

  • 1xx:指示信息–表示请求已接收,继续处理
  • 2xx:成功–表示请求已被成功接收、理解、接受
  • 3xx:重定向–要完成请求必须进行更进一步的操作
  • 4xx:客户端错误–请求有语法错误或请求无法实现
  • 5xx:服务器端错误–服务器未能实现合法的请求

常用的请求报头

  • Accept 请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,Accept:text/html,Accept-Charset 请求报头域用于指定客户端接受的字符集。Accept-Encoding:Accept-Encoding 请求 报头域类似于 Accept,但是它是用于指定可接受的内容编码。
  • Accept-Language 请求报头域类似于 Accept,但是它是用于指定一种自然语言。
  • Authorization 请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收 到服务器的响应代码为 401(未授权),可以发送一个包含 Authorization 请求报头域的请求,要求服务 器对其进行验证。
  • Host 请求报头域主要用于指定被请求资源的 Internet 主机和端又号,它通常从 HTTP URL 中提取出来 的,发送请求时,该报头域是必需的。
  • User-Agent 请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。

常用的响应报头

  • Location 响应报头域用于重定向接受者到一个新的位置。Location 响应报头域常用在更换域名的时候。
  • Server 响应报头域包含了服务器用来处理请求的软件信息。与 User-Agent 请求报头域是相对应的。
  • WWW-Authenticate 响应报头域必须被包含在 401(未授权的)响应 消息中,客户端收到 401 响应消息时候,并发送 Authorization 报头 域请求服务器对其进行验证时,服务端响应报头就包含该报头域

实体报头

  • 请求和响应消息都可以传送一个实体。一个实体由实体报头域 和实体正文组成,但并不是说实体报头域和实体正文要在一起 发送,可以只发送实体报头域。实体报头定义了关于实体正文 (eg:有无实体正文)和请求所标识的资源的元信息
  • 常用的实体报头
    • Content-Encoding 实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文 的附加内容的编码,因而要获得 Content-Type 报头域中所引用的媒体类型,必须采用相应的解 码机制。
    • Content-Language 实体报头域描述了资源所用的自然语言
    • Content-Length 实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
    • Content-Type 实体报头域用语指明发送给接收者的实体正文的媒体类型。
    • Last-Modified 实体报头域用于指示资源的最后修改日期和时间。
    • Expires 实体报头域给出响应过期的日期和时间。

cookies 与 session

  • Cookies 是保存在客户端的小段文本,随客户端点每一个请求发送该 url 下的所有 cookies 到服务器端。
  • Session 则保存在服务器端,通过唯一的值 sessionID 来区别每一 个用户。SessionID 随每个连接请求发送到服务器,服务器根据 sessionID 来识别客户端,再通过 session 的 key 获取 session 值

与 Cookie 相关的 HTTP 扩展头

  • Cookie:客户端将服务器设置的 Cookie 返回到服务器
  • Set-Cookie:服务器向客户端设置 Cookie

服务器在响应消息中用 Set-Cookie 头将 Cookie 的内容回送给客户端,客户端在新 的请求中将相同的内容携带在 Cookie 头中 发送给服务器。从而实现会话的保持

Session 使用

  • 使用 Cookie 来实现(Set-Cookie: JSESSIONID=XXXX)
  • 使用 URL 回显来实现

缓存机制

缓存会根据请求保存输出内容的副本,例如 html 页面,图片,文 件,当下一个请求来到的时候:如果是相同的 URL,缓存直接使 用副本响应访问请求,而不是向源服务器再次发送请求。

  • 减少相应延迟(优点)
  • 减少网络带宽消耗(优点)
  • 第一次请求 第一次请求
  • 再次请求 再次请求

Etag/If-None-Match 策略

  • Etag:web 服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)
  • If-None-Match:当资源过期时(使用 Cache-Control 标识的 max- age),发现资源具有 Etage 声明,则再次向 web 服务器请求时带 上头 If-None-Match (Etag 的值)。web 服务器收到请求后发现 有头 If-None-Match 则与被请求资源的相应校验串进行比对,决 定返回 200 或 304。

Last-Modified/If-Modified-Since 策略

  • Last-Modified:标示这个响应资源的最后修改时间。web 服务器在响应请求时,告诉浏览器资源的最后修改时间。
  • If-Modified-Since:当资源过期时(使用 Cache-Control 标识的 max-age),发 现资源具有 Last-Modified 声明,则再次向 web 服务器请求时带上头 If- Modified-Since,表示请求时间。web 服务器收到请求后发现有头 If-Modified- Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说 明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应 HTTP 304 (无需包 体,节省浏览),告知浏览器继续使用所保存的 cache。

下一代标准:HTTP2

  • 使用二进制格式传输,更高效、更紧凑。
  • 对报头压缩,降低开销。
  • 多路复用,一个网络连接实现并行请求。
  • 服务器主动推送,减少请求的延迟

反向代理的用途

  • 加密和 SSL 加速
  • 负载均衡
  • 缓存静态内容
  • 压缩
  • 减速上传
  • 安全
  • 外网发布