TCP和UDP的区别是什么?
相信这个问题大家在面试的时候都有被问到过。
我在面试的时候回答的是:TCP是可靠的传输,UDP是不可靠的传输存在丢包率高的现象,所以一般TCP会应用于下载,网页等传输,而UDP则更适用于像语音通话这样的传输等。
但是面试官下面的追问让我懵了。
1. 为什么UDP有存在丢包的现象,但是视频和游戏都是基于UDP进行传输呢?
这个问题我确实挺感兴趣的,所以后面去找资料去弄清楚,然后发现,其实现在的主流游戏(包括原神、王者荣耀等)都是基于UDP传输,首先我们需要了解,为什么TCP会比UDP可靠?
我找了一张图片,可以比较直观地说明UDP和TCP的关系,TCP更像有连接机制、拥塞控制、重传机制、乱序重排机制和滑动窗口等等“马甲”的UDP,这些“马甲”虽然保证了可靠性但是传输也慢了。
2. 有没有办法鱼与熊掌兼得?既保留TCP的可靠又保留UDP的快呢?
答案是有的,方案是将TCP和UDP折中一下,保留乱序重排、重传、滑动窗口和拥塞控制几个机制,就形成了一个新的传输机制——KCP。
可以将KCP理解为一个协议,但归根结底是应用层的一个算法,更准确的说法是,KCP(协议)=UDP+部分可靠性机制。
3. KCP为什么比TCP快?
3.1 超时重传机制
网络环境不好的时候,就需要重传数据,TCP重传需要等待2RTO(Retransmission TimeOut)时间,KCP则等待1.5RTO时间即可。
3.2 快速重传机制
TCP发现某个数据包的ACK包丢失3次才触发重传,但是KCP可以设置为丢掉两个包触发重传。
3.3 拥塞控制机制
当发生丢包时,TCP会认为是网络环境变差,自动减少发包量,KCP也有,但是KCP可以关掉拥塞控制机制,所以TCP让出来的网络资源可以给到KCP。
通过以上机制,KCP传输可以比TCP快30-40%的速度,也保证了一定的可靠性。视频监控纯用UDP可能会画面扭曲,游戏纯用UDP可能会画面跟鬼畜一样。利用KCP进行传输,这小小的改动解决了上述这些问题。
4. 当网络环境不好的时候,宽带会优先舍弃UDP包,KCP怎么解决这个问题的?
添加冗余数据包,当丢包发生时,通过添加冗余数据包的方法,这样即使发生丢包也可以恢复出完整的数据。
5.总结拓展
TCP就像一个老实人一样,非常可靠,但是可能有些时候太守旧了速度慢,就像慢慢老去的我们一样。所以才会对UDP进行一些算法上的的改造,保持一定速度的同时也可以保证一点可靠性。
包括HTTP3.0时代也是一个基于UDP的协议。HTTP的发展史,我会在下一篇文章提到!
同时也可以保证一点可靠性。
包括HTTP3.0时代也是一个基于UDP的协议。HTTP的发展史,我会在下一篇文章提到!