Go 1.12 TLS 1.3 简单测试

栏目: Go · 发布时间: 5年前

内容简介:在但是从如果要开启 TLS 1.3, 需要设置环境变量:

《TLS 1.3 当前(2018.10)支持与部署之现状》 中,我们提到 Go 将在 1.12 中支持 TLS 1.3. 作为一个 Gopher, 终于在前几天盼来了 golang 1.12 的发布。

但是从 release 日志 看,本次对选择性的部分支持 TLS 1.3, 且默认处于关闭状态:

 Go 1.12 adds opt-in support for TLS 1.3 in the crypto/tls package as specified by RFC 8446. It can be enabled by adding the value tls13=1 to the GODEBUG environment variable. It will be enabled by default in Go 1.13.

如果要开启 TLS 1.3, 需要设置环境变量: GODEBUG=tls13=1 .

本次发布的 TLS 1.3 的 cipher suite 无法配置,也不支持 0-RTT 模式:

 TLS 1.3 cipher suites are not configurable. All supported cipher suites are safe, and if PreferServerCipherSuites is set in Config the preference order is based on the available hardware.
Early data (also called “0-RTT mode”) is not currently supported as a client or server.

要知道,没有 0-RTT 的 TLS 1.3 是没有灵魂的,对本次版本的失望那是肯定的。但是依然在第一时间升级了 Go 版本,简单测试了一下国内网络环境下 TLS 1.3 与 1.2 的握手延迟。如果对 TLS 1.3 握手延迟还不太熟悉,可以参见拙文 《TLS1.3/QUIC 是怎样做到 0-RTT 的》 以及 TLS 1.3 Handshake Protocol .

测试代码

package main
 
import (
"crypto/tls"
"flag"
"log"
"time"
)
 
const (
MaxInt = int(^uint(0) >> 1)
MinInt = -MaxInt - 1
)
 
func main() {
var testCnt int
flag.IntVar(&testCnt, "c", 10, "test count")
flag.Parse()
 
testAddr := "blog.cloudflare.com:443"
 
// tls 1.2
config := &tls.Config{
SessionTicketsDisabled: true,
MaxVersion:             tls.VersionTLS12,
}
min12, max12, avg12 := testTLS(testCnt, testAddr, config)
log.Printf("tls 1.2 dial, min:%dms, max:%dms, avg:%dms", min12/1e6, max12/1e6, avg12/1e6)
 
// tls 1.3
config.MaxVersion = tls.VersionTLS13
min13, max13, avg13 := testTLS(testCnt, testAddr, config)
log.Printf("tls 1.3 dial, min:%dms, max:%dms, avg:%dms", min13/1e6, max13/1e6, avg13/1e6)
 
log.Printf("tls 1.3 vs 1.2: min:%.02f, max:%.02f, avg:%.02f", float32(min13)/float32(min12), float32(max13)/float32(max12), float32(avg13)/float32(avg12))
 
}
 
func testTLS(testCnt int, addr string, config *tls.Config) (min, max, avg int) {
min = MaxInt
max = MinInt
total := 0
for i := 0; i < testCnt; i++ {
        hsStartTime := time.Now()
        conn, err := tls.Dial("tcp", addr, config)
        if err != nil {
            log.Fatalf("make tls connection failed:%v", err)
        }
        dialCost := int(time.Since(hsStartTime).Nanoseconds())
        if dialCost > max {
max = dialCost
}
if dialCost < min {
            min = dialCost
        }
        total += dialCost
        state := conn.ConnectionState()
        log.Printf("tls version:%#v", state.Version)
        conn.Close()
    }
    avg = total / testCnt
    return
}
 
 

需要说明的是,这个测试是不严谨,里面没有考虑 cipher suite 以及 early data 的差异。测试结果定性意义大于定量意义。

测试结果

测试使用的目标服务器地址是 blog.cloudflare.com:443 , 我的网络环境下,ping 延迟为 226 ms (1-RTT).

root@host:~/tmp# GODEBUG=tls13=1 go run tlst.go -c 20
2019/03/03 00:06:44 tls version:0x303
...
2019/03/03 00:07:02 tls 1.2 dial, min:497ms, max:2977ms, avg:952ms
2019/03/03 00:07:02 tls version:0x304
...
2019/03/03 00:07:17 tls 1.3 dial, min:320ms, max:2176ms, avg:755ms
2019/03/03 00:07:17 tls 1.3 vs 1.2: min:0.64, max:0.73, avg:0.79
 
const (
    VersionSSL30 = 0x0300
    VersionTLS10 = 0x0301
    VersionTLS11 = 0x0302
    VersionTLS12 = 0x0303
    VersionTLS13 = 0x0304
)
 

从结果看,有如下结论:

  1. TLS 1.3 平均比 TLS 1.2 建立连接的延迟低约 1-RTT, 跟理论分析是吻合的。但是,
  2. 从 max 项可以看出,部分时候国内到目标服务器网络不稳定带来的波动比 TLS 本身协议优化的 RTT 大的多。因此,稳定高延迟的网络链路有时候比低延迟高抖动的网络更有实际意义。
  3. TLS 建立在 TCP 基础上,TCP 的握手延迟在 TLS 层面是优化不掉的,或者说不是 TLS 的管辖范围,因此,在允许的情况下,尽量复用连接。

–EOF–


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

More Effective C++(中文版)

More Effective C++(中文版)

梅耶(Scott Meyers) / 侯捷 / 电子工业出版社 / 2011-1-1 / 59.00元

《More Effective C++:35个改善编程与设计的有效方法(中文版)》是梅耶尔大师Effective三部曲之一。继Effective C++之后,Scott Meyers于1996推出这本《More Effective C++(35个改善编程与设计的有效方法)》“续集”。条款变得比较少,页数倒是多了一些,原因是这次选材比“一集”更高阶,尤其是第5章。Meyers将此章命名为技术(tec......一起来看看 《More Effective C++(中文版)》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具