MST

星途 面试题库

面试题:网络编程之Socket数据报文处理优化

假设你正在开发一个基于UDP的实时数据传输系统,需要处理大量小数据报文。如何设计一种高效的机制来避免丢包,并且能对乱序到达的报文进行正确重组?
19.1万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试
  1. 序列号机制
    • 在每个UDP报文头部添加一个序列号字段。发送方按照顺序依次递增该序列号,从0开始,每发送一个报文,序列号加1。这样接收方可以根据序列号判断报文是否乱序,并对乱序到达的报文进行正确排序。
  2. 窗口机制
    • 接收方维护一个接收窗口。窗口大小根据网络状况和系统资源动态调整。例如,初始窗口大小可以设置为10个报文。接收方只接收序列号在窗口范围内的报文。如果接收到窗口外的报文,先缓存起来,等待窗口滑动。
    • 发送方也维护一个发送窗口,限制未确认报文的数量。当发送窗口内的报文都已发送且未收到确认时,停止发送新的报文,避免网络拥塞导致丢包。
  3. 确认机制
    • 接收方收到报文后,发送一个确认报文给发送方。确认报文中包含已成功接收的最大序列号。发送方根据确认报文,从发送窗口中移除已确认的报文,并滑动窗口,继续发送新的报文。
  4. 超时重传机制
    • 发送方为每个发送的报文设置一个超时定时器。如果在超时时间内没有收到确认报文,就重传该报文。超时时间需要根据网络的往返时间(RTT)动态调整,例如,可以使用Jacobson算法来估算RTT,并设置合适的超时时间。
  5. 报文缓存与重组
    • 接收方设置一个缓存区,用于缓存乱序到达的报文。当接收到一个报文时,首先检查序列号。如果序列号在窗口内且是期望接收的下一个序列号,直接处理该报文;如果序列号大于期望接收的下一个序列号,将其存入缓存区;如果序列号小于期望接收的下一个序列号,丢弃该报文(因为已经处理过)。
    • 当接收方处理完当前窗口内的所有报文后,检查缓存区,将缓存区内序列号连续的报文按顺序取出进行处理,完成报文的重组。