Go 是什么让http.server使用http/2?

Go 是什么让http.server使用http/2?,go,tls1.2,http2,goroutine,Go,Tls1.2,Http2,Goroutine,我制作了两个Go程序,每个程序都试图通过TLS向对方发送请求。换句话说,两个程序同时充当客户端和服务器。但是,第一个客户端主机尝试使用HTTP/1.1连接到服务器主机,而服务器主机使用HTTP/2侦听,这会导致错误 程序A client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: tlsConfig, }, } mux := httprouter.New() mux.G

我制作了两个Go程序,每个程序都试图通过TLS向对方发送请求。换句话说,两个程序同时充当客户端和服务器。但是,第一个客户端主机尝试使用HTTP/1.1连接到服务器主机,而服务器主机使用HTTP/2侦听,这会导致错误

程序A

client := &http.Client{
    Transport: &http.Transport{
        TLSClientConfig: tlsConfig,
    },
}
mux := httprouter.New()
mux.GET("/test", test)
serverTLS := &http.Server{
    Addr:      "127.0.0.1:8081",
    Handler:   mux,
    TLSConfig: tlsConfig,
}

go func() {
    serverTLS.ListenAndServeTLS("", "")
}()

fmt.Println("test")
r, err := client.Get("https://127.0.0.1:8080/test")
if err != nil {
    log.Fatalln("Failed to connect testService over TLS : ", err)
}
defer r.Body.Close()
b, _ := ioutil.ReadAll(r.Body)
fmt.Println(string(b))

time.Sleep(time.Second * 15)
程序B

client := &http.Client{
    Transport: &http.Transport{
        TLSClientConfig: tlsConfig,
    },
}

mux := httprouter.New()
mux.GET("/test", test)
serverTLS := &http.Server{
    Addr:      "127.0.0.1:8080",
    Handler:   mux,
    TLSConfig: tlsConfig,
}

go func() {
    serverTLS.ListenAndServeTLS("", "")
}()

time.Sleep(time.Second * 10)

r, err := client.Get("https://127.0.0.1:8081/test")
if err != nil {
    log.Fatalln("Failed to connect testService over TLS : ", err)
}
defer r.Body.Close()
b, _ := ioutil.ReadAll(r.Body)
fmt.Println(string(b))
来自程序B(服务器)的错误消息

然后,为了说明bug,我将两个程序的任务限制在客户端或服务器上,从而缩短了它们的时间

程序A'(服务器)

程序B'(客户端)

这一次,他们工作没有错误。两台主机之间的通信是通过HTTP/1.1完成的。 有人能解释一下是什么改变了局面吗?是什么迫使程序B使用HTTP/2的?

根据:

从Go 1.6开始,http包在使用HTTPS时对http/2协议有透明的支持。必须禁用HTTP/2的程序可以通过将Transport.TLSNextProto(对于客户端)或Server.TLSNextProto(对于服务器)设置为非零的空映射来实现。或者,当前支持以下GODEBUG环境变量:


tlsConfig
这里没有列出的可能是问题的一部分。客户机可能会通过ALPN宣布它想要说HTTP/2,但实际上它不想说。除此之外,该代码似乎没有任何问题。
http2: server: error reading preface from client 127.0.0.1:34854: bogus greeting "GET /test HTTP/1.1\r\nHost"
//setup server
mux := httprouter.New()
mux.GET("/test", test)
serverTLS := &http.Server{
    Addr:      "127.0.0.1:8080",
    Handler:   mux,
    TLSConfig: tlsConfig,
}

go func() {
    serverTLS.ListenAndServeTLS("", "")
}()

time.Sleep(time.Second * 10)
//setup client
client := &http.Client{
    Transport: &http.Transport{
        TLSClientConfig: tlsConfig,
    },
}

fmt.Println("test")
r, err := client.Get("https://127.0.0.1:8080/test")
if err != nil {
    log.Fatalln("Failed to connect testService over TLS : ", err)
}
defer r.Body.Close()
b, _ := ioutil.ReadAll(r.Body)
fmt.Println(string(b))