考虑下TCP建立连接时为什么是三次握手中客户端和服务器分别选择自己的sequence?
首先,这是为了区分相同四元组新旧连接上的报文。
其次,能够进行双向的连通性验证和源地址验证。
QUIC可以看做是TCP的改进版本,以上两个功能则是由connectionID完成的。
首先,新旧连接的connectionID不同。但是即使不用connectionID区分,新旧连接的秘钥不同也能区分开,但基于connectionID判断更快。
其次,connectionID的回应证明了连通性,也执行了源地址验证。
除此之外,QUIC可以看做是基于UDP隧道的可靠性传输,但是为了支持地址迁移(和隐私)UDP四元组会变化,必须依靠上层的标识区分连接和或者关联连接。虽然QUIC是要求更换源IP时,必须更换connectionID,但是仍然可以看做一整个connectionID组之间的关联性。
另外,也可以选择0的connectionID,这个意思是说不使用connectionID区分连接,只使用UDP区分连接,这也就没办法跨UDP迁移连接。
1、connectionID怎么支持连接迁移?
因为QUIC需要支持源地址迁移。
在无意的地址迁移时,迁移前后connectionID相同,可以使用connectionID辨别是属于同一连接;
在有意的地址迁移时,迁移前后connectionID不同,但是连接自己知道两者关系,所以仍然可以关联。
有意的地址迁移既然可以在前connectionID标识的报文中携带新的connectionID,来让连接知道两者关系,那能不能不使用connectionID,旧地址的报文中携带新地址或者新地址的报文中携带旧地址?不可以,因为可能会经历nat。那能不能变更地址后携带token?如果token是密文,那么接收端找不到对应的秘钥,如果是明文,那跟connectionID有多大区别?另外QUIC报文是会乱序的,迁移后收到的第一个报文就应该能够让对端关联起来。
2、是不是两端必须分别分配自己的connectionID?
使用自己分配的connectionID路由,不需要处理冲突的情况,比如服务器上很可能收到不同客户端的相同connectionID,这时候就很难标识一个客户端,因为源地址会变化,不能使用。
也能够保证新旧连接的connectionID不同。