NODE 网络编程
Node是一个面向网络而生的平台,具有事件驱动、无阻塞、单线程等特性,具有良好的伸缩性,使得它十分轻量,适合在分布式网络中扮演各种各样的角色。
在Web领域中大多数的编程语言需要专门的web服务器作为容器,入ASP,ASP.NET需要IIS作为服务器,PHP需要搭载Apache或Nginx环境等,JSP需要Tomcat服务器等。对于Node而言,无需额外的容器。
Node提供了net、dgram、http、https 这4个模块,分别用于处理TCP、UDP、HTTP、HTTPS。
TCP
TCP面向连接的协议,传输之前需要进行3次握手形成会话,创建会话的过程中,服务器端和客户端分别提供一个套接字,这两个套接字共同形成一个连接。服务器端与客户端则通过套接字实现两者之间连接的操作。
注意,TCP针对网络中的小数据包有一定的优化策略:Nagle算法,针对每次发送小数据,要求等缓冲区的数据达到一定数量或者一定时间后才将其发出,以此来优化网络带宽。但数据有可能被延迟发送。
可以使用socket.setNoDelay(true)去掉Nagle算法
UDP
UDP中一个套接字可以与多个UDP服务通信。
HTTP
HTTP构建在TCP之上,属于应用层协议。
获取详情的HTTP报文采用的工具curl -v <url>
http 模块
Node的http模块包含对HTTP处理的封装。在Node中,HTTP服务器继承自TCP服务,它能够与多个客户端保持连接,由于采用事件驱动的形式,并不为每个连接创建额外的线程或进程,实现低内存高并发。
HTTP服务于TCP服务区别
在开启keepalive后,一个TCP会话可以用于多次请求和相应。TCP服务以connection为单位进行服务,HTTP服务以request为单位进行服务,Http模块将connection到request的过程进行了封装
http 模块将连接所用的套接字的读写抽象为ServerRequest 和 ServerResponse对象,它们分别对应请求和相应操作。在请求过程中,http模块拿到连接中传来的数据,调用二进制模块http_parser进行解析,在解析完请求报文的报头后,触发request事件,调用用户的业务逻辑
WebSocket服务
webSocket客户端基于事件的编程模型与Node中自定义事件相差无几。
WebSocket实现了客户端与服务器之间的长连接,而Node事件驱动的方式十分擅长与大量客户端保持高并发连接
WebSocket 与传统HTTP相比
客户端与服务器只建立一个TCP连接,可以使用更少的连接。
webSocket服务器端可以推送数据到客户端,这远比HTTP请求响应模式更灵活、更高效
有更轻量级的协议头,减少数据传送量。
相比HTTP,WebSocket更接近于传输层协议,它并没有在HTTP的基础上模拟服务器的推送,而是在TCP上定义独立的协议
Node没有内置WebSocket的库,WS模块封装了WebSocket的底层实现。Socker.io即是它的基础上构建实现的。
网络服务与安全
SSL(secure Sockets Layer安全套接字)SSL做为安全协议,它在传输层提供对网络连接加密的功能。对于应用层而言,他是透明的,数据在传输到应用层之前就已经完成了加密和解密过程。后IETF将其标准化称为TLS(Transport Layer security 安全传输层协议)
Node在网络安全上提供了3个模块,分别为crypto、tbs、https。
其中cryto主要用户加密解密,SHA1、MD5等加密算法。另外两个模块tls模块提供了与net模块类似的功能,区别在于它建立在TLS/SSL加密的TCP连接上。对于https而言,它完全与HTTP模块接口一致,区别在于它建立在安全的连接之上。
TLS/SSL
1.密钥 公钥/私钥结构 非对称结构,在建立安全传输之前,客户端和服务器之间需要互换公钥,进行加密,私钥进行解密。
出现的问题,中间人攻击
为了解决这个问题,数据传输的过程中需要对得到的公钥进行认证,以确认得到的公钥是出自目标服务器。TLS/SSL 引入了数字证书来进行认证。
数字证书中包含了,服务器的名称和主机名、服务器的公钥、签名颁发机构的名称、来自签名颁发机构的签名,在连接之前,会通过证书中的签名确认收到的公钥来自目标服务器,从而产生信任
HTTPS
HTTPS服务就是工作在TLS/SSL上的HTTP