Go发起HTTP2.0请求流程分析(前篇)(2)
2023-04-30 来源:飞速影视
笔者对上述的源码描述如下:
调用t.dial(ctx, "tcp", cm.addr())创建TCP连接。如果是https的请求, 则对请求建立安全的tls传输通道。检查tls的握手状态,如果和server协商的NegotiatedProtocol协议不为空,且client的t.TLSNextProto有该协议,则返回alt不为空的持久连接(HTTP1.1不会进入if条件里)。笔者对上述的第三点进行展开。经笔者在本地debug验证,当client和server都支持http2时,s.NegotiatedProtocol的值为h2且s.NegotiatedProtocolIsMutual的值为true。
在上面分析http2configureTransport函数时,我们知道TLSNextProto注册了一个key为h2的函数,所以调用next实际就是调用前面的upgradeFn函数。
upgradeFn会调用connPool.addConnIfNeeded向http2的连接池添加一个tls传输通道,并最终返回前面已经创建好的t2即http2Transport。
分析上述的源码我们能够得到两点结论:
执行完upgradeFn之后,(*Transport).dialConn返回的持久化连接中alt字段已经不是nil了。t.NewClientConn(tc)新建出来的连接会保存在http2的连接池即http2clientConnPool中,下一小结将对NewClientConn展开分析。最后我们回到(*Transport).roundTrip方法并分析其中的关键源码:
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号