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 使用
与 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 加速
- 负载均衡
- 缓存静态内容
- 压缩
- 减速上传
- 安全
- 外网发布