• http 简述


    http 简述

    一、历史

    1991年:

    http/0.9  只支持get
    

    1996年:

    http/1.0  get、post、head、header头信息、状态码、缓存等等
    

    1997年:

    http/1.1  进一步完善 http 协议,put、patch、options、delete等
    

    2015年:

    http/2    解决 http/1.1 效率不高问题,新增特性
    

    二、常见状态码

    信息状态码:请求正在处理

    1XX
    

    成功状态码:请求处理完成

    200 成功
    

    重定向状态码:需要进行附加操作

    301 永久重定向
    302 暂时重定向
    304 本地缓存
    

    客户端错误状态码:服务器无法处理请求

    403 禁止访问,没有权限
    404 服务器没有请求的资源
    

    服务端错误状态码:服务器处理请求出错

    500 服务器内部错误
    503 服务器可能处于超负荷状态或者停机维护
    

    三、常见头部

    client:

    Accept: 可接受的文件类型
    Accept-Charset:可接受的字符集
    Accept-Encoding:可接受/支持的压缩方法
    Accept-language:可接受的语言类型,如中文、英文等
    Accept-Range: 是否可以接受获取某个实体(文件)的一部分的请求
    Age:从服务器请求的文件,从请求得到的那一刻到现在经过的时间
    Authorization:身份验证信息
    Connection:是否保持长连接
    Content-Length:发送的文件长度
    Content-Type:发送的文件类型
    Cookie:保存用户敏感信息
    If-Modified-Since: 与 Last-Modified 对应,决定是否使用缓存
    If-Match: 于 ETag 对应,若相等则使用缓存
    Host:请求主机。包含协议和端口
    Origin:原始请求地址
    Referer:请求页面的上一个来源
    User-Agent: 浏览器信息
    等等
    

    server

    Connection:是否保持长连接
    Content-Length:返回的文件长度
    Content-Type:返回的文件类型
    Cache-control: 控制缓存 优先级高于 Expires
    Expires: 控制缓存
    Date: 服务器当前日期
    ETag: 与 If-Match 对应,优先高于 Last-Modified
    Last-Modified: 最后修改时间
    Transfer-Encoding: 是否支持
    Set-Cookie:服务端设置cookie时存在
    Host:请求主机。包含协议和端口
    Origin:原始请求地址
    Referer:请求页面的上一个来源
    User-Agent: 浏览器信息
    

    四、优缺点与优化

    http/0.9

    只有 get 方法
    客户端只能向服务端请求网页
    服务端只能回应 html 格式的字符串
    

    http/1.0

    问题:
    每个 tcp 连接只能发送一个请求,发送完毕就关闭连接
    tcp 连接成本高,需要三次握手
    而且一开始的发送速度较慢,即慢启动
    所以性能较差
    
    解决:
    非标准字段 Connection
    Connection: keep-alive
    客户端发送该字段,要求服务不要关闭 tcp 连接,以便其他请求复用
    服务器同样回应该字段
    
    直到客户端或者服务器主动关闭连接
    

    http/1.1

    标准化了持久连接, tcp 连接默认不关闭,可以被多次请求复用
    客户端和服务器发现对方一段时间没有活动,会主动关闭连接
    
    规范的做法是客户端在最后一个请求时,发送
    Connection: close ,明确关闭 tcp 连接
    
    对于同一个域名,大多浏览器允许同时建立 6 个持久连接
    
    同个 tcp 连接中,可以发送多个请求,但是服务端处理请求依旧是按照顺序处理
    若前一个请求处理很耗时,会导致后面的请求排队等着,称之为“对头堵塞”
    
    解决:
    减少请求数、多开持久连接
    优化技巧:合并脚本、样式表、域名分片等等
    

    http/2

    相比 http/1.1 增加特性:

    1、二进制协议

    http/1.1 头信息是文本,数据体可以是文本或者二进制
    http/2是一个彻底的二进制协议,头信息和数据体统称为帧: 头信息帧和数据帧
    二进制可以定义额外的帧。
    文本实现这种功能,解析数据会比较麻烦,二进制方便的多
    

    2、多工

    http/2 复用 tcp 连接时候,同个连接当中,客户端和服务端可以同时发送多个请求或回应,
    与http/1.1不同的是,不用按照顺序一一对应,避免对头堵塞;
    数据分块处理,完成多少就返回多少;同时可以处理多个请求的数据
    
    双向实时通讯,即为多工
    

    3、数据流

    http/2 不按顺序发送,同一个链接里面连续的数据包,可能属于不同的回应
    所以需要对数据包做标记,指出是属于哪个回应
    
    每个请求或回应的数据包,称为一个 数据流
    数据流有 数据流ID,用来区分属于哪个数据流
    规定客户端发送的数据流ID 为奇数,服务端为偶数
    
    数据流发到一半的时候,客户端和服务端可以发送信息,取消该数据流
    客户端还可以指定数据流的优先级,服务端根据优先级处理数据
    

    4、头信息压缩

    客户端与服务端维护一张头信息表,所有字段存入这个表,生成索引,后续只发送索引即可
    

    5、服务器推送

    服务端可以主动推动信息到客户端
    
  • 相关阅读:
    Mixtile LOFT
    关于Linux系统清理/tmp/文件夹的原理
    在大型项目上,Python 是个烂语言吗
    Nginx 进程间通信
    蕤仁肉(内仁肉、泪仁肉)简单介绍
    TMS320F28335项目开发记录5_28335之CCS编程基础
    RBAC权限管理
    国内三大PT(Private Tracker)站分析
    Nginx特点
    java设计模式演示样例
  • 原文地址:https://www.cnblogs.com/linjunfu/p/12686016.html
Copyright © 2020-2023  润新知