面试题答案
一键面试面临的难点
- 无内置反馈机制:UDP缺乏像TCP那样接收端反馈的ACK机制,难以准确知晓数据是否成功到达接收端,也就难以判断网络拥塞情况。
- 数据无序性:UDP不保证数据按序到达,这使得基于序号的拥塞控制算法(如TCP的部分算法)难以直接应用,因为无法通过序号精准确定数据传输情况。
- 缺乏连接状态管理:TCP有明确的连接建立、维持和关闭状态,可利用这些状态进行拥塞控制的初始化、调整等操作。UDP是无连接的,没有这种状态管理,难以按传统TCP方式进行拥塞控制。
- 缺乏窗口机制:TCP通过滑动窗口来控制发送速率。UDP没有类似的窗口概念,实现类似机制需要额外设计和实现。
可行的解决方案框架
- 模拟ACK机制:
- 在应用层引入确认机制,接收端收到数据后发送自定义的确认消息给发送端。发送端根据是否收到确认信息来判断数据是否成功传输。
- 为每个发送的数据包分配唯一序号,接收端在确认消息中包含已正确接收的数据包序号,发送端据此判断哪些数据包已被成功接收。
- 拥塞窗口和慢启动:
- 在发送端维护一个拥塞窗口(cwnd),类似于TCP。初始时,cwnd设置为一个较小的值(如1个MSS,最大报文段长度)。
- 采用慢启动机制,每收到一个确认消息,cwnd就增加一个MSS大小,直到达到慢启动阈值(ssthresh)。
- 拥塞避免:
- 当cwnd达到ssthresh后,进入拥塞避免阶段。此时每收到cwnd个确认消息,cwnd才增加1个MSS。
- 通过这种方式逐渐增加发送速率,避免网络拥塞。
- 快速重传和快速恢复:
- 如果发送端在一定时间内收到多个重复确认(如3个),则认为某个数据包可能丢失,触发快速重传机制,立即重传该数据包。
- 触发快速重传后,将ssthresh设置为当前cwnd的一半,同时cwnd设置为ssthresh加上3倍的MSS,进入快速恢复阶段。在快速恢复阶段,每收到一个重复确认,cwnd增加1个MSS,直到收到一个新的确认消息,然后将cwnd设置为ssthresh,重新进入拥塞避免阶段。
- 超时重传:
- 为每个发送的数据包设置一个超时定时器。如果在定时器超时前未收到确认消息,则认为数据包丢失,重传该数据包,并将ssthresh设置为当前cwnd的一半,cwnd重新设置为1个MSS,进入慢启动阶段。