问题1:quic握手过程是怎样的? 怎样节约握手时间?握手时间多少个RTT?握手过程成涉及到哪些概念以及变量(代码)

0~1 RTT握手过程
   QUIC握手的过程是需要一次数据交互,0-RTT时延即可完成握手过程中的密钥协商,比TLS相比效率提高了3-5倍,且具有更高的安全性。
   QUIC在握手过程中使用Diffie-Hellman算法协商初始密钥,初始密钥依赖于服务器存储的一组配置参数,该参数会周期性的更新。
   初始密钥协商成功后,服务器会提供一个临时随机数,双方根据这个数再生成会话密钥。
   具体握手过程如下:
   (1) 客户端判断本地是否已有服务器的全部配置参数,如果有则直接跳转到(5),否则继续
   (2) 客户端向服务器发送inchoate client hello(CHLO)消息,请求服务器传输配置参数
   (3) 服务器收到CHLO,回复rejection(REJ)消息,其中包含服务器的部分配置参数
   (4) 客户端收到REJ,提取并存储服务器配置参数,跳回到(1)
   (5) 客户端向服务器发送full client hello消息,开始正式握手,消息中包括客户端选择的公开数。此时客户
       端根据获取的服务器配置参数和自己选择的公开数,可以计算出初始密钥。
   (6) 服务器收到full client hello,如果不同意连接就回复REJ,同(3);如果同意连接,根据客户端的公开数
       计算出初始密钥,回复server hello(SHLO)消息,SHLO用初始密钥加密,并且其中包含服务器选择的一个临时公开数。
   (7) 客户端收到服务器的回复,如果是REJ则情况同(4);如果是SHLO,则尝试用初始密钥解密,提取出临时公开数
   (8) 客户端和服务器根据临时公开数和初始密钥,各自基于SHA-256算法推导出会话密钥
   (9) 双方更换为使用会话密钥通信,初始密钥此时已无用,QUIC握手过程完毕。之后会话密钥更新的流程与以上过程类似,
       只是数据包中的某些字段略有不同。

  • QUIC has the following default flow control values (fromChromium’s ​quic_protocol.h ):

// Minimum size of initial flow control window, for both stream and session.
const uint32 kMinimumFlowControlSendWindow = 16 * 1024;  // 16 KB

// Maximum flow control receive window limits for connection and stream.
const ​ ​QuicByteCount ​ ​kStreamReceiveWindowLimit ​ = ​16 ​ * ​1024 ​ * ​1024 ​; ​// 16MB
const ​ ​QuicByteCount ​ ​kSessionReceiveWindowLimit ​ = ​24 ​ * ​1024 ​ * ​1024 ​; ​// 24MB

  • 16 KB minimum value is necessary to allow 0-RTT requests with bodies. Current implementations will advertise much larger windows during the handshake, via the kSFCW (Stream Flow Control Window) and kCFCW (Connection Flow Control Window) tags in the CHLO and SHLO.

最新文章

  1. haha3
  2. Androidstudio安装AVD出现no system images installed for this target解决方案
  3. php中opendir函数用法实例
  4. Zju1015 Fishing Net
  5. MongoDB 客户端 MongoVue
  6. 《Java程序设计》第2周学习总结
  7. 基于Maven管理的Mapreduce程序下载依赖包到LIB目录
  8. [LeetCode] Two Sum水过
  9. 线程池原理及创建并C++实现
  10. Android 网络通信框架Volley简介(Google IO 2013)
  11. jQuery选择器全解
  12. AT&T汇编语言学习:利用c库、文件读写
  13. instruments symbol name 不显示函数名!
  14. Linqpad工具
  15. postgreSql 常用查询总结
  16. 《鸟哥的Linux私房菜》学习笔记0——计算机概论
  17. php 数值数组
  18. Symfony 框架实战教程——第一天:创建项目(转)
  19. 搭建wordpress
  20. 原!linux脚本统计

热门文章

  1. Linux_centOS_5.7_64下如何安装jdk1.8&mysql
  2. nginx优化:使用expires在浏览器端缓存静态文件
  3. java List<T>和List<Object>的区别
  4. Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储
  5. django—Form组件校验方法(is_valid)执行流程
  6. Phoenix的一些问题
  7. redis SETBIT命令原理
  8. Pytorch加载并可视化FashionMNIST指定层(Udacity)
  9. 赛门铁克和DigiCert证书有什么区别?
  10. react-native 签名