面试题答案
一键面试解决消息丢失和延迟问题
- 确认与重传机制
- 在自定义协议中添加消息序列号。发送方为每个发送的消息分配一个唯一序列号,并记录已发送但未确认的消息。接收方在接收到消息后,回复一个包含该消息序列号的确认消息(ACK)。发送方在设定的超时时间内若未收到ACK,重发该消息。例如,发送方每发送一条消息,启动一个定时器,若定时器超时未收到ACK,重发该消息并重置定时器。
- 可以采用滑动窗口协议,发送方可以在未收到ACK的情况下连续发送多个消息,窗口大小根据网络状况动态调整。接收方按序列号顺序接收消息,若收到乱序消息,缓存起来等待正确顺序的消息到达,减少不必要的重传。
- 流量控制
- 接收方在ACK消息中携带自身接收缓冲区的剩余容量信息。发送方根据接收方反馈的缓冲区剩余容量,动态调整发送速率。当接收方缓冲区快满时,发送方降低发送速度,避免因接收方来不及处理而导致消息丢失。
- 可以使用令牌桶算法实现流量控制。发送方有一个令牌桶,以固定速率生成令牌。每次发送消息需要从令牌桶获取一个令牌,若令牌桶中没有令牌,则等待令牌生成或丢弃消息,以此限制发送速率。
- 心跳机制
- 定期(如每隔一定时间间隔)发送心跳消息,用于检测连接状态。若接收方长时间未收到心跳消息,则判定连接可能中断,主动关闭连接并尝试重新连接。例如,客户端和服务器端每隔30秒互相发送心跳消息。
- 心跳消息可以设计得非常简单,只包含必要的标识信息,以减少网络开销。同时,心跳消息的超时时间应根据网络状况合理设置,避免误判。
增强协议安全性防止数据篡改
- 消息认证码(MAC)
- 在消息中添加MAC字段。发送方使用共享密钥和消息内容计算出MAC值,将其附加在消息末尾。接收方接收到消息后,使用相同的共享密钥和接收到的消息内容重新计算MAC值,并与接收到的MAC字段进行比对。若两者一致,则认为消息未被篡改;否则,丢弃该消息。例如,使用HMAC(Hash - based Message Authentication Code)算法,常见的有HMAC - SHA256,它结合了哈希函数(如SHA256)和共享密钥来生成MAC值。
- 数字签名
- 发送方使用自己的私钥对消息内容进行签名。签名过程可以是对消息的哈希值进行加密,然后将签名附加在消息上。接收方使用发送方的公钥验证签名,若验证成功,则说明消息来自合法发送方且未被篡改。例如,使用RSA算法进行数字签名,发送方用私钥对消息哈希值加密生成签名,接收方用公钥解密签名并与重新计算的消息哈希值比对。
- 加密传输
- 对整个消息体进行加密。可以选择对称加密算法(如AES),发送方和接收方使用相同的密钥对消息进行加密和解密,加密后的消息在网络上传输,防止中途被窃取和篡改。若采用非对称加密算法(如RSA),发送方用接收方的公钥加密消息,接收方用自己的私钥解密,虽然非对称加密性能相对较低,但在密钥交换等场景中有优势。也可以采用混合加密方式,先用非对称加密交换对称加密的密钥,然后用对称加密算法加密消息体,兼顾安全性和性能。