面试题答案
一键面试- 数据包编号
- 为每个发送的UDP数据包分配一个唯一的序列号。这样接收方可以根据序列号来判断数据包是否按序到达,以及是否有数据包丢失。
- 发送方维护状态
- 重传定时器:为每个发送的数据包启动一个重传定时器。当定时器超时时,如果还未收到该数据包的确认(ACK),则重传该数据包。定时器的初始值应根据网络延迟的估计值来设定,例如可以根据历史数据或初始探测来得到一个合适的初始值。
- 重传队列:维护一个重传队列,用于存储已发送但未确认的数据包及其相关信息(如发送时间、重传次数等)。
- 接收方反馈
- ACK机制:接收方在成功接收一个数据包后,立即向发送方发送一个包含该数据包序列号的ACK数据包。ACK数据包应尽量精简,以提高带宽利用率。
- 动态调整重传策略
- 自适应重传定时器:根据网络延迟的变化动态调整重传定时器的值。例如,当连续成功接收多个数据包且ACK返回时间较短时,可以适当缩短重传定时器;当出现重传且网络延迟增大时,适当延长重传定时器。
- 重传次数限制:设定一个最大重传次数,当一个数据包的重传次数达到该限制时,可认为该数据包无法成功传输,放弃重传并进行相应的错误处理(如通知上层应用)。
- 带宽利用率优化
- 批量ACK:接收方可以累积多个数据包的确认信息,然后一次性发送一个ACK,以减少ACK数据包的数量,提高带宽利用率。但要注意不能过度累积导致发送方等待时间过长。
- 重传优化:在重传时,尽量利用网络空闲时间。例如,当网络带宽利用率较低时进行重传,避免与正常数据传输竞争带宽。同时,可以采用快速重传机制,即当接收方连续收到多个重复序列号的数据包时,认为中间的数据包丢失,立即发送ACK通知发送方重传,而不必等待重传定时器超时。