当前位置: 首页 > 后端技术 > Node.js

理论与API结合理解Node中的网络通信

时间:2023-04-03 16:07:49 Node.js

关注公众号“放风筝的人”,获取海量教学视频和私密总结面筋(公众号原创文章)进入专业交流群随着Node的发展,其他应用越来越普遍,尤其是在我们的前端圈子里,给我们注入了新的活力。在使用中,Node的网络通信部分主要涉及传输层和应用层。这次我们就来说说常见的TCP、UDP、HTTP协议的使用。通过理论与实践的结合,我们可以更清楚地理解和使用它们。这些协议。1.传输层1.1TCPTCP是面向连接的,通过流量控制、序列号、确认和定时器,保证数据从发送进程到接收进程的正确和顺序传送。根据服务端是否监听,TCP分为服务端和客户端。我们分开说吧。仔细阅读了Node的API,发现它与TCP的原理息息相关。妈妈再也不用担心我记不住这些API了。我们先来看看TCP的三次握手和四次握手的过程。三向握手的TCP服务器进程首先创建一个传输控制块TCB(线程控制块),随时准备接受客户端进程的连接请求。此时服务器进入LISTEN(监听)状态;TCP客户端进程也先创建传输控制块TCB,然后向服务器发送连接请求报文。此时报文头中相同部分为SYN=1,同时选择一个初始序号seq=x。此时TCP客户端进程进入SYN-SENT(同步发送状态)状态。TCP规定一个SYN报文段(SYN=1的报文段)不能携带数据,但是需要消耗一个序号。TCP服务器收到请求报文后,如果同意连接,将发送确认报文。确认报文中,ACK=1,SYN=1,确认号为ack=x+1,还为自己初始化了一个序号seq=y。此时TCP服务器进程进入SYN-RCVD(同步接收)状态。这个消息同样不能携带数据,但是它也消耗了一个序号。TCP客户端进程收到确认后,还需要给服务器一个确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1。此时TCP连接建立,客户端进入ESTABLISHED(连接建立)状态。TCP规定ACK段可以携带数据,但如果不携带数据,则不会消耗序号。服务器收到客户端的确认后,也进入ESTABLISHED状态,之后双方就可以开始通信了。挥手四次。客户端进程发送连接释放消息并停止发送数据。释放数据报文头,FIN=1,其序号为seq=u(等于之前传输的数据最后一个字节的序号加1),此时客户端进入FIN-WAIT-1(停止等待1)状态。TCP规定即使FIN段不携带数据,也仍然要消耗一个序号。服务器收到连接释放报文,发送确认报文,ACK=1,ack=u+1,并带上自己的序列号seq=v,此时服务器进入CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层应用进程,客户端向服务器方向释放。此时处于半关闭状态,即客户端没有数据发送,但是如果服务端发送数据,客户端还是要接受。这个状态会持续一段时间,也就是整个CLOSE-WAIT状态的持续时间。客户端收到服务器的确认请求后,此时,客户端进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放消息(在此之前,需要接受服务器发送的最后数据)。服务器发送完最后一个数据后,给客户端发送连接释放消息,FIN=1,ack=u+1,因为是半关闭状态,服务器可能又发送了一些数据,假设序列号此时对于seq=w,此时服务端进入LAST-ACK(最终确认)状态,等待客户端的确认。客户端收到服务器的连接释放报文后,必须发送确认,ACK=1,ack=w+1,自己的序号为seq=u+1。这时,客户端进入TIME-WAIT(时间等待)状态。注意此时TCP连接还没有被释放,只有经过2??MSL(maximumsegmentlife)的时间,客户端才会进入CLOSED状态,相应的TCB被客户端撤销。服务器只要收到客户端的确认,就立即进入CLOSED状态。同样,TCB被撤销后,这个TCP连接就结束了。可以看出,服务器比客户端更早结束TCP连接。1.1.1TCPserver上图中细品可以概括为如何创建服务,服务相关,连接相关。再将事件与三次握手和四次握手联系起来,不难发现关键进程确实被监控到了。如何创建服务:TCP在建立连接之前需要进入监听状态,所以这里涉及到图中的创建方法。服务创建后,可以监听特定地址服务相关:服务创建后,必须要观察它的状态,还有一些Column的处理,就是serverevents做的事情。连接相关:服务器监听的目的是建立连接,进行通信。连接建立后,需要监控整个数据传输过程。这是连接事件。1.1.2TCP客户端TCP客户端做的事情比较简单,只需要和相应的服务器建立连接,就可以传输数据了。1.1.3注释1.2UDP是一种无连接的传输层协议,提供面向事务的简单不可靠的信息传输服务。2、应用层2.1HTTPHTTP应该是日常开发中最常用的协议了,它是基于TCP传输层之上的应用层协议。理解这个协议对于提高前端的整体水平至关重要。2.1.1Server2.1.2Client2.1.3两个关键对象IncomingMessage和ServerResponse在整个协议的使用中直观的很重要,尤其是IncomingMessage。我们在使用的时候,难道不知道怎么用吗?这时候我们是不是应该考虑请求报文和响应报文的结构呢?我个人认为它的关键属性正好对应请求消息和响应消息。HTTP请求报文主要包括:请求行(方法字段、URI字段和协议版本)、请求头和请求数据(实体)。HTTP响应消息分为三部分:状态行(版本、状态码和原因声明)、头部行和实体。欢迎老兵进群或私聊