Node具有事件驱动、无阻塞、单线程等特点,是搭建网络服务器的一个很好的语言,很多编程语言需要专门的服务器来作为容器,例如ASP需要IIS作为服务器,PHP需要Apache或者Nginx环境等等,而对于Node来说,只需要几行代码就可以构建服务器,不需要其他的容器。在这里就需要提到四个重要的概念: TCP, UDP, HTTP, HTTPS。
TCP全名是传输控制协议,是一个面向连接的协议,它在传输的过程中,需要经历三次握手形成会话。第一次握手是建立连接,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认; 第二次是服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),此时SYN_RECV状态;第三次是客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),这个包发完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。在TCP的服务器中有几个服务器的事件和连接事件,当我们搞懂它们的意思才能更好地进行编程,服务器事件有listening、connection、close和error,分别表示监听、连接、关闭和发生错误,而连接事件有data、end、connect、drain、error、close和timeout,分别表示事件传递的数据、服务器或者客户端发送了FIN数据、套接字和服务器端连接成功、任意一端调用write()发送数据、发生异常、套接字完全关闭和连接被闲置。
UDP又称数据包协议,UDP和TCP最大的不同是UDP不是面向连接的,它一旦建立,所有的会话都基于连接完成,他的资源消耗低,处理快速而且灵活,适合在线视频传输等场景,偶尔丢包也影响不大。UDP套接字相对TCP套接字使用起来更简单,它只是一个EventEmitter的实例,而非Stream的实例,事件有四个:message、listening、close、error,分别表示接到携带的数据、开始监听、调用了close()方法和发生了异常。
HTTP的全称是超文本传输协议,HTTP构建在TCP之上,属于应用层协议。http模块将其封装成ServerRequest对象,请求报文头第一行HTTP/1.1被解析之后分解成下面的三个属性:req.method、req.url和req.httpVersion,分别表示请求方法(包括GET、POST、DELETE、PUT等)、链接和http版本1.1。至于响应,它封装了对底层连接的写操作,可以看成一个可写的流对象,通过调用res.write()和res.end()方法实现,res.write()表示正常写数据,res.write()表示发送信号告诉服务器这次响应结束。
HTTPS服务就是在HTTP之上加上TLS/SSL,生成了私钥和证书之后,我们在服务器设置多一个配置,就可以配置一个HTTPS服务器了,CA证书将证书颁发给服务器之后,证书在请求的过程中会被发送到客户端,客户端需要根据证书验证真伪,如果是知名的CA机构,它们的证书一般是预装在浏览器当中的,有了HTTPS可以令到数据在传输的过程中多一份保障。
Node.js提供了相对于底层的网络调用,以及基于事件的编程接口,使得开发者在这些模块上不需要再花过多的时间去研究,令到开发者可以更轻松地构建网络应用。