面试题答案
一键面试传输协议选择
- UDP:
- 原因:实时协作系统对实时性要求高,UDP无连接,无需像TCP那样进行三次握手等复杂的连接建立过程,减少了延迟。在网络抖动等情况下,它不会因为重传机制而导致后续数据长时间等待,更适合实时数据传输。
- 缺点应对:UDP不保证数据可靠性,针对此,在应用层实现自己的可靠性机制,如序号、确认和重传机制。
- QUIC:
- 原因:基于UDP,具有低延迟特性。它在传输层实现了多路复用,可在单个连接上并发传输多个数据流,减少连接建立开销。而且具备前向纠错(FEC)机制,能在一定程度上恢复丢失的数据包,提高数据可靠性,很适合复杂网络环境。
连接管理
- 心跳机制:
- 实现:客户端和服务器定期互相发送心跳包。例如,客户端每隔一定时间(如5 - 10秒)向服务器发送一个简单的心跳消息,服务器收到后回复。
- 作用:检测连接是否正常,若服务器在一定时间(如2 - 3个心跳周期)内未收到客户端心跳包,则认为客户端可能掉线,可采取相应措施(如断开连接或尝试重新连接)。
- 连接池:
- 实现:在服务器端维护一个连接池,预先建立一定数量的连接。当有新的客户端请求连接时,从连接池中获取一个可用连接,处理完请求后将连接返回连接池。
- 作用:减少频繁创建和销毁连接的开销,提高系统响应速度,尤其在高并发场景下,能有效降低连接建立的延迟。
- 自动重连:
- 实现:客户端检测到连接断开时,启动自动重连机制。可以设置重连间隔时间,例如从1秒开始,每次重连失败后翻倍,直到达到一个最大重连间隔(如30秒)。
- 作用:在网络短暂故障恢复后,能自动恢复连接,提高系统的可用性。
数据可靠性保证
- 序列号与确认机制:
- 实现:发送端为每个数据包分配一个唯一的序列号,接收端收到数据包后,根据序列号按顺序排列,并向发送端发送确认消息(ACK),告知已成功接收。发送端若在一定时间内未收到某个数据包的ACK,则重传该数据包。
- 作用:确保数据按顺序到达,且不丢失。
- 前向纠错(FEC):
- 实现:发送端在发送数据时,额外计算并发送一些冗余数据。接收端根据接收到的原始数据和冗余数据,通过特定算法恢复可能丢失的数据。例如,采用里德 - 所罗门(Reed - Solomon)编码算法,发送端根据原始数据生成冗余校验块一同发送。
- 作用:在不增加太多带宽的情况下,提高数据在丢包情况下的恢复能力,减少重传次数,保证实时性。
- 数据校验:
- 实现:在发送端对数据包计算校验和(如CRC校验和),并将校验和与数据一同发送。接收端收到数据后,重新计算校验和并与接收到的校验和对比,若不一致则认为数据传输有误,要求重传。
- 作用:确保接收到的数据没有在传输过程中被损坏。