• HTTP与QUIC协议


    HTTP请求与响应的过程

    首先在浏览器输入www.163.com(url 统一资源定位符) 通过DNS解析获得IP地址,然后封装一个http请求

    Http请求的构建

    请求行 方法 URL 版本
    首部 key value key value
    实体

    http请求包含三部分:请求行、首部、实体

    请求行:

    1. 版本为http版本,如1.0, 1.1, 2.0
    2. URL:即www.163.com
    3. 方法:如get post put delete

    首部:保存重要的字段

    例如:

    • accept-charset 客户端可以接受的字符集
    • content-type 正文的格式
    • cache-control 控制缓存

    HTTP请求的发送

    HTTP是基于TCP,所以使用面向连接的方式发送请求,通过stream二进制的方式传给对方,到了TCP层,二进制流转成报文段发送给服务器。

    HTTP返回的构建

    状态行 版本 状态码 短语
    首部 key value key value
    实体

    状态行

    1. 状态码:如200 404
    2. 短语:大概的原因

    首部:功能同上

    • retry-after 稍后尝试
    • content-type 返回类型:HTML,JSON

    HTTP进化历程

    HTTP1.0 HTTP1.1 HTTP2.0
    问题 客户端队首阻塞 服务端队首阻塞
    对于同一个TCP连接,所有请求放到一个队列中,只有前一个请求的响应到了才能发送第二个请求 对于同一个TCP连接可以一次发送多个请求,解决了HTTP1.0的阻塞问题。但是规定服务器要按照接受顺序发送响应,先接受的请求的响应要先发送,那么此时就会出现一个问题,如果前一个响应的处理时间过长生成响应过慢,那么便会阻塞已生成响应的发送 无论是客户端还是服务端都不需要排队,同一个TCP有多个stream有各个stream发送和接收HTTP请求,相互独立,互不阻塞

    HTTP2.0的提升性能的优化思路

    1. 头压缩:使用索引表的方式,将每次搜药携带的大量key-value在两端建立索引表,对相同的头只发送索引表中的索引
    2. 分帧
    3. 二进制编码
    4. 多路复用技术

    基于UDP的QUIC协议

    (我猜quic是quick快速的缩写)

    Google的QUIC协议

    • 自定义连接机制:源IP,源端口,目的IP,目的端口一个元素发生改变时TCP便会断开连接,重新连接。WiFi或移动网络切换时会导致重连,导致时延。基于UDP的连接不以四元组标识,而是以一个64位的随机数作为ID。
    • 自定义重传机制:修复TCP中的采样往返时间RTT不准确的问题
    • 无阻塞的多路复用:同HTTP2.0一样,同一条连接可以建立多个stream来发送HTTP请求。由于QUIC是基于UDP的,一个连接上的stream没有依赖,这样假如stream2丢包,需要重传,后面的stream3无需等待就可以发送诶用户。
    • 自定义流量控制:TCP流量控制是基于滑动窗口协议,起点是下一个要接受并且ACK的包,及时后面的包到了放在缓存里窗口也不能右移。

    在这里插入图片描述
    而QUIC是基于offset,包来之后进入缓存便可应答,且不但在一个连接上控制窗口,还在一个连接的每一个stream控制窗口

  • 相关阅读:
    scala入门-03基础知识->表达式
    scala入门-02基础知识->方法
    jetty命令行方式启动jetty-runner.jar 容器
    本地开发spark代码上传spark集群服务并运行(基于spark官网文档)
    Linux下查看进程和线程
    scala入门-01-IDEA安装scala插件
    spark-1.2.0 集群环境搭建
    ubuntu每次登陆都用root账号登陆
    hadoop2.6.0版本集群环境搭建
    spark ssh配置
  • 原文地址:https://www.cnblogs.com/zhangnianlei/p/12239242.html
Copyright © 2020-2023  润新知