问题:为什么p2p模式的tunnel底层常用udp而不是tcp?
TCP in TCP不是不好,而是根本不可用,这源自于TCP协议本身的设计:TCP的可靠性是基于丢包检测和重传的,他依赖于TCP的下层链路是不可靠的这一事实,如果说TCP的下层链路是可靠的话,那么TCP的重传机制根本就是不必要的。
如果下层链路是TCP,则:
TCP的可靠性是靠超时重传来保证的,而超时时间,即RTO是一个基于RTT动态计算的值,由于TCP的RTT本质上是测不准的,无法保证RTT测量值的准确性,这会导致TCP1和TCP2的超时timer到期时间的关系是任意关系,只要TCP2的丢包重传造成了TCP1的超时,就会发生重传叠加,即两层TCP均发生了针对同那个一个数据包的重传,而这是冗余的,一旦内层TCP1的重传速度稍微大于外层TCP2的重传速度,数据包就会在R1处堆积。队列会指数性增长,触发TCP1更加激烈的丢包超时重传。
另一方面,TCP是20字节的报文头,而UDP只有8字节的报文头,使用TCP相当于用户的数据少传输12个字节。