你所不知道的http

240 阅读5分钟

周末抽一点时间学习巩固一下http

HTTP 报文结构

http是基于TCP应用层上的协议

对于 TCP 而言,在传输的时候分为两个部分:TCP头数据部分

而http也类似,也是header + body结构,具体而言就是:

起始行+ 头部 + 空行 + 实体

具体结构

  1. 起始行

请求报文的起始行:请求方法 + 路径 + http版本

GET /path HTTP/1.1

响应报文的起始行:http版本 + 状态码 + 原因,响应报文起始行也叫状态行

HTTP/1.1 200 OK 
  1. 头部 请求头有若干个属性构成,形式为key: value。服务端据次获取客户端信息
Authorization: 	HTTP授权的授权证书
Cookie: HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器
Content-Length: 请求的内容的长度
Content-Type: application/x-www-form-urlencoded || multipart/form-data

响应头包含了返回过来的数据信息

Allow: 允许的请求行为
Content-Length: 响应的内容的长度
Expires: 响应过期的日期和时间

请求头和响应头详细:http://tools.jb51.net/table/http_header

  1. 空行 用来区分开头部实体

  2. 实体 也就是body,请求实体和响应实体

请求方法

  • GET 一般是获取数据
  • HEAD 获取资源的元信息(只获取http的头,比如判断某种资源是否存在)
  • POST 提交数据,即上传数据
  • PUT 修改数据
  • DELETE: 删除资源(几乎用不到)
  • OPTIONS: 列出可对资源实行的请求方法,用来跨域请求

GET 和 POST 有什么区别

首先最直观的是语义上的区别:get一般获取支援,post一般提交数据,上传资源;

而后,又有这些区别:

  • 缓存的角度,GET 请求会被浏览器主动缓存下来,留下历史记录,而 POST 默认不会。
  • 编码的角度,GET 只能进行 URL 编码,只能接收 ASCII 字符,而 POST 没有限制
  • 参数的角度,GET 一般放在 URL 中,因此不安全,POST 放在请求体中,更适合传输敏感信息。
  • 大小限制的角度,GET有长度限制,POST没有(理论上没有限制,tomcat限制2M)

状态码

  • 1xx: 表示目前是协议处理的中间状态,还需要后续操作。
  • 2xx: 表示成功状态。
  • 3xx: 重定向状态,资源位置发生变动,需要重新请求。
  • 4xx: 请求报文有误。
  • 5xx: 服务器端发生错误。

常见的状态码

  • 200 OK 成功
  • 204 No Content:表示客户端发送给客户端的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回)
  • 301 Moved Permanently:永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的
  • 302 Found:临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL;
  • 400 参数错误
  • 401 未认证
  • 403 禁止访问
  • 404 找不到资源
  • 500 服务器程序发生错误
  • 502 服务器网关错误

特点

优点

  1. 灵活性。没有严格的语法限制,传输形式多样性:文本、图片、视频
  2. 可靠传输。HTTP 基于 TCP/IP,因此把这一特性继承了下来。这属于 TCP 的特性,不具体介绍了。
  3. 无状态。这里的状态是指通信过程的上下文信息,而每次 http 请求都是独立、无关的,默认不需要保留状态信息。

缺点

  1. 无状态 在需要长连接的场景中,需要保存大量的上下文信息,以免传输大量重复的信息,那么这时候无状态就是 http 的缺点了。
  2. 明文传输 即协议里的报文(主要指的是头部)不使用二进制数据,而是文本形式

cookie与session

  • cookie保存在客户端,每次请求都会带上,作为浏览器识别用户的标识
  • session保存在服务器,http是无状态协议,服务器需要某种机制来标识用户的动作,就用到session

cookie

生存周期

Cookie 的有效期可以通过Expires和Max-Age两个属性来设置。

作用域

关于作用域也有两个属性: Domain和path, 给 Cookie 绑定了域名和路径。

HTTPS

HTTP本身的缺点

  1. HTTP 本身不具备加密的功能,HTTP 报文使用明文方式发送
  2. 无法确认你发送到的服务器就是真正的目标服务器(可能服务器是伪装的)
  3. 请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击被称为中间人攻击

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

HTTP缓存

  • 强制缓存

浏览器不会向服务器发起请求,直接从本地缓存中读取文件,并返回状态200

  • 协商缓存

浏览器向服务器发起请求,服务器根据请求头中的一些参数是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源

http缓存的相关字段

  • Express 资源的有效时间
  • Cache-Control 缓存策略
  • Last-Modified 响应头 资源最近修改的时间
  • If-Modified-Since 请求头 浏览器上一次请求的时间
  • Etag 资源的标识