面试题答案
一键面试字节流和数据报文的主要区别
- 数据结构:
- 字节流:无明显边界,数据像水流一样连续传输,以字节为单位顺序排列,接收方不知道数据应该按何种逻辑边界划分。例如在文件传输场景下,文件内容以字节流形式传输,没有预先定义的报文边界。
- 数据报文:有明确边界,以报文为单位传输,每个报文都有特定的结构,如报头和正文等。像UDP协议传输的数据,每个UDP数据包就是一个报文,接收方可以清晰识别每个报文的开始和结束。
- 可靠性:
- 字节流:一般提供可靠传输。例如TCP使用字节流,通过序列号、确认应答、重传机制等保证数据无差错、不丢失、不重复且按序到达。
- 数据报文:通常可靠性相对较弱。以UDP为例,它不保证数据一定能到达目的地,也不保证数据顺序,可能会出现丢包、乱序等情况。
- 传输效率:
- 字节流:由于要保证可靠性,在传输过程中需要额外的控制信息(如TCP的确认应答等),传输效率相对报文可能稍低。例如在对可靠性要求高的金融数据传输场景下,即使效率稍低,也会选择字节流传输。
- 数据报文:没有复杂的可靠性机制,传输效率较高,适合对实时性要求高但对数据完整性要求相对较低的场景,如视频流、音频流传输。
在TCP协议下处理字节流以确保数据完整性和准确性的方法
- 序列号:
- TCP为每个发送的字节分配一个序列号。发送方在发送数据时,将字节流中的每个字节按顺序编号。接收方根据序列号对接收的数据进行排序,从而保证数据按发送顺序正确重组。例如,发送方发送数据块A、B、C,序列号依次为1、1001、2001,接收方根据序列号能正确排列这些数据块。
- 确认应答:
- 接收方在接收到数据后,会向发送方发送确认应答(ACK)。ACK中包含已成功接收数据的序列号,告知发送方哪些数据已被正确接收。发送方只有收到相应的ACK,才认为数据传输成功。若在规定时间内未收到ACK,发送方会重传未确认的数据。比如发送方发送了序列号1 - 1000的数据,接收方正确接收后,会发送ACK确认序号1000,表示1 - 1000的数据已成功接收。
- 滑动窗口:
- 发送方和接收方都维护一个滑动窗口。发送方的滑动窗口决定了在未收到ACK的情况下可以连续发送的数据量。接收方的滑动窗口则表示接收方当前可以接收的数据量。通过滑动窗口机制,既能提高传输效率,又能避免发送方发送过多数据导致接收方处理不过来而丢包。例如,发送方滑动窗口大小为1000字节,它可以连续发送1000字节的数据,接收方处理完部分数据后,调整滑动窗口告知发送方可以继续发送新的数据。
- 校验和:
- TCP在数据传输过程中会对每个报文段计算校验和。发送方计算校验和并将其放入TCP首部,接收方收到数据后重新计算校验和,并与首部中的校验和进行比较。若不一致,则说明数据在传输过程中出现错误,接收方会丢弃该报文段,发送方会重传。这保证了数据在传输过程中的准确性。