利用Node可以十分方便地搭建网络服务器。在Web领域,大多数的编程语言需要专门的Web服务器作为容器,如ASP、ASP.NET需要IIS作为服务器,PHP需要搭载Apache或Nginx环境等,JSP需要Tomcat服务器等。但对于Node而言,只需要几行代码即可构建服务器,无需额外的容器。
Node提供了net, dgram, http, https这4个模块,分别用于处理TCP, UDP, HTTP, HTTPS。适用于服务器端和客户端
7.1 构建TCP服务
7.2 构建UDP服务
7.3 构建HTTP服务
7.4 构建WebSocket服务
它与Node之间的配合堪称完美,其理由有两条:
- WebSocket客户端基于事件的编程模型与Node中自定义事件相差无几
- WebSocket实现了客户端与服务器端之间的长连接,而Node事件驱动的方式十分擅长与大量的客户端保存高并发连接
除此之外,WebSocket与传统HTTP有如下好处:
- 客户端与服务器端只建立一个TCP连接,可以使用更少的连接
- WebSocket服务器端可以推送数据到客户端,这远比HTTP请求响应模式更灵活、更高效。
- 有更轻量级的协议头,减少数据传送量。
WebSocket最早是作为HTML5重要特性而出现的
客户端的应用示例:
在WebSocket之前,网页客户端与服务器端进行通信最高效的是Comet技术。实现Comet技术的细节是采用长轮询或iframe流。长轮询的原理是客户端向服务器端发起请求,服务器端只在超时或有数据响应时断开连接;客户端在收到数据或者超时后重新发起请求。这个请求行为拖着长长的尾巴,是故用Coment(彗星)来命名它。
使用WebSocket的话,网页客户端只需一个TCP连接即可完成双向通信,在服务器端与客户端频繁通信时,无须频繁断开连接和重发请求。连接可以得到高效应用,编程模型也十分简洁。
相比HTTP,WebSocket更接近于传输层协议,它并没有在HTTP的基础上模拟服务器端的推送,而是在TCP上定义独立的协议。让人迷惑的部分在于WebSocket的握手部分是有HTTP完成的,使人觉得它可能是基于HTTP实现的。
协议主要分为两个部分:握手和数据传输。P182
握手:
数据传输:
7.5 网络服务与安全
明文传递是容易被监控,为此将数据加密后在传输,但是对于应用层协议而言,仍然希望能够透明地处理数据,而无须操心网络传输过程中的安全问题。
网景公司推出了SSL(安全套接层),对传输层加密, 随后IETF将其标准化,称为TLS(安全传输层协议)
Node在网络安全上提供了3个模块:
crypto:用于加密解码
tls模块:建立在TLS/SSL加密的TCP连接上
https:完全与http模块接口一致,只是建立在安全的连接上
TLS/SSL:
密钥:TLS/SSL是一个公钥/私钥的结构,它是一个非堆成的结构,每个服务器端和客户端都有自己的公私钥。公钥用来加密要传输的数据,私钥用来解密接收到的数据。公钥和私钥是配对的,通过公钥加密的数据,只有通过私钥才能解密,所以在建立安全传输之前,客户端和服务器端之间需要互换公钥。客户端发送数据是要通过服务器端的公钥进行加密,服务器端发送数据时则需要客户端的公钥进行加密,如此才能完成加密解密的过程。P187
为了解决出现中间人攻击(交换公钥的过程中)这种问题,数据传输过程中还需要对得到的公钥进行认证,以确认得到的公钥是出自目标服务器。
引入数字证书,包含了服务器的名称和主机名、服务器的公钥、签名颁发机构的名称、来自签名颁发机构的签名。在连接建立前,会通过证书中的签名确认收到的公钥是来自目标服务器的,从而产生信任关系。
数字证书:CA(数字证书认证中心)的作用是为站点颁发证书,且这个证书中具有CA通过自己的公钥和私钥实现的签名。
通过CA机构颁发证书通常是一个烦琐的过程,需要付出一定的精力和费用。对于中小型企业而言,多半是采用自签名证书来构建安全网络的。P188
CA机构将证书颁发给服务器端后,证书在请求的过程中会被发送给客户端,客户端需要通过CA的证书验证真伪。如果是知名的CA机构,它们的证书一般预装在浏览器中。如果是自己扮演CA机构,颁发自有签名证书则不能享受这个福利。
HTTPS服务:需要用到私钥和签名证书