QUIC的connection_id是怎么生成的。

看见网上说“这个 ID 是客户端随机产生的64位”。具体是根据什么生成的呢。如何保证在切换了IP和端口后connection_id还是一样的。

要想理解 quic 的 connection id,首先要理解什么是 connection(连接),在 linux 内核用于区分 connection 并给 connection 标记状态的模块是 conntrack,它是根据五元组(协议,源 IP,源端口,目的 IP,目的端口)来区分连接的,但是因为由 NAT 的存在,这种方式的弊端就很明显了,NAT 之后五元组的信息就变了,这就不能全链路的区分一个连接。QUIC 为了解决这个问题就在报文头加了 connection id,connection id 又分为两部分:source connection id 和 destination connection id。

现在来回答你的问题:
1、这个 ID 是客户端随机产生的64位
这个不完全准确,只是在握手阶段客户端的 destination connection id 是随机生成的。
2、如何保证在切换了IP和端口后connection_id还是一样的
QUIC 没有要求 connection_id 一样,事实上 client 发生迁移后 connection_id 一定会变化。迁移后保持不变的是 stream id,QUIC 是根据 stream id 来区分应用了。