Skip to content

Latest commit

 

History

History
123 lines (74 loc) · 6.45 KB

Http协议.md

File metadata and controls

123 lines (74 loc) · 6.45 KB

HTTP 基本

请求方法

GET通过uri获取资源, POST用于添加新的内容, PUT用于修改某个内容,DELETE删除某个内容,

CONNECT用于代理进行传输,例如使用ssl, OPTIONS询问可以执行哪些方法, PATCH部分文档修改, PROFIND查看属性,

COPY拷贝, MOVE移动, LOCK加锁, UNLOCK解锁, TRACE远程诊断服务器,

HEAD类似get但不返回数据,用于检索数据, 返回数据元信息

URL和URI的区别

URI 是统一资源标识符, URL 是统一资源定位符, URN 是统一资源名称

URI = URL + URN (范围)

客户端请求格式

三部分

请求方法 URI 版本

请求头

请求正文(数据, 一般POST数据在这里, GET请求这里是空的)

通用头字段(请求和响应均可)

字段 意思
Cache-Control no-cache:客户端或者此数据不允许缓存
no-store:缓存应该尽快从存储器删除文档所有痕迹
max-age:缓存持续时间
min-fresh:至少在未来n秒内缓存保持新鲜
Connection close: 完成此次传输后断开连接
keepalive: 表示完成后不要断开,等待后续请求
Keep-Alive: 表示持续连接时间
Date 消息发送的时间

请求头字段表格

字段 意思
Accept 表示客户端可以接收的资源类型, text/image/html等几种常用类型
Accept-Charset 指定浏览器可以显示的字符集
Accept-Encoding 浏览器支持的编码类型, gzip或compress是常见的
Accept-Language 客户端首选语言
Authorization 客户端在访问受密码保护的网页时验证自己的身份
Connection 表示客户端是否可以持久连接, 设置为keep-alive
Content-Length 只用于POST请求, 并提供POST数据大小
Cookie 请求时带上客户端Cookie, 就是在这里
Host 指定信息的URL和端口
If-Modified-Since 在客户端保存的信息超过了服务器预设的过期时间, 设置这个属性, 如果服务端资源未更新, 则返回304, 当客户端访问页面时,服务器会将页面最后修改时间通过 Last-Modified 标识由服务器发往客户端,客户端记录修改时间,再次请求本地存在的cache页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的最后修改时间戳发送回去,服务器端通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担
User-Agent 识别浏览器客户端以及其他客户端

响应头字段表格

字段 意思
Age 当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了
Server 服务端是什么服务器软件, 及版本信息
Accepts-Ranges WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求
bytes:表示接受,none:表示不接受
Vary WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求

http 和 https 的区别

http传输的数据都是未加密的, 也就是明文的, 所以 http 协议传输数据非常不安全, 于是网景公司设计了 SSL 用于对 http 请求进行加密, 从而诞生了 https 所以简单说 https 就是 http + SSL

CA 是浏览器和服务端同时信任的证书颁发机构,浏览器事先会安装多个证书

http和https主要区别如下:

  • https协议需要到ca申请证书
  • http是超文本协议,数据明文传输, https则是具有安全性的ssl加密传输协议
  • http和https使用完全不同的连接方式, 连接端口也不一样, http是80, https是443
  • http连接很简单无状态, https是使用ssl加密的连接, 比http安全

并非绝对安全

https工作原理

客户端在使用 https 向服务端发送请求时,分为以下几个步骤

  1. 客户端使用https的url访问web服务器,要求与服务器建立ssl连接
  2. web服务器收到客户端请求后, 会将网站的证书(包含公钥)传送一份给客户端
  3. 客户端收到网站证书后会检查证书的颁发机构以及过期时间, 如果没有问题就随机产生一个秘钥
  4. 客户端利用公钥将会话秘钥加密, 并传送给服务端, 服务端利用自己的私钥解密出会话秘钥
  5. 之后服务器与客户端使用秘钥加密传输

http 2.0

  1. 多路复用

    理解帧和流, 帧中会标记出属于哪个流,

  2. 二进制传输

    1. HTTP/2 中所有加强性能的核心点在于此。在之前的 HTTP 版本中,我们是通过文本的方式传输数据。在 HTTP/2 中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。
  3. Header压缩

  4. 服务端主动push

QUIC

http2.0虽然很好, 但有一个致命问题, 这不是http协议的问题, 而是tcp的问题:

因为http2.0采取多路复用, 万一出现丢包问题, tcp就会等待重传, 导致后面数据都被阻塞, 反而不如1.1了

有人提议修改tcp——不可能了..存在太久, 修改的话整个体系都会重写

现在 谷歌大大 基于UDP 研究一个新的协议, 叫QUIC

多路复用: QUIC 原生就实现了这个功能,并且传输的单个数据流可以保证有序交付且不会影响其他的数据流,这样的技术就解决了之前 TCP 存在的问题。