面试题答案
一键面试1. 基于缓冲区和计数器
- 方法:在发送端,将数据分块写入缓冲区,同时记录已发送字节数。接收端按相同分块大小读取数据,并累计已接收字节数,直到接收的字节数与发送的总字节数相等。
- 优点:实现相对简单,逻辑清晰,对系统资源消耗相对较小。
- 缺点:需要手动管理缓冲区和计数器,容易出现边界条件处理不当的问题,例如缓冲区溢出。如果数据传输过程中出现丢包,处理起来相对复杂。
2. 校验和(Checksum)
- 方法:发送端在发送数据前,根据数据内容计算一个校验和(如CRC、MD5等),并将校验和与数据一同发送。接收端接收到数据后,重新计算校验和,并与接收到的校验和进行比较。如果两者一致,则认为数据传输完整。
- 优点:能有效检测出数据在传输过程中是否被篡改或损坏,对于网络噪声、硬件故障等导致的数据错误有很好的检测能力。
- 缺点:计算校验和会增加一定的CPU开销。校验和本身也需要占用额外的带宽。而且校验和只能检测错误,无法纠正错误,一旦检测到错误,需要通过重传机制来解决。
3. 序列号(Sequence Number)
- 方法:发送端为每个发送的数据块分配一个唯一的序列号,接收端根据序列号来按顺序接收和重组数据。如果接收到的序列号不连续,说明有数据丢失,接收端可以请求发送端重传丢失的数据块。
- 优点:能够准确判断数据是否按顺序完整接收,对于处理乱序到达的数据很有效。在重传丢失数据时,可以精确重传丢失的部分,而不是整个数据。
- 缺点:需要额外的序列号管理机制,增加了实现的复杂度。序列号需要占用一定的带宽。如果序列号空间有限,可能会出现序列号循环使用导致的混淆问题。
4. 确认应答(ACK)机制
- 方法:发送端发送数据后,等待接收端返回的确认应答(ACK)。如果在一定时间内没有收到ACK,发送端认为数据传输失败,并重传数据。接收端每成功接收一块数据,就向发送端发送ACK。
- 优点:是一种可靠的数据传输机制,能确保数据被接收端正确接收。可以根据ACK的返回情况动态调整发送策略,如调整发送速率等。
- 缺点:增加了网络传输的额外开销,因为每个数据块都需要对应的ACK。如果网络延迟较高或ACK丢失,会导致不必要的重传,降低传输效率。同时,需要合理设置重传超时时间,时间设置过短可能导致频繁重传,过长则会影响数据传输的实时性。