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
}