面试题答案
一键面试1. 前向纠错(FEC)
- 原理:在发送端,对原始数据进行编码,添加冗余信息。接收端利用这些冗余信息来恢复丢失的数据。例如,采用里德 - 所罗门(Reed - Solomon)编码,将一组数据块编码成包含原始数据和冗余校验数据的新数据块集合。假设原始数据块为$D_1, D_2, \cdots, D_n$,经过编码后得到$D_1, D_2, \cdots, D_n, P_1, P_2, \cdots, P_m$($P_i$为冗余校验数据)。即使在传输过程中有一些数据块丢失,只要丢失的数据块数量在编码的纠错能力范围内,接收端就可以通过冗余数据恢复出原始数据。
- 优势:无需等待重传,减少延迟,适用于实时性要求高的音视频传输。可以并行处理多个数据块的冗余生成和恢复,提高效率。
2. 重传机制
- 快速重传:接收端如果收到乱序的数据包,立即发送重复确认(ACK)给发送端。当发送端收到一定数量(如3个)的重复ACK时,就认为后续的数据包可能丢失,不等超时就重传相应数据包。例如,发送端依次发送数据包$P_1, P_2, P_3, P_4$,接收端收到$P_1, P_3$,此时接收端发送两个对$P_1$的ACK,发送端收到3个重复ACK(假设设定为3个)后,重传$P_2$。
- 选择性重传:接收端在发现数据包丢失时,记录下丢失数据包的序号,并通过反馈机制告知发送端。发送端只重传丢失的数据包,而不是重传从丢失数据包开始的所有后续数据包。例如,发送端发送$P_1 - P_10$,接收端发现$P_3$和$P_7$丢失,告知发送端,发送端仅重传$P_3$和$P_7$。
3. 数据包缓存与重组
- 接收端缓存:在接收端设置合适大小的缓存区,用于暂存接收到的数据包。缓存区大小需要根据音视频数据的帧率、码率等因素进行合理调整。例如,对于帧率为30fps,码率为1Mbps的视频流,根据网络丢包率预估可能丢失数据包的数量,计算出缓存区能容纳一定时间内(如1 - 2秒)的数据包。
- 数据包重组:对接收到的数据包按照序号进行排序和重组,恢复出完整的音视频数据。如果有数据包丢失,结合前向纠错或重传机制获取丢失数据包后再进行重组。
4. 自适应码率调整
- 网络状态监测:发送端通过发送心跳包或根据接收端反馈的信息(如ACK的到达时间间隔、重复ACK的数量等)来实时监测网络状态,估算当前网络的带宽、丢包率等。例如,发送端每隔固定时间间隔(如1秒)发送一个心跳包,根据心跳包的往返时间(RTT)和是否收到ACK来判断网络状态。
- 码率调整策略:根据网络状态动态调整音视频的编码码率。当网络丢包率较高时,降低码率,减少每个数据包的数据量,从而降低单个数据包丢失对整体质量的影响;当网络状况好转时,提高码率,提升音视频质量。例如,采用基于带宽估计的码率调整算法,根据估算出的可用带宽调整编码参数。
5. 优化UDP设置
- 设置合适的套接字选项:例如,设置
SO_RCVBUF
和SO_SNDBUF
来调整接收和发送缓冲区的大小,以适应高丢包网络环境下的数据传输。增大缓冲区可以减少因缓冲区溢出导致的数据丢失。可以根据网络状况和音视频数据量动态调整缓冲区大小,如在丢包率高时适当增大缓冲区。 - 合理设置超时时间:对于重传机制中的超时时间,需要根据网络的延迟抖动情况进行合理设置。如果超时时间设置过短,可能导致不必要的重传;设置过长,则会增加数据恢复的延迟。可以采用自适应的超时时间算法,根据网络RTT的变化动态调整超时时间。