周末抽一点时间学习巩固一下http
HTTP 报文结构
http是基于TCP应用层上的协议
对于 TCP 而言,在传输的时候分为两个部分:TCP头和数据部分。
而http也类似,也是header + body结构,具体而言就是:
起始行+ 头部 + 空行 + 实体
具体结构
- 起始行
请求报文的起始行:请求方法 + 路径 + http版本
GET /path HTTP/1.1
响应报文的起始行:http版本 + 状态码 + 原因,响应报文起始行也叫状态行
HTTP/1.1 200 OK
- 头部
请求头有若干个属性构成,形式为
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
-
空行 用来区分开
头部和实体 -
实体 也就是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 服务器网关错误
特点
优点
- 灵活性。没有严格的语法限制,传输形式多样性:文本、图片、视频
- 可靠传输。HTTP 基于 TCP/IP,因此把这一特性继承了下来。这属于 TCP 的特性,不具体介绍了。
- 无状态。这里的状态是指通信过程的上下文信息,而每次 http 请求都是独立、无关的,默认不需要保留状态信息。
缺点
- 无状态 在需要长连接的场景中,需要保存大量的上下文信息,以免传输大量重复的信息,那么这时候无状态就是 http 的缺点了。
- 明文传输 即协议里的报文(主要指的是头部)不使用二进制数据,而是文本形式。
cookie与session
- cookie保存在客户端,每次请求都会带上,作为浏览器识别用户的标识
- session保存在服务器,http是无状态协议,服务器需要某种机制来标识用户的动作,就用到session
cookie
生存周期
Cookie 的有效期可以通过Expires和Max-Age两个属性来设置。
作用域
关于作用域也有两个属性: Domain和path, 给 Cookie 绑定了域名和路径。
HTTPS
HTTP本身的缺点
- HTTP 本身不具备加密的功能,HTTP 报文使用明文方式发送
- 无法确认你发送到的服务器就是真正的目标服务器(可能服务器是伪装的)
- 请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击被称为中间人攻击
超文本传输安全协议(英语: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资源的标识