可以看到有两个 quic的payload,通常第二个数据包只是填充(Padding),将这个数据包填充到1399的长度
接着打开第一个quic的payload,可以看到这是一个长头包,定义了quic的版本是draft-29。
接着就是连接目的端口长度和连接目的ID,连接源端口和连接源ID,这个是客户端最初将如何识别这个唯一的QUIC连接,在某种意义上,这几乎就像使用TCP的端口号一样
在这个package中,我们同样可以看到TLS1.3的client,在TCP中,我们首先是建立三次握手,其次才会发送TLS 1.3的client hello报文,但是在quic中,我们能够立即使用第一个数据包发送它
quic_transport_parameters和tcp中的syn报文类似,我们如何向服务器提供选项,然后服务器回复它的选项
initial_max_stream_data_uni和initial_max_stream_data_bidi_local表示单向还是双向流,我们可以在quic对话中支持多大16个流(通过initial_max_stream_uni和initial_max_streams_bidi确定)。
和客户端发给服务器类似的部分就不多介绍,可见服务器回复给客户端的有ACK帧,并且largest acknowledged: 0,表示客户端发送的第一个包的pkn: 0已经确认收到
首先端侧不知道服务器侧是否支持quic协议,还是按照正常的TCP三次握手,TLS握手,在服务器回复响应头的header中,如下图的302 FOUND,在alt-svc中,会告诉客户端,我支持quic协议,这样下次通信过程中,端侧才会开始发送quic报文
类似TCP讲解:
详细讲解:
关注点:当前所有支持TLS 1.3的端侧,在client hello中,Version版本都是TLS 1.2,而在扩展字段中supported_versions中标明了明确的版本,这么做的原因是:这个是为了通过尚未支持TLS 1.3的防火墙设备和中间设备。
在wireshark中的4,5包中,Handshake都是发送 Certificate包(被fragment了),然后在6包中进行证书校验,服务器结束handshake。接着客户端在8包中结束handshake。
1.每个quic连接有一个独一无二的ID,在发送initial包的时候,除非之前有过连接记录,否则发送一个连接ID给服务器,其为由八个字节构成的不可预测的值。
2.quic流:下图是一个UDP对应的一个QUIC连接,quic连接下面有四个stream
正在上传…重新上传取消
传统意义上的packet如下图所示:frames代表的是以太网帧和有效荷载,所以这将是从以太网帧的边缘一直到帧检查序列末尾
in QUIC:QUIC包被封装在UDP报文里面,然后帧被定义封装在quic包里面,所以帧在quic连接中具有不同的功能。举例:包含加密的crypto帧,ACK帧等。现在quic还允许将多个数据包封装在一个UDP数据包中,这可以充分利用可用空间,并提高效率
客户端发送的initial包是一个long header,这样做的原因是因为它将完全识别目标ID和源连接ID。客户端发送一个八字节的Destination Connection ID,任何被动监听器都无法根据此信息确定应用程序(FTP,TCP,SSH...)
连接建立好,数据开始传输的包是number 9,可以看到这次是一个short header,仅仅包括了一个Destination CID。所以现在即使IP和端口发生了变化,quic连接可能仍然存在于这两个端点之间。
从package Number 7可以看到,流ID是3(流ID为奇数是,代表的是服务器发送的数据),并且是一个uni=1,代表是一个单向流,然后服务器可以将内容放入 该流中,在这个数据包中,很明显只有一条流,
从Package Number9中可以看到,quic连接上有三条流,并且都是单向流,流ID分别是2,6,10(因为是客户端发送的,所以流ID都是偶数),如果流数据丢失了,那么一方或者另一方可以主动传输丢失的数据流,因此只要丢了一个QUIC数据包,不需要重传所有流,只需要重传数据包丢失的所在流。
1.客户端和服务器支持版本不一致,这样就会退化为tcp
2.如果客户端支持服务器版本中的任何一个,连接将继续,这个时候quic可能遇到另外一个问题,网络路径上的基础设备和安全监测系统,如下图所示,中间的任何一个设备,都可能会存在问题,因为之前主要公关的就是适配TCP,使用UDP可能存在意想不到的问题。
1.在线工具(https://http3check.net)
可以监测服务器是否支持quic,以及支持的版本信息等
2.进入开发者模式,更多工具->开发者模式
3.通过命令行工具,curl -http3 host
从图中可以看到,单方向上传输的包都是递增的,快速确认丢包场景可以从包的递增来查看,更方便的是,我们可以通过file->Export Package Dissections->as CSV,然后在excel表中通过差值来判断。