面试题答案
一键面试1. 重传策略
- 超时重传:
- 在客户端和服务器端发送数据时,启动一个定时器。例如,设定初始超时时间为1秒。如果在超时时间内未收到对方的确认(ACK),则重传该数据包。
- 每次重传后,适当增加超时时间,如按照指数退避算法,每次超时时间翻倍,以应对网络延迟的变化。例如,第一次超时1秒,第二次2秒,第三次4秒等。
- 快速重传:
- 当接收方收到乱序的数据包时,立即发送重复的ACK给发送方。发送方如果收到一定数量(如3个)的重复ACK,就认为后续数据包可能丢失,不等超时就重传丢失的数据包。
2. 拥塞控制
- 慢启动:
- 发送方初始发送窗口(拥塞窗口)设为一个较小的值,如1个最大段大小(MSS)。每收到一个ACK,拥塞窗口就增加1个MSS。这样逐渐探测网络的承载能力。
- 当拥塞窗口达到慢启动门限(ssthresh)时,进入拥塞避免阶段。
- 拥塞避免:
- 在这个阶段,每收到一个ACK,拥塞窗口增加1 / cwnd 个MSS(cwnd为当前拥塞窗口大小)。增长速度比慢启动阶段慢,避免网络拥塞。
- 当发生超时重传时,慢启动门限设为当前拥塞窗口的一半,拥塞窗口重新设为1个MSS,重新进入慢启动阶段。
- 快速恢复:
- 当收到3个重复ACK触发快速重传后,慢启动门限设为当前拥塞窗口的一半,拥塞窗口设为慢启动门限加上3个MSS(因为收到3个重复ACK意味着有3个数据包离开了网络),然后进入拥塞避免阶段,而不是重新进入慢启动阶段。
3. 错误检测与恢复
- 校验和:
- 在数据包的头部添加校验和字段。发送方在发送数据包前,根据数据包的内容计算校验和并填充到该字段。
- 接收方收到数据包后,重新计算校验和并与收到的校验和字段比较。如果不一致,说明数据包在传输过程中出现错误,丢弃该数据包,并要求发送方重传。
- 序列号:
- 为每个发送的数据包分配一个唯一的序列号。接收方根据序列号对数据包进行排序,发现缺失序列号的数据包时,向发送方请求重传。
- 发送方维护一个已发送但未确认的数据包列表,根据接收方的重传请求,重传对应的数据包。
4. 处理网络异常情况
- 网络中断:
- 客户端和服务器端都设置心跳机制,定期(如每10秒)发送心跳包给对方。如果一段时间(如30秒)内未收到心跳响应,判定网络中断。
- 网络中断后,客户端尝试重新连接服务器。可以设定一个重连间隔,如从1秒开始,每次重连失败后翻倍,直到达到一个最大重连间隔(如60秒)。
- 高延迟:
- 通过调整超时重传时间和拥塞控制策略来适应高延迟网络。例如,适当增大初始超时时间,在拥塞避免阶段更缓慢地增加拥塞窗口。
- 高丢包率:
- 加强重传机制,如降低快速重传的重复ACK阈值,使得发送方更快地检测到丢包并进行重传。同时,在接收方设置缓存机制,缓存乱序到达的数据包,等待丢失的数据包重传后进行排序组装。