一. TCP
原理
TCP是面向连接的通信协议,通过
三次握手
建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯
。
TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认
”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口
”的方式进行流量控制
,所谓窗口实际表示接收能力,用以限制发送方的发送速度。
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查
,同时实现虚电路间的连接
。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。
面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP
)需要高度的可靠性,所以它们使用了TCP。DNS
在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。TCP连接及事件
const net = require('net');
const server = net.createServer((socket) => {
socket.on('data', (data) => { //一端write 触发另一端data
socket.write(data.toString());
});
socket.on('drain', () => { //一端write 自己触发drain
console.log("服务器发送数据");
});
socket.on("end", () => {
socket.write("disconnected");
});
socket.on('close', () => {
console.log("socket全部关闭");
});
socket.on('timeout', () => {
console.log("连接闲置,超时");
})
socket.write("server!");
});
//绑定端口后触发 优先于listen回调函数触发
server.on('listening', () => {});
//客户端连接到服务器触发 定义一个全局client数组存储客户信息
server.on('connection', (client) => {
client.name = client.remoteAddress + ':' + client.remotePort;
});
//服务器关闭时触发
server.on('close', () => {});
//服务器异常时触发
server.on('error', () => {});
server.listen(2599, () => {
console.log("server bound");
});
//客户端
var client = net.connect({port: 2599}, () => {});
服务器还可以监听Domain socket server.listen('/tmp/echo.sock')
nagle算法对小数据包要求缓冲区的数据达到一定数量或者一定时间后才将其发出。socket.setNoDelay(true)
去掉nagle算法。
二. UDP
原理
UDP是面向
无连接
的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。
UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务
,UDP主要用于那些面向查询—应答的服务,例如NFS
。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。
欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。连接及事件
//server
const dgram = require('dgram');
const server = dgram.createSocket("udp4");
//接收到消息触发
server.on('message', (msg, rinfo) => {
console.log("server got: " + msg + " from " +
rinfo.address + ":" + rinfo.port);
});
//开始侦听时触发
server.on('listening', () => {
var address = server.address();
console.log(server.address + ":" + address.port);
});
server.bind(2599);
//client
const dgram = require('dgram');
var message = new Buffer("node.js");
const client = dgram.createSocket("udp4");
client.send(message, 0, message.length, 2599, "localhost",
(err, bytes) => {
client.close();
});
message listening close error 四个事件