# http协议
# 概述
- 无连接--限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态
- 简单快速
- 灵活
# Request
# 请求行
- Method
- GET---请求获取Request-URI所标识的资源/从指定的资源请求数据
- POST---在Request-URI所标识的资源后附加新的数据/向指定的资源提交要被处理的数据
- HEAD---请求获取由Request-URI所标识的资源的响应消息报头/与 GET 方法相同,但只返回 HTTP 报头,不返回文档主体
- PUT---请求服务器存储一个资源,并用Request-URI作为其标识/上传指定的 URI 表示
- DELETE---请求服务器删除Request-URI所标识的资源
- TRACE---请求服务器回送收到的请求信息,主要用于测试或诊断/请求服务器在响应中的实体主体部分返回所得到的内容
- CONNECT--- 保留将来使用/HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS---预检请求/请求查询服务器的性能,或者查询与资源相关的选项和需求
# 注意
- 方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
- HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。
- RequestUrl---https://www.baidu.com/img
- HttpVersion--Http 1.1
# 消息报头
- Accept--- 指定客户端接受哪些类型的信息/MIME
- image/gif gif图片 - text/html html文本
- Accept-Charset--- 客户端接受的字符集
- gb2312中文字符 - iso-8859-1 西文字符集 - utf-8 多语言字符
- Accept-Encoding----可接受的内容编码
- gzip,deflate 压缩类型 - identity 默认
- Accept-Language---指定一种自然语言--zh-cn
- Authorization--- 证明客户端有权查看某个资源
- Host--- 指定被请求资源的Internet主机和端口号--www.kaikeba.com:8080
- User-Agent-用户代理
- 操作系统及版本 - CPU类型 - 浏览器及版本 -浏览器渲染引擎 - 浏览器语言 - 浏览器插件
- Content-Type --- Body编码方式
# 请求正文--根据头部的Content-Type确定
- application/x-www-form-urlencoded
- title=test&sub%5B%5D=1 - 默认数据编码方式
- application/json
- 序列化后的JSON字符串 - ajax
- text/xml--- XML作为编码方式的远程调用规范
- text/plain--数据以纯文本形式(text/json/html)进行编码
- multipart/form-data
- 既有文本数据,又有文本等二进制数据
- WebKitFormBoundaryrGKCBY7qhFd3TrwA
- Content-Dispostion:form-data;name="text"
- title
- Content-Dispositon:from-data;name="file";filename="chorme.png"
- Content-type:image/png
- PNG...content fo chrome.png... - 允许在数据中包含整个文件,所以常用于文件上传
- 既有文本数据,又有文本等二进制数据
- WebKitFormBoundaryrGKCBY7qhFd3TrwA
# Response
# 状态行--状态码
- 1xx---指示消息--表示请求已接受,继续处理
- 100 表示客户端应该继续进行请求。当前服务端已经收到客户端请求的初始部分,而且也没有关闭连接,客户端应该继续发送请求的剩余部分。不过如果请求已经发送完毕,客户端会直接忽略此响应。服务器要在请求完成时发送一个最终响应
- 2xx---成功--表示请求已被成功接收、理解、接受
- 200 ok 请求成功
- 201 created/已创建
- 201 表示服务器在请求的响应中建立了新文档;应在定位头信息中给出他的URL
- 202 Accepted/已接受
- SC-ACCEPTED告诉客户端请求正在执行,但还没有处理完
- 203 非官方信息
- 状态码203是表示文档呗正常返回,但是由于正在使用的是文档副本所以某些响应头信息可能不正确,这是HTTP1.1新加入的
- 204 no Content/无内容
- 在没有新文档的情况下,204确保浏览器继续显示先前的文档。在各状态码对于用户周期新的重载某一页非常有用,并且你可以确定先前的页面是否已经更新。但是,这种方法对通过刷新响应头信息或等价的HTML标记自动重载的页面起作用,因为它会返回一个204状态码停止以后的重载。但基于Javascript脚本的自动重载在让然需要能够起作用
- 206 局部内容
- 206(CS_PARTIAL_CONTENT)是在服务器完成了一个包含Range头信息的局部请求时候被发送的。这是HTTP1.1新加入的
3xx---重定向--要完成请求必须进行更进一步操作
- 301 所有请求页面转移到URL
- 302 所有请求转移到临时重定向
- 304 (Not Modified/为修正)
- 305 使用代理
4xx---客户端错误--请求有语法错误或请求无法实现
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Fount 请求资源不存在,eg:输入了错误的URL
405 Method Not Allowed 方法未允许
406 Not Acceptable 无法访问
- 表示请求资源的MIME类型与客户端中Accept头信息指定的类型不一致。
407 代理服务器认证要求
- 407 (SC_PROXY_AUTHENTICATION_REQUIRED)与401状态有些相似,只是这个状态用于代理服务器。该状态指出客户端必须通过代理服务器的认证。代理服务器返回一个Proxy-Authenticate响应头信息给客户端,这会引起客户端使用带有Proxy-Authorization请求的头信息重新连接。该状态码是新加入 HTTP 1.1中的。
408 请求超时
- 是指服务端等待客户端发送请求的时间过长
409 冲突
428 Precondition Required(要求先决条件)
429 Too Many Requests(太多请求)
当你需要限制客户端请求某个服务的数量,也就限制请求速度时,该状态码会非常用用。在此之前,有一些类似的状态码例如509
如果你希望限制客户端对服务的请求数,可使用429,同时包含一个Retry-After响应头用于告诉客户端多长时间可以再次请求服务
431 请求头字段太大
5xx---服务的错误--服务器未能实现合法的请求
- 500 Internal Server Error 服务器发生不可预期的错误-- 内部服务器错误
- 501 未实现---状态告诉客户端服务器不支持请求中要求的功能。例如,客户端执行了如PUT这样的服务器并不支持的命令。
- 502 Bad Gateway。一般表现为自己写的应用层服务(Java/go/php)挂了,网关层无法接受到响应
- 503 Server Unavailable 服务无法获得 --服务器当前不能处理客户端的请求,一段时间后可能恢复请求
- 504--gateway Timeout(网关超时),一般表现为应用层服务(upstream)超时,如果查库操作耗时十分钟,超过了Nginx配置的超时时间
- 505 不支持的HTTP版本
- 511 要求网络认证
http新增的四个状态码 (opens new window)
# 消息报头
- 响应报头
- Location 重定向接受者到一个新的位置 - WWW-Authenticate 包含在401(未授权)响应信息中,客户端收到401响应消息的时候,并发送Authorzation报头域请求服务器对其进行验证时,服务的响应报头就包含该报头域 - Server 包含了服务器用来处理请求的软件信息 -- Apache-Coyote/1.1
- 实体报头
- Content-Encoding 媒体类型的修饰符 eg:Content-Encoding:gzip
- Content-Language 资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读
- Content-Length 正文长度,以字节方式存储的十进制数字来表示
- Content-Type 实体报头域用于指名发送接受者的实体正文的媒体类型
- text/html;chartset=UTF-8
- application/json;charset=UTF-8 - 详细列表 (opens new window)
- POST
- Expires 响应过期的日期和时间
- 为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面 - 无缓存 response.setDateHeader('Expires', '0');
# 响应正文
# HTTP 1.X
缺陷:线程阻塞,在同一时间,同一域名的请求有一定数量限制(一般为 6 ~ 8 个),超出限制数目的请求会被阻塞
# HTTP 1.0
缺陷:浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接的新建成本很高,因为需要客户端和服务器三次握手,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去请求
解决方案:添加头信息--非标准的connection字段connection:kepp-alive;
# HTTP1.1
- 持久连接:引入持久连接,即TCP连接默认不关闭,可以多个请求复用,不用声明connection:keep-alive---断开connection:close(大多浏览器允许同时建立六个持久连接)
- 管道机制:即在同一个TCP连接里面,客户端可以同时发送多个请求
- 分块传输编码:服务的没产生一块就传送一块,采用流模式取代缓存模式
- 新增请求: put delete options connect
缺点
- 虽然允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行处理一个,才会处理下一个
- 避免方式-是减少请求次数 二是同时多开持久连接
TIP
HTTP/1.1通过长链接减少了大量创建、断开连接造成的性能消耗,但是它的并发能力受到限制,表现在两个方面
- HTTP/1.1中使用持久连接时,一个连接中同一时刻只能处理一个请求。当前的请求没有结束之前,其他的请求只能处于阻塞状态,这种情况成为对头阻塞
- 浏览器为了减轻服务器的压力,限制了同一个域名下的HTTP连接数,一般为6~8个。为了解决数量限制,出现了 域名分片 技术,其实就是资源分域,将资源放在不同域名下(比如二级子域名下),这样就可以针对不同域名创建连接并请求,以一种讨巧的方式突破限制,但是滥用此技术会造成很多问题,比如每个TCP连接本身需要经过DNS查询、三步握手,慢启动等,还占用额外的CPU和内存,对于服务器来说过多的连接也容易造成网络拥挤、交通阻塞等
# HTTP2.0
特点:
- 采用二进制格式而非文本格式 --二进制分帧
- 完全多路复用,而非有序并阻塞的,只需一个连接即可实现并行
- 报头压缩,降低开销
- 服务端推送
# 二进制协议
HTTP1.1的头部信息肯定是文本,数据体可以是文本,也可以是二进制;2.0是彻底的二进制协议,头部和数据体都是二进制统称为帧;
二进制解析起来更高效,线上更紧凑 错误更少
# 多路复用
复用TCP连接,在一个连接里面,客户端和浏览器可以同时发送多个请求和回应,而且不用按照顺序,这就避免了队头阻塞,一个通道可以有240多个连接
# 报头压缩
HTTP协议是无状态,导致每次请求必须附上所有信息---请求很多字段是重复的,一样内容重复请求浪费带宽 影响速度
2.0引入了头部压缩机制,一方面头信息使用gzip压缩后发送 另一方面客户端和服务端同时维护一张信息表,所有字段都在这表上,产生一个索引号之后不发送字段 只发送索引号
# 服务端推送
HTTP2.0允许服务器未经请求,主动向客户端发送请求
通过推送男鞋服务器任务,客户端需要的内容缓存到客户端中,避免往返延迟
# HTTP3.0
HTTP3.0 相对于HTTP2.0是一种脱胎换骨的改变!
http3 基于 UDP 协议,这是与以前版本的 http 最大的不同,可以解决 http2 TCP 连接阻塞的问题。(给指定地址发送http请求,如果该地址是无法访问的,那么http会在一段时间内都在请求该地址,造成程序的堵塞)
HTTP协议是应用层协议,都是建立在传输层之上。我们也都知道传输层上面不只有TCP协议,还有另外一个强大的协议UDP协议,2.0和1.0都是基于TCP的,因此都会有TCP带来的硬伤以及局限性。而HTTP3.0则是建立在UDP的基础上。所以其与HTTP2.0之间有质的不同
HTTP3.0特性如下
- 连接迁移
- 无队头阻塞
- 自定义的拥塞控制
- 前头安全和前向纠错
建议大家详细看看这篇文章Http2.0 的一些思考以及 Http3.0 的优势 (opens new window)
# HTTPS
http协议通常承载与TCP协议之上,在HTTP和TCP之间添加一个安全协议层(ssl或者tsl)这就是HTTPS
SSL/TLS实际位于传输层与应用层之间。
# 作用
- 对数据加密,并建立一个信息安全通道,来保证传输过程中数据安全
- 对网站服务器身份认证
# http/https区别
- https是加密传输,http是明文传输
- http需要用到ssl整数 http不用
- https比http更安全,对搜索引擎更友好 利于SEO
- https标准端口443, HTTP标准端口80
- https基于传输层 http基于应用层
# https加密过程
对称加密和非对阵加密结合方式
- 浏览器使用HTTPS的url访问服务器建立SSL连接
- 服务器收到SSL连接,发送非对称加密的公钥A返回给浏览器
- 浏览器生成随机数,作为对称加密的密钥B
- 浏览器使用公钥A对自己生成的密钥B进行加密得到密钥C
- 浏览器将密钥C发送给服务器
- 服务器用私钥D对接收的密钥c进行解密,得到对称加密密钥B
- 浏览器和服务器之间可以用密钥B作为对称加密的密钥通信
彻底搞定https的加密原理 (opens new window)
# 其他
Get和Post的区别 (opens new window)
- GET回退无害化 POST会再次提交
- Get产生URL地址收藏 Post不可以
- GET请求会被浏览器主动缓存
- GET请求需要URL编码
- Get请求长度有限制
- Get参数通过URL传递 Post放在Request Body中
- Get产生一个TCP数据包,POST产生两个TCP数据包
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
# Restful风格
每一个URI代表一中资源 http://kaikeba.com/coures
客户端和服务器之间,传递这种自愿的某种表现层
表现层状态转化 URL设计 动宾结构
- 动词
- GET 读取
- Post 新建
- PUT 更新
- DELETE 删除
- 宾语
- 名词
- GET /users --- 推荐
- GET /getUsers --- 不推荐
- 复数
- GET /users /users/1 ---推荐
- GET /user /user/1 ---不推荐
- 避免多级
- GET /authors/12?categories=2
- GET /authors/12/categories/2
- 名词
- 动词
状态码
- 1xx 相关信息
- 2xx 操作成功
- 3xx 重定向
- 4xx 客户端错误
- 5xx 服务器错误
# http/https互相
http可以加载https的请求,https不可以加载http的请求
https的页面页中为什么不能发起http请求,有人也行会觉得是同源策略的问题,同源策略的定义是这样的:1. 协议相同 2. 域名相同 3.端口相同,尽管https访问http确实不符合同源策略中的协议相同,但反过来http页面中可以使用https请求。为什么又可以了,其实这不是同源策略的问题,而是跟混合内容的问题。
TIP
什么是混合内容 当用户访问使用HTTPS的页面时,他们与web服务器之间的连接是使用SSL加密的,是安全的,从而保护连接不会受到攻击。如果HTTPS页面包括由普通明文HTTP连接加密的内容,那么连接只是被部分加密:非加密的内容可以被入侵,并且可以被中间人攻击者修改,因此连接不再受到保护。当一个网页出现这种情况时,它被称为混合内容页面。
混合内容又分为主动混合内容和被动混合内容。
被动混合内容是指不与页面其余部分进行交互的内容,包括图像、视频和音频内容 ,以及无法与页面其余部分进行交互的其他资源。 主动混合内容指的是能与页面交互的内容,包括浏览器可下载和执行的脚本、样式表、iframe、flash 资源及其他代码。
突破限制 但有时候就是想在https中发起http请求,碰到这情况会怎么办了?其实可以借助被动混合内容的加载方便来突破这一层限制,使用加载图片的方式来发起请求,如下所示:
const img = new Image();
img.src = 'http的请求地址'
HTTP协议经典面试题整理及答案详解 (opens new window)
TCP连接、Http连接与Socket连接的区别 (opens new window)