理论与API相结合理解Node中的网络通讯
关注公众号“
执鸢者”,获取大量教学视频及
私人总结面筋(公众号原创文章)并进入
专业交流群

随着Node发展,其应用愈来愈常见,特别是在咱们前端圈,给咱们注入了新的活力。在使用中,Node的网络通讯部分主要涉及到传输层和应用层,本次就来一块儿唠一唠常见的TCP、UDP、HTTP协议的使用,经过理论与实践相结合,更加清楚的了解与使用这些协议。
1、传输层
1.1 TCP
TCP是面向链接的,而且经过流量控制、、序号、确认和定时器,确保正确的、按序的将数据从发送进程交付给接收进程。按照服是否进行监听进行划分,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(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
- 服务器只要收到了客户端发出的确认,当即进入CLOSED状态。一样,撤销TCB后,就结束了此次的TCP链接。能够看到,服务器结束TCP链接的时间要比客户端早一些。
1.1.1 TCP服务器

在上述图中,仔细品,能够总结为如何建立服务、服务相关、链接相关。而后并将其中事件与三次握手、四次挥手进行联系,很容易发现其实关键过程都被进行了监听。
- 如何建立服务:TCP创建链接前须要进入监听状态,因此这就涉及到图中的建立方式,建立服务后才能够监听特定地址
- 服务相关:服务建立以后就要观察其状态,并根据其状态进行一些列的处理,这就是服务器事件作的事情。
- 链接相关:服务器监听的目的是有链接创建并进行通讯,当链接创建以后就须要对整个数据传输过程进行监听,这就是链接事件。
1.1.2 TCP客户端
TCP客户端作的事情比较简单,只须要与对应服务器创建链接,便可进行数据的传输了。

1.1.3 注意事项

1.2 UDP
一种无链接的传输层协议,提供面向事务的简单不可靠信息传送服务.

2、应用层
2.1 HTTP
HTTP应该是平常开发中用的最多的协议,其是创建在TCP传输层之上的应用层协议。搞懂这个协议对前端总体水平的提升相当重要。

2.1.1 服务器

2.1.2 客户端

2.1.3 两个关键对象
IncomingMessage和ServerResponse两个对象在整个协议的使用中直观重要,特别是IncomingMessage。当咱们在使用的时候,是否是不懂的如何去使用,这个时候是否是应该去考虑一下请求报文与响应报文的结构了?我的认为其
关键属性恰好与请求报文和响应报文相呼应。
- HTTP请求报文主要包括:请求行(方法字段、URI字段和协议版本)、请求头部以及请求的数据(实体)。
- HTTP响应报文分为三个部分:状态行(版本、状态码和缘由语句)、首部行和实体。

欢迎老铁们加群或者私聊
欢迎关注本站公众号,获取更多信息