• Http基础之http协议、无状态协议、状态码、http报文、跨域-cors


    HTTP基础

    HTTP协议

    HTTP- Hyper Text Transfer Protocl 超文本传输协议
    对我们的客户端和服务端值之间数据之间实现传输(文字、图片、音频、视频等等)

    客户端 => 服务端通信

    • 客户端:请求访问文本资源的一端
    • 服务端: 提供资源响应的一端

    HTTP协议规定:客户端发起请求、服务端回复响应
    先从客户端建立通信、服务端在没有接收通信之前不发送响应

    属于应用层 第一层HTTP

    请求方法

    • GET 一获取资源
    • POST - 传输实体主体
      • 虽然GET也可以传输实体主体,但是一般我们不用
    • PUT传输文件
    • HEAD -获取报文首部
      • HEAD 不返回报文主体部分
    • DELETE 一删除文件
    • OPTION -预检请求
    • TRACE 一 追踪路径

    持久连接

    HTTP请求在应用层,核心通道基于TCP连接
    页面有很多的图片,在发送请求访问HTML,也可能包含其他的资源、所以我们每一次请求都要建立一次TCP的链接和断开增加了通信量的开销

    过去的http连接:
    在这里插入图片描述
    建立TCP连接:三次握手
    断开TCP连接:四次挥手

    Http1.1中:Connection:Keep-Alive
    Connection:代表TCP信道的链接
    只要任意一端没有明确提出端口链接,则保持TCP连接状态
    (建立一次TCP链接,可以一次性的发送所有http请求)
    在这里插入图片描述
    好处:减少了TCP链接的重复建立以及我们断开链接的开销、减轻了服务器的负载、提高了运行速度
    HTTP 1.1 默认就是持久连接

    如何区分http用的是同一个TCP信道?
    connectionID(连接ID)相同的是同一个TCP信道
    connectionID:标识 标识单个请求新建立信道索引
    在这里插入图片描述

    管线化

    并行发送多个请求,不是一个一个等着响应
    在这里插入图片描述

    无状态协议

    http协议就是一种无状态协议,不保存状态
    不对请求和响应之间的通信状态进行保存
    目的:更快的处理大量事务、确保协议的可伸缩性

    使用Cookie状态管理

    引入cookie
    服务端 set-Cookie 通知客户端保存Cookie
    客户端下一次在进行发送的时候,会将之前设置的cookie进行携带
    性能: cookie 每次请求都会携带,性能受到影响
    跨域:cookie无法跨域调用,需要指定一个作用域

    状态码

    负责客户端HTTP请求的返回结果

    当客户端向服务器发送请求时候,描述返回的请求结果。能够知道服务端是正常除了请求,还是有错误

    1XX

    信息性状态码
    作用:接收的请求正在处理中

    2XX OK

    Success -成功状态码
    表示请求处理正常且成功

    200 OK

    表示从客户端发来的请求在服务端进行正常处理了

    204 NO Content

    表示服务器接收的请求已经成功处理,但是返回的响应报文中不包含实体的主体部分,而且不返回任务实体的主体
    场景:从客户端发送请求给服务端,对客户端不需要发送新信息内容的情况

    206 Content-Range

    表示客户端进行了范围请求
    Content-Range

    3XX 重定向

    表示浏览器需要执行某些特殊的处理以及正确处理请求

    301

    永久性重定向:请求该资源时候每次都返回一个新的url

    302

    临时性重定向:请求该资源时候每次都返回一个新的url,可能只限于本次
    代表资源不是被永久移动,只是临时的。

    304

    表示发送一些附带条件的请求。

    加上一些附带的条件
    if-Match, if-Modified-since ,if-Range

    虽然是3xx系列,但是和重定向没啥关系

    307

    临时重定向:期望客户端保持请求方法不变,向新的地址发出请求

    4XX

    客户端错误

    400

    表示请求报文中存在语法错误
    错误发生、需要修改请求的内容然后重新发送,浏览器会像200 对待

    401

    表示需要有通过HTTP认证的认证信息

    403

    表示对请求资源的访问被服务器拒绝了。而且没有必要给出拒绝的详细理由。如果想说明,则在主体返回

    404

    无法找到请求的资源

    5XX

    服务器本身发生了错误

    500

    表示服务器在执行请求的时候发生了错误

    503

    服务器超负载了处理停机维护状态

    HTTP报文

    • 报文首部 一客户端和服务器处理是的请求或者响应的内容以及属性
    • 报文主体 -应该被发送的数据

    请求报文

    客户端的HTTP报文
    请求行 - 方法、URL \HTTP版本
    首部字段:

    • 请求
    • 通用
    • 实体

    响应报文

    服务器的HTTP报文

    状态行一HTTP版本、状态码

    首部字段:

    • 响应首部字段
    • 通用首部字段
    • 实体首部字段

    HTTP首部字段类型

    • 通用首部字段-请求报文和响应报文 都会使用的首部
    • 请求首部字段 一 从客户端向服务器发送请求报文时使用的首部
    • 响应首部字段一从服务器向客户端返回响应报文使用的首部
    • 实体首部字段 —请求报文 和响应报文使用的首部

    通用首部字段

    Cache-Control

    能操作缓存的工作机制

    • public 表明其他用户可以利用缓存
    • private 只以特定的用户作为对象
      public private 相反
    • no-cache一防止从缓存中返回过期的资源,缓存服务器转发给源服务器
      在这里插入图片描述
    Connection

    作用:

    • 控制不在转发给代理的首部字段
      connection:不在转发的首部字段 Hop-by-hop
    • 管理持久连接
      • connection:close - 服务器明确的断开链接
      • connection: Keep-Alive- 持久连接
    Date

    表明创建http报文的日期和时间

    请求首部字段

    作用: 补充一些请求的附加信息、客户端信息、对响应内容相关的优先级等

    Accept

    能够处理的媒体类型以及媒体类型的优先级

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
    
    • 1
    • 文本文件
      • text/html - HTML格式 text/plain-纯文本格式,text/css -css格式
      • 组合application/xhtml+xml,application/xml,application/json ,application/pdf
    • 图片文件
      • image/jpeg - jpeg 格式,image/webp,image/apng image/png,image/gif
    • 视频
      • video/mpeg,video/quicktime
    • 应用程序中使用的二进制文件
      • application/octet-stream, application/zip,application/x-www-form-urlencoded

    q=0.9 权重
    范围0~1可以精确到小数点后3位
    1为最大值、默认为1.0

    accept—期望,提供给服务端的一些参考意见

    Accept-Charset

    期望支持的字符集优先级

    Accept-Charset

    期望支持的字符集 优先级
    http
    Accept-Charset: charset = utf-8

    Accept-Encoding

    期望支持的内容编码,被压缩的
    包装
    好处:减少网络流程,提升我们的性能

    • gzip
    • compress
    • deflate
      -br
    • identity - 不执行压缩或者不会发生变化的默认编码格式

    注:
    我们在要求服务器按照某种方式返回,但是这不是强制。如果说服务器不支持或者不开启,那么不起作用
    如果服务器支持压缩,或者开启,响应报文的Content-Encoding 告知

    Accept-Language

    期望能够处理的语言集
    zh-CN,zh;q=0.9,en;q=0.8

    Host

    Host:
    www.baidu.com
    请求资源所处的互联网主机名和端口号
    唯一一个必须要包含在请求内的首部字段
    相同的IP地址下部署了多个域名,那么服务器就无法知道哪一个域名对应的请求。

    If-Match

    像If-xxx 条件请求。服务器接收到附带的条件的请求后,只有判断指定条件为真,才会执行请求
    If-Match: “12345”
    两端资源进行比较,只有判断条件为真才会接收请求

    If-Modified-Since

    如果服务器If-Modified-Since 早于资源的更新时间,希望能处理请求
    不满足条件的话,服务器返回304代码

    If-None-Match

    实体标记(ETag) 值和请求资源的ETag的值不一致的时候,告诉服务器处理请求

    Referer

    告诉服务器,请求的原始资源的地址

    User-Agent

    客户端的信息传给服务器了
    内容包含:操作系统/版本 、浏览器/版本、设备信息(移动端)/版本

    响应首部字段

    用于补充响应的附加信息、服务器信息、对客户端的附加要求

    Accept-Ranges

    告诉客户端,我服务器是否可以接受范围请求,是bytes,否none

    Age

    资源在代理缓存中存在的时间

    Location

    客户端重定向的URL

    Server

    服务器的名字:Apache Nginx BWS gws

    实体首部字段
    Allow

    资源的正确请求方式:GET HEAD POST
    服务器接收到了不支持的HTTP方法,会以状态码405

    Content-Encoding
    • gzip
    • compress
    • deflate
    • br
    Content-Language

    告诉客户端,用的哪一种语言

    Content-Type

    说明了实体主题内对象的媒体类型
    text/html charset=utf-8

    Expires

    资源失效的日期

    缓存服务器 如果接收到了这个字段,会以缓存来应答,如果在这个时间之前,响应的副本会一直保存
    如果超过了这个时间,会转发给服务器

    如果源服务器不希望缓存服务器对资源进行缓存,那么这个时间设置为Date相同的时间即可。

    Last-Modified

    指明资源在最后修改的时间

    跨域-cors

    Cors => 跨域资源共享
    同源策略:端口、域名、协议

    跨域构成条件:

    • 端口不同
    • 协议不同
    • 域名不同
      三个只要一个不同,就是不同源。只要不同源,就是跨域

    两种请求

    简单请求

    两个条件:

    1. 请求方法是:HEAD,GET,POST
    2. header中只能包含以下请求字段:
    3. Accept
    4. Accept-Language
    5. Content-Language
    6. Content-Type
    7. text/plain
    8. multipart/form-data
    9. application/x-www-form-urlencoded
    浏览器不同的处理方式

    简单请求跨域,浏览器会让请求发出

    GET /cors HTTP/1.1
    Origin: http://www.baidu.com
    Host: api.alice.com
    Accept-Language: en-US
    Connection: keep-alive
    User-Agent: Mozilla/5.0 ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    响应头会加Access-Control-Allow-Origin,表示对该来源的请求是允许的

    Access-Control-Allow-Origin: http://www.baidu.com
    Access-Control-Allow-Credentials: true
    Access-Control-Expose-Headers: FooBar
    Content-Type:text/html; charset=utf-8
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. Access-Control-Allow-Origin是必须的
      要么是请求时,Origin的值。
      那么就是 * => 表示接受任意域名的请求但是存在安全隐患
      如果没有这个头部信息,说明了服务器没有开启资源共享,浏览器会认为这次请求失败
    2. Access-Control-Allow-Credentials是可选的
      表示允许发送Cookie
      true: 表示服务器明确许可,可以在请求中一起发送
      如果不要浏览器发送cookie那么删掉
    非简单请求

    只要不是简单请求,那就是非简单请求

    先发送OPTIONS 预检请求
    OPTIONS请求按照简单请求的方式处理
    目的: 保护客户端的安全,防止不受信任的网站利用用户的浏览器向其他网站发送恶意请求

    • Access-Control-Request-Method:告诉服务器实际发送的HTTP请求方法
    • Access-Control-Request-Header:告诉服务器实际请求所携带的自定义的头部信息
    OPTIONS /resources/post-here/ HTTP/1.1
    Host: bar.other
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding:gzip,deflate
    Accept-Charset:IS0-8859-1,utf-8;q=0.7,*;q=0.7
    Connection: keep-alive
    Origin: http://www.baidu.com
    Access-Control-Request-Method: POST
    Access-Control-Request-Headers:X-PINGOTHER,Content-Type
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    服务器根据这些信息决定,该请求是否被允许
    响应的

    Access-Control-Allow-Methods:POST
    Access-Control-Allow-Headers:X-PINGOTHER,Content-Type
    
    • 1
    • 2

    什么时候触发OPTIONS请求?

    1. 跨域的时候,Access-Control-Request-Headers: X-PINGOTHER,Content-Type
    2. 发送跨域的时候,使用PUT、DELETET、CONNECT、OPTIONS、TRACE、PATCH
  • 相关阅读:
    synchronized常见锁策略
    react悬浮球效果展示
    基于遗传算法的微电网调度(风、光、蓄电池、微型燃气轮机)(Matlab代码实现)
    吉利银河L6顶配续航测试 记录 方便后续对比
    SSL、TLS拒绝服务攻击
    Softmax 回归 + 损失函数 + 图片分类数据集
    [激光原理与应用-37]:《光电检测技术-4》- 光学测量基础 - 噪声与光学中的常见电路
    c++中dns解析
    【分布式任务调度】(二)XXL-JOB执行器配置及定时任务的创建
    python知识点总结(1)
  • 原文地址:https://blog.csdn.net/qq_34306228/article/details/136324952