简介
node具有事件驱动、无阻塞、单线程等特性,其搭建服务器的优势是:
- 具有良好的伸缩性,使得它十分轻量;
- 无需额外的容器,其他大多数的编程语言需要专门的web服务器做容器(PHP需要搭建Apache或Nginx环境,JSP需要Tomcat服务器等);
http服务器
-
http模块
HTTP服务继承自TCP服务器(net模块),它能与多个客户端保持连接,由于采用事件驱动,并不为每个连接创建额外的线程或进程,保持很低的内存占用,所以能实现高并发。HTTP服务以request为单位进行服务。
http模块将连接所用的套接字的读写抽象为ServerRequest和ServerResponse对象。
-
http请求:ServerRequest对象
该对象对于TCP连接的读操作,调用二进制模块http_parser进行解析,放置req.headers属性上,在解析完请求报文的报头后,触发request事件。
-
http响应:ServerResponse对象(可写流对象)
(1)报文头- res.setHeader():对报文头部信息进行设置;
- res.writeHead():该方法才会将报头写入连接中;
(2)报文体 - res.write()
- res.end():结束请求但未断开连接(否则客户端一直处于等待状态),先调用write()发送数据,再发送信号告知服务器这次响应结束;
注:报头在报文体发送前发送的,一旦开始了数据的发送,writeHead()和setHeader()将不再生效,调用res.end()结束响应后,Http服务器可能会将当前的连接用于下一个请求,或关闭请求(由keep-alive决定)。
4.http服务的事件
- connection事件:底层的TCP连接建立时,服务器触发一次connection事件,一次连接可以在多次请求响应之间使用(keep-alive);
- request事件:建立tcp连接后,http底层将在数据流中抽象出HTTP请求和HTTP响应,将请求数据发送到服务端,解析出HTTP请求头后,将会触发该事件,在res.end()后,TCP连接可能将用于下一次请求响应;
- close事件:当已有的连接都断开时,server.close()停止接受新的连接;
- checkContinue事件:客户端在发送较大的数据时,并不会将数据直接发送,而是先发送带Expect: 100-continue的一个头部请到服务器,触发该事件,该事件与request事件是互斥的:
- 服务器响应100 Continue的状态码表示接受大数据;
- 服务器响应400 Bad Request的状态码表示不接受大数据,拒绝客户端继续发送数据;
- upgrade事件:当客户端要去升级连接的协议时,在请求头中带上Upgrade字段,服务器端会在收到这样的请求时触发该事件。
http客户端
-
http客户端的构建:http.request(options, connect事件);
- options参数决定了http请求头中的内容;
- 报文体:内容由请求对象的write()(向连接中写入数据)和end()(告知报文结束)实现;
Ajax的实质就是一个异步的网络HTTP请求。
http代理
- http-globalAgent:http模块包含的默认客户端代理对象,在keep-alive—重用TCP连接情况下,对每个服务器端(host+port)创建的连接进行管理,实质是一个连接池,客户端对同一个服务器端发起的http请求最多可以创建5个连接—调用http客户端对同一个服务器发起10次请求时,其实质只有5个请求处于并发状态,后续的请求需要等待某个请求完成服务后才能真正发出;
3.http客户端事件
- response事件:与服务器端的request事件对应;
- socket事件:当底层连接池中建立的连接分配给当前请求对象时,触发该事件;
- connect事件:当客户端发起connect请求,服务器响应200状态码时,客户端触发该事件;
- continue事件:客户端向服务端发起Expect:100 continue头信息以试图发送较大数据量,若服务器响应100 continue状态时,客户端将触发该事件;
网络服务与安全
- TLS/SSL:公钥/私钥—非对称结构+数字证书,数据在传递到应用层之前就已经完成了加密和解密过程;
(1)密钥
- 公钥:加密要要传输的数据;
- 私钥:解密接收到的数据;
(2)数字证书:CA(数字证书认证中心,权威的第三方机构)为站点颁发证书—用户产生直接的密钥对,并将公钥和个人身份信息传送给认证机构,认证机构核实了用户身份后,将发给用户一个数字证书,其包含了用户个人信息和公钥信息,同时还有认证中心的签名信息。
- 数字签名:保证信件信息未被修改;
- 发件人使用Hash函数生成内容的摘要;
- 发件人用自己的私钥对摘要进行加密,从而生成数字签名;
- 数字证书:保证公钥是正确的;CA用自己的私钥对发件人的公钥和一些相关信息一起加密,生成数字证书;
因此,在建立安全传输之前,客户端和服务器之间需要互换公钥,通过证书中的签名确认收到的公钥来自于目标服务器且没有被修改过,产生信任关系,然后用对方的公钥加密后再传递数据,对方收到数据后可以用自己的私钥解密得到数据;