网络编程使用Node可以很方便的搭建一个网络服务器。Node提供了net、dgram、http、https4个模块,分别用于处理TCP、UDP、HTTP、HTTPS,适用于服务端和客户端。1.构建TCP服务TCP服务在网络应用中非常普遍,大部分应用都是基于TCP构建的。1.1TCPTCP全称TransmissionControlProtocol,属于OSI模型中的传输层协议(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)。TCP是面向连接的协议,其显着特点是在传输前需要3次握手才能形成一个会话。只有在会话形成后,服务器和客户端才能相互发送数据。在创建会话的过程中,服务端和客户端分别提供一个套接字,这两个套接字共同构成一个连接。服务器和客户端通过套接字实现两者之间的操作。1.2创建TCP服务器可以通过net.createServer(listener)创建一个TCP服务器,监听器是连接事件连接的监听器。您可以使用Telnet工具作为客户端与创建的服务器进行通信。1.3TCP服务的事件TCP服务的事件分为服务器事件和连接事件。服务器事件是由net.createServer()创建的服务器的EventEmitter实例。自定义事件包括:listeningconnectioncloseerror连接事件服务器可以同时保持与多个客户端的连接,这是典型的每个连接可写可读的Stream对象。Stream对象可用于服务器和客户端之间的通信。它可以通过data事件从一端读取??数据,也可以通过write()方法从一端向另一端发送数据。自定义事件:dataendconnectdrainerrorclosetimeoutTCPsocket是一个可写可读的Stream对象,利用pipe()方法可以巧妙的实现管道操作。TCP对于网络中的小数据也有一定的优化策略:Nagle算法。Nagle算法:要求缓存中的数据达到一定数量或者一定时间后发送出去,所以小数据包会被Nagle算法合并,从而优化网络。尽管网络带宽得到有效利用,但数据可能会延迟发送。2、构造UDP服务UDP的全称是UserDatagramProtocol,与TCP一样属于网络传输层。UDP和TCP最大的区别是UDP不是面向连接的。2.1创建UDP套接字创建UDP套接字非常简单。UDP套接字一旦创建,就可以作为客户端发送数据或作为服务器接收数据。vardgram=rerquire('dgram');varsocket=dgram.createSocket("udp4");2.2创建一个UDP服务器如果你想让一个UDP套接字接收网络信息,只要调用dgram.bind(port,[address])方法绑定网卡和端口即可。创建UDP服务器示例:vardgram=require("dgram");varserver=dgram.createSocket("udp4");server.on("message",function(msg,rinfo){console.log("servergot:"+msg+"from"+rinfo.address+":"+rinfo.port);});server.on("listening",function(){varaddress=server.address();console.log("serverlistening"+address.address+":"+address.port);});server.bind(41234);2.3创建UDP客户端创建UDP客户端示例:vardgram=require('dgram');varmessage=newBuffer("Node.js简介");varclient=dgram.createSocket("udp4");client.send(message,0,message.length,41234,“localhost”,function(err,bytes){client.close();});2.4UDPsocket事件UDPsocket只是EventEmitter的一个实例。自定义事件:messagelisteningcloseerror3。构建HTTP服务Node提供了基础的http和https模块,用于HTTP和HTTPS的封装。HTTP服务器的实现:varhttp=require('http');http.createServer(function(req,res){res.writeHead(200,{'Content-Type':'text/plain'});res.end('HelloWorld\n');}).listen(1337,'127.0.0.1');console.log('服务器运行在http://127.0.0.1:1337/');3.1HTTPInitialHTTPHTTP的全称是超文本传输??协议(HyperTextTransferProtocol)。HTTP建立在TCP之上,属于应用层协议。HTTP报文HTTP是基于请求-响应类型,以问答的方式实现服务。HTTP服务只做两件事:处理HTTP请求和发送HTTP响应。无论是HTTP请求报文还是HTTP响应报文,报文内容都包含两部分:报文头和报文体。3.2HTTP模块Node的http模块包含用于HTTP处理的包装器。在Node中,HTTP服务继承自TCP服务器(net模块),可以与多个客户端保持连接。因为它采用了事件驱动的形式,不会为每个连接创建额外的线程或进程,并且保持非常低的内存占用,所以可以实现高并发。HTTP服务和TCP服务模型的区别在于,启用keepalive后,一个TCP会话可以用于多次请求和响应。TCP服务以连接为单位提供服务,HTTP服务以请求为单位提供服务。http模块将用于连接的socket的读写抽象为ServerRequest和ServerResponse对象,分别对应请求和响应操作。HTTP请求读取TCP连接,http模块封装为ServerRequest对象。HTTPResponseHTTP响应对象封装了对底层连接的写操作,可以看做是一个可写的流对象。响应后,HTTP服务器可能会使用当前连接进行下一次请求,或者关闭连接。HTTP服务事件HTTP服务也是一个EventEmitter实例:连接事件请求事件关闭事件checkContinue事件连接事件升级事件clientError事件3.3HTTPClient在文本的参与下,消息头和消息体由它生成。HTTP响应HTTP客户端在CLientRequest对象中,它的事件称为响应。HTTP代理http提供的ClientRequest对象是基于TCP层实现的。在保持活动的情况下,底层会话连接可用于多个请求。为了重用TCP连接,http模块包含一个默认的客户端代理对象http。globalAgent.t管理每个服务器(主机+端口)创建的连接。默认情况下,由ClientRequest对象向同一台服务器发起的HTTP请求最多可以创建5个连接。它的本质是一个连接池。当调用HTTP客户端同时向服务器发起10个请求时,本质上只有5个请求处于并发状态,后续的请求实际上是在服务完成后发出的。这与浏览器对同一域名的下载连接数有限制的行为相同。HTTP客户端事件响应socketupgradecontinue4.构建WebSocket服务WebSocket与Node配合完美的原因:WebSocket客户端的基于时间的编程模型与Node自定义事件几乎相同;WebSocket实现客户端与服务端Connection的长期通信,Node事件驱动的方式非常擅长为大量客户端维护高并发连接;WebSocket和传统HT??TP的好处:客户端和服务端只建立一个TCP连接,可以使用的连接更少;WebSocket服务端可以向客户端推送数据,远比HTTP请求响应方式灵活高效;有一个更轻的协议头,减少了数据传输量;使用WebSocket,Web客户端只需要一个TCP连接就可以完成双向通信。当服务端与客户端频繁通信时,不需要频繁断开连接重新发送请求。WebSocket与HTTP的区别:与HTTP相比,WebSocket更接近于传输层协议。它不是在HTTP的基础上模拟服务器端推送,而是定义在TCP上的一个独立的协议。WebSocket协议主要分为握手和数据传输两部分。4.1WebSocket握手WebSocket握手成功后,服务端和客户端的效果是一样的,都可以接收和发送消息。4.2WebSocket数据传输握手成功后,当前连接不再进行HTTP交互,而是启动WebSocket数据帧协议。实现客户端和服务器之间的数据交换。5.网络服务与安全5.1TLS/SSL密钥TLS/SSL是一种公钥/私钥结构,是一种非对称结构,每个服务器和客户端都有自己的公钥和私钥。公钥用于加密要传输的数据,私钥用于解密接收到的数据。公钥和私钥是配对的。用公钥加密的数据只能用私钥解密。因此,在建立安全传输之前,客户端和服务器需要交换公钥。客户端发送数据时,需要用服务器的公钥加密,而服务器发送数据时,需要客户端的公钥加密。公钥和私钥的非对称加密固然很好,但网络中仍然可能存在窃听行为。一个典型的例子就是中间人攻击。在客户端和服务器交换公钥的过程中,中间人对客户端扮演服务器的角色,对服务器扮演客户端的角色,所以客户端和服务器几乎感觉不到中间人的攻击。为了解决中间人攻击,需要在数据传输过程中对获取的公钥进行认证,以确认获取的公钥来自目标服务器。为了保证数据安全,数字证书引入了第三方:CA(CertificateAuthority,数字证书认证中心)。CA的作用是为站点签发证书,这个证书通过自己的公钥和私钥,有CA的签名。服务器为了获得签名证书,需要通过自己的私钥生成一个CSR(CertificateSigningRequest,证书签名请求)文件。CA机构会通过这个文件签发属于服务器的签名证书,证书只要通过CA机构就可以被验证。5.2TLS服务创建服务器TLSClient与普通的TCP服务器和客户端相比,TLS服务器和客户端仅证书配置不同,其他基本相同。5.3HTTPS服务HTTPS服务是工作在TLS/SSL上的HTTP。准备证书创建HTTPS服务HTTP客户端
