MST

星途 面试题库

面试题:网络编程中Socket双向通信的可靠性保障与异常处理

在复杂网络环境(如不稳定网络、高延迟、高丢包率)下,实现Socket客户端与服务器端双向通信的高可靠性传输。请设计一套完整的可靠性保障机制,包括但不限于重传策略、拥塞控制、错误检测与恢复,同时说明如何优雅地处理各种网络异常情况,确保通信的稳定性和数据的完整性。
31.6万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

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阈值,使得发送方更快地检测到丢包并进行重传。同时,在接收方设置缓存机制,缓存乱序到达的数据包,等待丢失的数据包重传后进行排序组装。