面试题答案
一键面试TCP 数据流分片基本原理
在 Node.js 环境下,TCP 是基于流的协议。当发送数据时,数据会被操作系统的 TCP 协议栈按照一定规则进行分片。这主要是由于网络传输的 MTU(最大传输单元)限制,不同网络设备(如以太网、WiFi 等)有不同的 MTU 值,一般常见的以太网 MTU 为 1500 字节。
TCP 协议栈会将较大的数据块分割成适合网络传输的片段,每个片段包含 TCP 头部和数据部分。接收端会根据 TCP 头部的信息(如序列号等)来重组这些分片,以还原完整的数据。在 Node.js 中,虽然开发者无需直接处理 TCP 协议栈层面的分片,但在应用层处理数据流时,可能需要类似的分片操作,比如处理大文件上传等场景。
代码示例
const net = require('net');
const server = net.createServer((socket) => {
const dataToSend = 'a'.repeat(10000); // 模拟较大的数据流
const chunkSize = 1000; // 按照1000字节进行分片
for (let i = 0; i < dataToSend.length; i += chunkSize) {
const chunk = dataToSend.slice(i, i + chunkSize);
socket.write(chunk);
}
socket.end();
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
在上述代码中:
- 我们创建了一个简单的 TCP 服务器。
- 定义了一个较大的数据流
dataToSend
,这里用重复字符a
模拟。 - 设定了分片大小
chunkSize
为 1000 字节。 - 通过循环,从数据流中截取固定大小的片段,并通过
socket.write
发送出去,最后调用socket.end
结束连接。