腾讯后端一面:当 TCP 建立连接之后,TCP 和 UDP 的实时性是不是就差不多了?
项目相关
面试官可能是 Go 方向的,我面试的是 Java 方向的,所以面试官也没有问我简历上的项目,主要问了实验室中做的项目,哪个项目比较有技术挑战?
面试主要问了计算级网络相关,以及如果让你来实现一个分布式锁,你该如何来实现,这一点说的时间比较久,有二十分钟左右
TCP 和 UDP
1、TCP 和 UDP 的区别?
TCP: TCP 时面向连接的协议,在传输数据之前,需要双方建立可靠的连接,即通过三次握手建立 TCP 连接
UDP: UDP 是非连接的协议,即发送端和接收端之间不建立连接,他只负责将数据包发送出去,不保证数据包的到达,因此数据包可能存在丢失、乱序、重复,也没有错误或者纠正机制
2、两者的使用场景
TCP 适用于对可靠性要求比较高的应用,比如网页浏览、远程调用、文件传输等
UDP 适用于对实时性要求较高的应用,比如视频、直播等场景,偶尔丢失数据相对于连接建立和恢复带来的延迟更加可以接收
3、两者的实时性谁更好一些?
UDP 的实时性更好一些,UDP 主要从以下几个方面来保证了较好实时性:
- 无连接: UDP 传输数据不需要建立连接,因此速度是比较快的
- 低延迟: UDP 发送数据时,不需要等待确认、恢复重传,因此大大降低了传输过程中的延迟
- 简单的协议头: UDP 的协议头只有 8 字节,TCP 的协议头至少 20 字节,因此 UDP 传输时的开销也比较小
4、如果 TCP 建立连接之后,TCP 和 UDP 的实时性谁会更好一些呢?
上边已经说了 UDP 保证实时性的几个方面,可以看到并不只是因为建立连接才会导致 TCP 的实时性较差
还有其他因素,因为 TCP 是保证 数据可靠、有序 ,因此 TCP 发送数据之后需要等待接收方确认,并且有重传机制,来保证数据到达接收方,这些都会导致在传输过程中的延时较高
TCP 还有 流量控制 和 拥塞控制 ,因此会根据网络拥堵情况调整数据包发送速率,在保证了数据包可靠性的同时,也带来了一定的传输延时
因此,TCP 建立连接之后,UDP 的实时性还是比 TCP 好得多,因为实时性好并不只是因为 UDP 是无连接的
红黑树
5、红黑树的特性了解吗?
红黑树是自平衡的二叉搜索树,红黑树包括以下 5 个特性:
1、每个节点要么是黑色要么是红色
2、根节点始终都是黑色
3、叶子节点不包含任何数据,并且都设置为黑色
4、如果一个节点是红色,则它的子节点必须是黑色
这条性质确保了从根到叶子的路径上不会出现两个连续的红色节点,有助于避免树的局部区域出现过高的密度,这是通过颜色的变化来轻微调整树的平衡。
5、从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
红黑树最关键的性质,确保了树的平衡。无论从哪个节点到其叶子节点的路径,经过的黑色节点数量必须相同。这确保了最长的可能路径(红色和黑色交替出现)最多是最短可能路径(全黑色)的两倍长,保证了查询性能的稳定
6、红黑树如何保证比较好的查询性能?
红黑树是通过维持树的平衡来保证比较好的查询性能,平衡的二叉搜索树的数据结构可以让查询、插入、删除的时间复杂度达到 O(logn)
当新插入元素,红黑树会通过 旋转 和 重新染色 来调整树的结构,满足上述的特性,保证了红黑树的平衡,使得查询性能较为稳定,在 Java 的 HashMap 中就使用到了红黑树来优化数据的查询性能