面试题答案
一键面试整体架构
- 应用层:定义特定于实时数据传输的业务逻辑,如音视频流的编解码处理,根据业务需求对数据进行分块等操作,调用自定义协议接口将数据传递给传输层。
- 传输层:基于TCP,利用其可靠传输特性确保数据无差错到达,但TCP的拥塞控制机制可能对实时性有一定影响,所以需对其进行优化。在TCP头部基础上自定义一些字段,用于标识实时数据的优先级等信息。
- 网络层:使用IP协议进行寻址和路由,将数据封装在IP数据包中在网络中传输。
- 数据链路层:负责将IP数据包封装成帧,通过物理介质传输,常见的如以太网协议。
数据格式
- 自定义头部:
- 版本号:标识协议版本,便于协议升级和兼容性处理。
- 数据类型:区分音频、视频、控制指令等不同类型数据。
- 优先级:定义数据的实时性优先级,高优先级数据优先处理和传输。
- 序列号:为每个数据包编号,用于数据的排序和重传。
- 校验和:对头部和数据部分进行校验,确保数据完整性。
- 数据部分:根据数据类型填充实际的音视频数据、控制指令等内容。
交互流程
- 连接建立:客户端和服务器通过TCP三次握手建立连接,之后在应用层进行自定义协议的初始化,如协商版本号、数据格式等参数。
- 数据传输:
- 发送端应用层将实时数据按自定义格式封装,交给传输层,传输层加上TCP头部后传递给网络层。
- 接收端按协议栈顺序逐层解封装,网络层将数据交给传输层,传输层验证TCP头部及自定义头部的校验和等,无误后将数据交给应用层,应用层根据序列号对数据进行排序重组。
- 连接关闭:数据传输完毕,通过TCP四次挥手关闭连接。
保证数据可靠性
- 序列号与确认机制:发送端为每个数据包分配序列号,接收端接收到数据包后,通过ACK确认消息告知发送端已正确接收。若发送端在一定时间内未收到确认,重传该数据包。
- 校验和:在自定义头部和数据部分计算校验和,接收端通过重新计算校验和验证数据是否在传输过程中损坏,若校验和不一致则丢弃该数据包并要求重传。
保证实时性
- 优先级调度:根据自定义头部中的优先级字段,在发送端和网络设备中对高优先级实时数据优先处理和转发,减少排队等待时间。
- 减少缓冲:在接收端和发送端尽量减少数据缓冲,快速处理和转发数据,降低端到端延迟。
- 自适应码率调整:根据网络状况实时调整数据发送码率,避免因网络带宽不足导致数据积压和延迟。
处理网络拥塞和丢包问题
- 拥塞控制:
- 优化TCP拥塞控制算法:如采用更适合实时数据的拥塞控制算法,像BBR(Bottleneck Bandwidth and Round - trip propagation time),它能更准确地探测网络带宽和延迟,避免过度拥塞。
- 反馈机制:接收端通过反馈消息告知发送端网络状况,如丢包率、带宽利用率等,发送端根据反馈动态调整发送速率。
- 丢包处理:
- 快速重传:当接收端连续收到多个重复序列号的数据包时,认为中间数据包丢失,立即发送重复ACK,发送端收到一定数量重复ACK后,不等超时就重传丢失的数据包。
- 前向纠错(FEC):发送端在数据中添加冗余纠错码,接收端根据这些冗余信息恢复丢失的数据包,减少重传次数,提高实时性。