TCPNagle算法如果每次发送一个小数据包,比如没有优化的一个字节内容的数据包,会导致网络中只有极少数有效数据的数据包,这会导致大量网络资源的浪费。针对这种情况,Nagle算法要求缓冲区中的数据达到一定的数据量或者在一定时间后发送出去,所以数据包会被Nagle算法合并以优化网络。虽然这种优化提高了网络带宽的效率,但某些数据可能会延迟发送。在Nodejs中,由于TCP默认启动Nagle算法,可以调用socket.setNoDelay(ture)去掉Nagle算法,这样write()就可以立即向网络发送数据。但需要注意的是,虽然在网络的一端调用write()会触发另一端的data事件,但并不是每次write()都会触发另一端的data事件。关闭Nagle算法后,接收端可能会将接收到的多个小数据包合并,只触发一个数据事件。也就是说socket.setNoDelay(ture)只能解决一端数据卡顿的问题。什么是粘包?在打包的过程中,上一个包的内容和下一个包的内容粘在一起,被误解析为数据包。这就是所谓的粘包。粘包的根本原因是消息边界的不确定性。当接收端面对一个“无穷无尽”的二进制流时,它不知道接收到多少个01才算是一条消息。一不小心拿多了,就说是粘包了。其实粘包根本不是TCP的问题,而是用户对TCP的误解造成的问题。只要发送端在每次发送消息时携带标识消息边界的信息,接收端就可以根据该信息标识消息边界,从而区分每条消息。通过拆包封装解决粘包方案。在node.js中,接收端的数据事件是不会根据发送端的写入来触发的。会出现以下三种情况:发送端多次write()的数据可能会打包成一个数据包发送给接收方。发送方通过write()一次写入的数据,由于体积较大,可能会被截成多个数据包。发送方通过write()写入一次并打包成数据报发送给接收方。我们必须处理前两种情况。TCP是一种基于流的传输机制,因此在传输过程中其数据顺序是由先进先出原则决定的。因此,通过在每次write()的数据头中加入一些标识符,就可以将每次write()传输的数据分开,然后在接收端根据这些区间数据的标识符进行数据的拆分或合并。UDPUDP,又称用户数据报协议,与TCP一样属于网络传输层。UDP和TCP最大的区别是UDP不是面向连接的。UDP应用场景:DNS、音视频传输server.jsconstPORT=3333;constHOST='127.0.0.1';constdgram=require("dgram");varserver=dgram.createSocket('udp4');server.on("listen",function(){constaddress=server.address();console.log('UDPServerlisteningon'+address.address+":"+address.port);})server.on('message',function(message,remote){console.log(remote.address+':'+remote.port+'-'+message);});socket.bind(POST,HOST);clientconstPORT=3333;constHOST='127.0.0.1';constdgram=require('dgram');constmessage=Buffer.from('测试消息');constclient=dgram.createSocket('udp4');client.send(message,PORT,HOST,function(err,bytes){if(err)throwerr;console.log('UDPmessagesentto'+HOST+':'+PORT);client.close();});UDPsocket单词事件UDPsocket比TCPsocket使用起来更简单,它只是EventEmitter的一个实例,而不是Stream的一个实例。它具有以下自定义事件。message:UDP套接字监听网卡端口,收到消息时触发该事件。触发器携带的数据是消息Buffer对象和远程地址信息。listening:当UDP套接字开始侦听时触发此事件。close:调用close()方法时触发该事件,不再触发message事件。如果需要再次触发消息事件,只需重新绑定即可。error:发生异常时触发该事件。如果不监听,会直接抛出异常,让进程退出。
